php asenkron çağrı ve arka plan işten yanıt almak

4 Cevap php

Ben bu konu hakkında bazı google arama yaptım ve sorumun cevabını bulamadım.

Ne elde etmek istiyorum şudur:

  1. istemci sunucu bir işlev için bir zaman uyumsuz çağrı yapmak
  2. (bu fonksiyon zaman alıcı olduğundan), sunucu arka planda bu fonksiyonu çalışır ve istemci arada asılı değil
  3. istemci sürekli plan işin statüsü talep sunucuya bir çağrı yapmak

Eğer bana sorunu çözme bazı tavsiyeler verebilir misiniz?

Thank you very much! ^ - ^

4 Cevap

Uzun süren php süreçleri için bir google var (- Pekka ile anılan notu dahil - konuyla ilgili orada kötü bir tavsiye çok şey var uyardı bu Microsoft çalışacak ama başka bir şeyde unpredicatable şekilde başarısız olur).

Acheiving bazı basit yolları bu kullanmak Aleksey Zapparov Soket sunucu (http://www.phpclasses.org/browse/package olacak - Bir soket üzerinde istekleri (istemci bağlamak için fsockopen kullanmak istiyorsunuz) yanıt veren bir hizmet geliştirmek olabilir / 5758.html) bu da pek çok işleme requiers şey için çok uygun olmayabilir, tek bir iş parçacığı olarak çalışır beri ancak soketi üzerinden gelen istekleri işleyen. Eğer Microsoft olmayan bir sistemi kullanıyorsanız Alternatif olarak, o yo komut kapalı asmak olabilir [x] ancak inetd, ne zaman, istemci keser sonlandırma bunu önlemek için bazı akıllı şeyler yapmak gerekir.

Daha sonra PHP kodu, yeni bir süreç grubundaki bir süreç Spawn (web sunucusu üzerinden değil) bağımsız PHP yürütülebilir çalışan (posix_setsid (bkz.) ve pcntl_fork ()) gerekmektedir istemci keser sonra çalışan şeyi tutmak için. Geri gelmek için istemciyi etkinleştirmek ve ilerleme kontrol etmek, bunu başarmak için en kolay yolu bir yere istemci okuyabilir onun durumunu yazmak için sunucuyu yapılandırmak için.

C.

You are not specifying what language the asynchronous call is in, but I'm assuming PHP on both ends. I think the most elegant way would be this:

  • HTML sayfası yükler, operasyon için rasgele bir anahtar tanımlar (rand() kullanarak, örneğin ya da zaten mevcut oturum kimliği [dikkatli olmak aynı kullanıcı iki işlemleri başlangıç ​​olabilir bu olsa])

  • HTML sayfa start_process.php PHP komut dosyası için Ajax arama yapar

  • start_process.php yürütür exec /path/to/scriptname.php işlemini başlatmak için; bakın User Contributed Notes on exec() arka planda bir süreci başlatmak için nasıl önerileri. Biri sizin için doğru olan, sizin işletim esas olarak bağlıdır.

  • long_process.php sık sık Ajax sayfasında oluşturulan rasgele anahtarın adını bir durum dosyası, içine kendi durumunu yazıyor

  • HTML sayfa show_status.php bu durum dosyasını okur ve ilerleme döner sık ​​sık arama yapar.

  1. Ajax arama çalışma yöntemi longRunningMethod () ve bir idendifier geri almak (örneğin bir id)
  2. Sunucu yöntemini çalıştırır ve örneğin anahtarını ayarlar sharedmem
  3. Müşteri checkTask çağırır (id)
  4. server lookup the key in sharedmem and check for ready status [repeat 3 & 4 until 5 is finished]
  5. longRunningMethod bitmiş ve sharedmem içinde bitmiş durumunu ayarlar.

Tüm Ajax aramalar tanımı asenkron başınadır.

(Değil kesinlikle gerekli bir adım olmasına rağmen) çağrıyı örneğini AJAX kullanabilirsiniz, ve komut dosyası daha sonra paylaşılan bellek (veya bir SQL tablosu bile geçici bir giriş, hatta bir temp arka işin durumuna bir başvuru oluşturabilir özel bir iş numarasını şeklinde) dosya.

Komut daha sonra arka plan işlemi başlaması ve hemen müşteriye iş kimliğini geri dönebilirler.

İstemci daha sonra, örneğin, işin durumunu sorgulamak için (örneğin, başka bir AJAX arayüzü ile) defalarca sunucu diyebiliriz "Ilerleme", "tam".

Yürütülecek arka plan işlemi PHP (örneğin, bir komut satırı PHP script) yazılı kendisi ise, ona iş id geçebileceği ve anlamlı ilerleme aynı paylaşılan bellek alanına yazarak (geri istemci güncelleştirmelerini sağlayabilir veya veritabanı tablo).

Süreci PHP ile yazılmış kendisi değil idam eğer o zaman ben yürütülen süreç çalışmasını tamamladığında izlemek (ve başarılı olup olmadığını görmek için çıkış kontrol) ve durumunu güncelleştirmek böylece bir komut satırı PHP komut dosyası sararak önermek uygun bu görev için giriş.

Not: Bu ortak bellek kullanımı en iyi uygulama olduğunu, ancak paylaşılan hosting kullanıyorsanız, örneğin mevcut olmayabilir. Eski durum girdileri temizlemek için bir araç istiyorum unutmayın, bu yüzden örneğin bir completed_on damgası var (her biri için / "completed_on" damgaları değerleri "started_on" saklamak, ve bayat veri girişlerini silmek olurdu Ayrıca bir süre önce başladı ama tamamlandı olarak işaretlenen asla işleri denetler ve) onlar hakkında bir uyarı yükseltir ki, ideal, ve - X dakika daha.