Ajax / PHP - ben bir uzun çalışan bir komut dosyası veya yoklama kullanmalıyım?

4 Cevap php

Ben ajax başladı bir PHP komut dosyası var. Bu PHP script kabuk aracılığıyla ayrı bir PHP komut dosyası çalıştırmak için () exec kullanır.

) Exec (via denir komut tamamlanması 30 saniye kadar sürebilir. Ben bitmiş bir kez UI güncellemeniz gerekir.

Bu seçeneklerden hangisi tercih edilir?

a) Leave the HTTP connection open for the 30 seconds and wait for it to finish.
b) Have exec() run the PHP script in the background and then use ajax polling to check for completion (every 5 seconds or so).
c) Something else that I haven't thought of.

Teşekkürler, Brian

4 Cevap

Güncellemeleri birkaç saniye için sunucuyu yoklamak. Bunun için açık uzun bir süre bağlantı terk ettiklerinde sunucuya ya da tarayıcı (HTTP isteği çok uzun sürerse tarayıcılar zaman aşımı) azalarak olabileceği ihtimali her zaman var.

Seçenek b) bana biraz fazla durum bilgisi hissediyor. Sunucu need else 30 saniye kez yapılır bir istek, kötü bir devlet içine alır almak mı? Eğer öyleyse (bu kaynakları veya benzeri bir şey bırakmadığından gibi), kesinlikle galiba) bir ile gitmek.

C) gelince, belki Browser-Server Diaglog altındaki AJAX Pattern's Web Site üzerine bir şeyler bulacaksınız.

AJAX seçeneği bana iyi görünüyor. Bir alternatif gerekli trafiğini en aza indirmek için Comet (Ajax itin) tarzı: bir şey (update UI) söylemek zorunda kaldığında Server istemci (tarayıcı) için sinyal gönderir.

a) could have problems with timeout and locks server requests (usually you set limit server accepts connections). you could lock the server if many users add requests on the server. on http environment i would only keep open connections as long as necessary.

b) if it is 30 seconds long i would poll not so often like each second. i would increase the polling time. is the execution time always 30 seconds? example polling style (payload is json):


# trigger job/execution
POST /job
=> response gives 301 redirect to /jobs/{job-id}

# polling
GET /jobs/{job-id}
=> {status:busy}
or
=> {status:completed,result:...}
 

ama sonunda o probleme bağlıdır, i b) daha fazla gibi ama uygulamak için daha fazla çaba ekler. belki daha fazla ayrıntı var? Bir yüksek trafik senaryo?