PHP memcached: getDelayed &

2 Cevap php

Ben PHP uygulamasında getDelayed ve getMulti nasıl kullanılacağı hakkında biraz son zamanlarda düşünce ve onların fark var.

GetDelayed ilgili belgeleri okuma:

"The method does not wait for response and returns right away. When you are ready to collect the items, call either Memcached::fetch or Memcached::fetchAll."

So obviously there's a need to call fetchAll before having the keys available, unlike getMulti. But when is the actual memcached call being done? At fetchAll or when getDelayed is run?

Örneğin ile güncellendi:

    $this->memcached->set('int', 99);
    $this->memcached->set('string', 'a simple string');
    $this->memcached->set('array', array(11, 12));

    $this->memcached->getDelayed(array('int'));
    $this->memcached->getDelayed(array('string'));
    $this->memcached->getDelayed(array('array'));

    print("<pre>".print_r( $this->memcached->fetchAll() )."</pre>"); // returns the array element only.

2 Cevap

Memcache IO ya getDelayed veya fetchAll olur.

getDelayed temelde "Ben bu tuşları istiyorum gidiyorum ama şimdi onlara ihtiyacım yok" diyor.

Bunun ana parası PHP bir paralel işlem olarak arka planda bunu yapmak için izin verir. Eğer bir süreç içinde daha sonra ihtiyacımız olacak hangi tuşları biliyorsanız, gidip onları almak için PHP sorabilir ve onlara size çağrı gerekir ne zaman fetchAll.

PHP fetchAll çağırdığınızda, başka şeyler yapıyor ederken veri elde etmeyi başarmış, hiçbir bekleme var. Değil varsa Memcached veri aktarılıyor tamamlarken, süreç duraklar.

Yapmanız gereken iki şey olsaydı çok saçma bir örnek:

  1. 3 saniye sürmüştür bir görüntüyü yeniden boyutlandırmak.
  2. 2 saniye sürmüştür bir memcache 100 değerleri alın.

Sadece görüntüyü resized ve sonra kullanıldığı takdirde getMulti, bu 5 saniye alacaktı.

Eğer tuşları için getDelayed olarak adlandırılan, daha sonra görüntüyü yeniden boyutlandırılır ve sonra el fetchAll, her şey sadece 3 saniye sürer.

O zaman arasında arka planda yapılıyor. Eğer getDelayed çağırdığınızda Temelde, onu bu tuşlara istediği sunucuda memcache müşteri söyler, ve daha sonraki bir noktada onları geri almak için olacaktır. Yani PHP komut memcache müşteri getirme yürütür iken istediğini yapmak serbesttir. Bunları gerektiğinde Ardından, fetchAll diyoruz. Eğer fetchAll çağırdığınızda tüm veriler zaten varsa, hemen döner. Değil, tüm veri hazır olana kadar, bu engeller.

getMulti ve fetchAll hem blocking aramalarıdır. Onlar dönmek için tüm verilere sahip dek bekleyin. (ihtiyacınız olduğunda daha sonra verileri "çekme" çünkü) getDelayed bu veri veya varsa onu hemen olursa olsun verdiğini, sigara-engelleme olduğunu.

Eğer getDelayed kullanmak neden bir örnek, bunun gibi bir şey olurdu: Eğer memcached (mesela bir render html sayfa) bir büyük nesne ihtiyacımız olacak bildiğiniz bir uygulama var varsayalım. En kısa sürede size ihtiyacınız olacak bildiğiniz gibi getDelayed arayabilirsiniz. Sonra, her şey yapılır, daha sonra aslında komut içine veri almak için fetchAll arayabilirsiniz vb uygulama temizleme, ya da günlük veya başlıkları, tüm işleyebilir. Her şey zaten yapılır yana, yapmanız gereken tüm verileri yankı ve ölmek.