2011-07-24 11 views
6

Ben 2 koleksiyonları var 'İmleç bulunamadı'MongoDB - - PHP MongoCursorException

bir zaman
  • ~% 60 her kayıt üzerinde
    1. döngüler, bu B bir findOne (kullanarak _ID)
    2. bazı temel matematik yapar, bir php dizi oluşturma yapar

    bir bütün dokümanlar üzerinde döngü bittikten sonra: PHP ölümcül hatayı: php dizisi

    5) üzerinde

    4) döngü toplama C içine Upsert (1), ben sürekli olsun sırasında

    Yakalanmayan istisna mesajı ile 'MongoCursorException' 'İmleç bulunamadı' işlenmiş son öğe kodunda hiçbir değişiklik olmadan, yeniden Running 3872494.

    real 1m25.478s 
    user 0m0.076s 
    sys  0m0.064s 
    

    içinde 8187 oldu, istisna madde at # atıldı 19826/3872495

    real 3m19.144s 
    user 0m0.120s 
    sys  0m0.072s 
    

    Ve yine, # 8181/

    real 1m31.110s 
    user 0m0.036s 
    sys  0m0.048s 
    

    Evet, ben (ve muhtemelen olmalı) istisna yakalamak farkında ... ama ... neden bile 387249 atılıyor? Özellikle veritabanına bu kadar farklı geçen zaman/derinlikte.

    Yardımcı olurum, kurulumum 3 düğümü çoğaltma kümesidir (2 + arb). İkincil çevrimdışı aldım ve sadece birincil koşma ile çalıştı. Aynı sonuçlar (farklı sonuç sayısı ve zamanlar, ancak her zaman İmleç Bulunamadı istisnasını atar).

  • +0

    nihayetinde imleç-zaman aşımı sorunu bu oldu mu? Teşekkürler – mils

    cevap

    0

    Bir bellek sınırı sorunu olabilir. Daha fazla bellek sağlayarak denemeyi deneyin ve sonuçlarınızın değişiklik gösterip göstermediğini görün, bunu -d seçeneği ile yapabilirsiniz: php -d memory_limit = 256M yourscript.php

    Bu bir çok belgedir ve size oldukça geniş bir nesne dizisi yapmak. Ayrıca bellek ayırma zamanını xdebug veya ne zend sağlar gibi hata ayıklama uzantıları yanı sıra çalışma zamanında bellek ayırmak için kullanabileceğiniz gibi çeşitli php işlevleri vardır.

    9

    Yes, I realize that I can (and probably should) catch the exception...

    Evet, kesinlikle yapmanız gereken ilk şey budur. Bir istisnanın gerçekleşmesi için düzinelerce meşru neden var? Heck, birincil devre dışı kaldığında ve ulaşılamaz hale geldiğinde ne olacağını düşünüyorsun?

    ... why is it even being thrown?

    Bazı olası nedenler var, ancak gördüğünüz hata koduna doğrudan keselim.

    • Resmi PHP belgeleri: here.
    • Bu sayfadan alıntı: Sürücü, veritabanından daha fazla sonuç almaya çalışıyordu, ancak veritabanında bir sorgu kaydı yok. Bu genellikle imlecin sunucu tarafında zaman aşımına uğradığı anlamına gelir ...

      • Bağlantı zaman aşımı Bir imleç zaman aşımı düşüyoruz

    • İmleç zaman aşımı:

    MongoDB PHP sürücüsü iki farklı zaman aşımına sahiptir. DB'ye bağlanabilirsiniz, ancak sorgunuz "zaman tükeniyor".

    Olası düzeltmeler:

    1. imleci timeout uzatın. Ya da sıfıra ayarlayabilir ve sonsuza kadar sürebilirsin.
    2. Bu işi toplu olarak yapın. A'dan ilk 1000 _ids'u alın, bunları işleyin ve sonra yaptığınızı işaretleyin. Sonra bir sonraki 1000 _ids'unuzu son koşunuzdan daha büyük ve daha büyük olsun.

    Ben özel durum işleme ile birlikte 2. öneririm. Bunlar problemi tamamen çözmese bile problemi izole etmenize ve azaltmanıza yardımcı olacaktır.

    +1

    imleç zaman aşımı sorunumu çözdü (2k kayıtları alındıktan sonra zaman aşımı) –

    4

    Geç olduğunu biliyorum ve bu çözümünüzü olmayabilir ama ölümsüz kullanmayı deneyebilirsiniz(). Gates VP'nin belirttiği gibi, this page istisnayı açıklar.

    The driver was trying to fetch more results from the database, but the database did not have a record of the query. This usually means that the cursor timed out on the server side: after a few minutes of inactivity, the database will kill a cursor (see MongoCursor::immortal() for information on preventing this).

    Ben bu sayfaya ulaştıktan diğerleri için ve zaman aşımı() ve() ölümsüz farklı olduğundan tüm açıklamalar sonrası düşündüm. timeout(), bir yanıt için beklenecek süreyi ayarlar. ölümsüz() imleci hareketsizlik nedeniyle ölmekten alıkoyur.