2013-01-02 25 views
10

php ve while döngüsüne sahip bir sunucu gönderimli olay senaryosu oluşturmuştum, senaryonun kapanmaya devam etmek zorunda kalmasını istemedim ve bir süre döngü içine koydum.Sunucu Gönderilen Olayları PHP'de nasıl uygularım?

Sorun, komut dosyasının takılı kaldığı ve bu rotayı terk etmem gerektiğiydi ve bunun yerine bir node.js websocket arka uçıyla gittim.

Sorum, bir sunucuya etkinlik php komut dosyası göndermeye devam ettiysem, bunu nasıl uygularım?
while döngüler, komut dosyasını askıya aldığı için kesmiyor gibi görünmüyor ve eğer her saniye bağlantı ve bağlantı kesiliyorsa, uzun yoklamadan farklı değil, aynı zamanda askıda olmayacak bir PHP betiğini nasıl oluşturabilirim? SSE mesajlarını göndermek?

+0

Döngüleri gevşetmek için bir 'sleep()' koyabilirsiniz. – Musa

+0

@Musa Bunu boşuna yaptım. Hala asılıydı. – Neal

+0

bir seçenek değil mi? –

cevap

5

Php çıktı arabelleklemede sorun yaşadınız görünüyor. senin while döngünün sonuna bu satırı eklemeyi deneyin:

ob_flush(); 
flush(); 

Bu çıkış belleğe alma devre dışı bırakmalısınız. Sunucu yükünü azaltmak için betiği bir süre sonra (yani 10 dakika sonra) sonlandırabilirsiniz.

Bunu kolayca yapabilmeniz için bir kitaplık oluşturdum. here'u kontrol edin.

İkinci Düzenleme böyle nginx veya vernik gibi bir ters vekil var mı? Bunun nedeni proxy'nin çıktının içeriğini önbelleğe almaya çalışmasıdır, ancak SSE betiği, siz durdurulana kadar hiçbir zaman bitmeyecektir. Çıktıyı yakalayan diğer şeyler, mod_deflate gibi benzer sonuçlara sahip olabilir.

Üçüncü düzenleme bir ters vekil varsa, SSE çalışmasını sağlamak için önbelleğe alma özelliğini kapatmak için deneyebilirsiniz.

PHP'de çıktı arabelleklemeyi devre dışı bırakmanın başka yolları vardır. Aşağıdaki kod bölümüne bakın:

<?php 
for($i=0;$i<ob_get_level();$i++){ 
    ob_end_flush(); 
} 
@apache_setenv('no-gzip',1); 
@ini_set('implict_flush',1); 
ob_implict_flush(true); 
+1

Bu, benzer bir soruya verdiğim bir yanıtla tutarlıdır: http://stackoverflow.com/questions/7469396/how-to-implement-event-listening-in-php/8660897#8660897 – igorw

İlgili konular