Tamamlamak için komut beklemeden shell_exec kullanmak için bir yolu var mı?

8 Cevap php

Ben arka planda çalıştırmak istiyorum bir süreç yoğun bir görev var.

Kullanıcının sayfaya tıkladığında, PHP komut dosyası çalışır ve gerekirse nihayet, bazı koşullara göre, o bir kabuk, EG çalıştırmak zorundadır:

shell_exec('php measurePerformance.php 47 844 email@yahoo.com');

Şu anda shell_exec, but Bu bir çıkış beklemek için komut dosyası gerektirir kullanın. Ben bunu tamamlamak için without bekleyen istediğiniz komutu çalıştırmak için herhangi bir yolu var mı?

8 Cevap

Nasıl ekleme hakkında.

"> /dev/null 2>/dev/null &"

shell_exec('php measurePerformance.php 47 844 email@yahoo.com > /dev/null 2>/dev/null &');

Bu da stdio ve stderr kurtulur Not.

Windows 2003, beklemeden başka bir komut dosyası aramak için, ben bu kullandı:

$commandString = "start /b c:\\php\\php.EXE C:\\Inetpub\\wwwroot\\mysite.com\\phpforktest.php --passmsg=$testmsg"; 
pclose(popen($commandString, 'r'));

Üzerine cmd.exe değişen izinler verdikten sonra bu sadece çalışır - Okuma ekleyebilir ve IUSR_YOURMACHINE (ben de Reddet yazma seti) için yürütün.

Bu komutu yürütmek ve çalışan işlemi kesilir. Tabii ki, istediğiniz herhangi bir komut olabilir. Ama test için, sen (20) o komut bir uyku ile bir php dosyası oluşturabilirsiniz.

exec("nohup /usr/bin/php -f sleep.php > /dev/null 2>&1 &");

Kullanım PHP'nin popen komutu, örneğin:

pclose(popen("start c:\wamp\bin\php.exe c:\wamp\www\script.php","r"));

Bu, bir çocuk süreç yaratacak ve komut çıktısı beklemeden arka planda excute olacaktır.

Bu işe ancak yeni bir işlemini arka planda çalışacak bu işlevi çağırmak her zaman yaratacaktır çünkü size sunucusu aşırı için dikkatli olmak gerekir. Aynı anda yalnızca tek bir eşzamanlı çağrı sonra bu geçici işi yapacağız.

Eğer değilse o zaman ben mesela beanstalkd / Gearman / amazon OKS için böyle bir ileti kuyruğu çalıştırmak için tavsiye ediyorum.

Bir web sayfası kapalı ise, ben (belki, bir dizinde bir dosya bırakarak) ve bir cron işi yapılması gereken iş almak zorunda bazı tür bir sinyal üreten öneririz. Aksi takdirde, biz pcntl_fork() ve exec(), bir Apache sürecinin içinden kullanarak topraklarına almak olasıdır, ve bu sadece kötü mojo bulunuyor.

Ayrıca anında geri müşteri için çıktı vermek ve sonradan PHP kodu işlemeye devam edebilirsiniz.

Bu benim istemci tarafında herhangi bir etkisi olmazdı uzun bekleme Ajax aramalar için kullanıyorum yöntem:

ob_end_clean();
ignore_user_abort();
ob_start();
header("Connection: close");
echo json_encode($out);
header("Content-Length: " . ob_get_length());
ob_end_flush();
flush();
// execute your command here. client will not wait for response, it already has one above.

Sen detaylı açıklama burada bulabilirsiniz: http://oytun.co/response-now-process-later

Her zaman shell_exec () çağıran bir sayfa için bazı AJAX üzerinden sonrası olabilir.