Bir PHP sistem çağrısı ile bir Java programını arıyorum. Java programının çalışması biraz zaman alır, ancak sonunda bilinen bir dosya adına sahip bir PDF dosyası oluşturur. Var olana kadar bu dosyayı denetlemeye devam etmeli ve sonra ona bir bağlantı sunmam gerekir. Süresiz bir döngü olacağına inanıyorum ama çok yoğun bir kaynak olmasını istemiyorum. Bunu yapmanın iyi bir yolu nedir?Bir dosyayı buluncaya kadar denetlemeye devam edin, daha sonra bir bağlantı sağlayın.
cevap
Temelde anladın doğru
while (!file_exists($filename)) sleep(1);
print '<a href="'.$filename.'">download PDF</a>';
geri tarayıcıya göndermek gerekiyorsa hiçbir şey
Bu, işi yapacak ancak ek bir zaman aşımı belirtebilirsiniz.
while(!file_exists($pathToFile))
{
sleep(1);
}
için CPU stres etmeyecek şekilde uyku kontrolleri arasında 1 saniye verir muhtemelen bir setInterval zamanlayıcıda bir AJAX çağrısı ve dosyaların varlığını kontrol eden bir PHP betiğini kullanarak araştırmanız gerekir. Bunu iki şekilde yapabilirsiniz: geri anket işlemek için bir AJAX fonksiyonlu tarayıcı anket tarafı için AJAX kullanarak bir yoklama işlemini başlatır JavaScipt içeren tarayıcı ve PHP betiğinize
flush()
html.flush()
işe yaramazsa, Java işleminizin ayarlanmasından ÖNCE PHP betiğinizin HTML'sini döndürmeniz gerekir. Bu kodda iki AJAX çağrısı koydu. Gerçek Java sürecini başlatan ve dosyayı arayan bir sorgulama hizmetini başlatan biri. Eğer Java sürecinden uyumsuz çalışması için tarayıcı gereken muhtemel nedeni budur Java uygulaması, bir yanıt almak için önce
Uzun koşu komut tarayıcı zaman aşımı olabilir. Buna söz vermedi
$nofileexists = true;
while($nofilexists) { // loop until your file is there
$nofileexists = checkFileExists(); //check to see if your file is there
sleep(5); //sleeps for X seconds, in this case 5 before running the loop again
}
: Öte yandan
, saf PHP çalıştıran bu takdirde veya Java süreci tipik bir tarayıcı zaman aşımı azdır, sadece böyle bir şey kullanabilirsiniz yüksek trafik çağrısı (çok sayıda genel kullanıcı için) veya raporlama tipi bir uygulama olacaktır. Yüksek trafik varsa, AJAX rotasını öneriyorum, ancak düşük trafik varsa, o zaman yukarıdaki kod.