Arka plan işlemi için PHP exec () dönüş değeri (linux)

3 Cevap php

Linux üzerinde PHP kullanarak, ben exec kullanarak bir kabuk komut çalıştırma () başarıyla çalıştırıldı olup olmadığını belirlemek istiyorum. Ben 0 başarılı bir dönüş değeri kontrol etmek için return_var parametresini kullanıyorum. Ben arka planda çalıştırmak için olan bir süreç için aynı şeyi yapmak için ihtiyacınız olana kadar gayet iyi çalışır. Örneğin, aşağıdaki komut $ sonucu 0 döndürür:

exec('badcommand > /dev/null 2>&1 &', $output, $result);

Ben bilerek oraya yönlendirme koyduk, ben herhangi bir çıkış yakalamak istemiyorum. Ben sadece komut başarıyla yürütülen olduğunu bilmek istiyorum. Bunu yapmak mümkün mü?

Teşekkürler, Brian

3 Cevap

Benim tahminim ne yapmaya çalışıyorsun doğrudan mümkün değildir olmasıdır. Bir sonuç varsa önce sürecini arkatasar ederek, (potansiyel çıkış ve) PHP komut devam icar edilir.

Etrafında bir iş sadece komut yürütme yapar ve bir geçici dosyaya sonucu yazar, ikinci bir PHP (veya Bash / vb) komut sahip olmaktır.

Ana betik gibi bir şey olurdu:

$resultFile = '/tmp/result001';
touch($resultFile);
exec('php command_runner.php '.escapeshellarg($resultFile).' > /dev/null 2>&1 &');

// do other stuff...    

// Sometime later when you want to check the result...
while (!strlen(file_get_contents($resultFile))) {
    sleep(5);
}
$result = intval(file_get_contents($resultFile));
unlink($resultFile);

Ve command_runner.php gibi görünecektir:

$outputFile = $argv[0];
exec('badcommand > /dev/null 2>&1', $output, $result);
file_put_contents($outputFile, $result);

Onun güzel, ve orada sağlamlık ekleme ve eşzamanlı infazları ele oda kesinlikle, ama genel bir fikir çalışması gerekir değil.

Exec () yöntemini kullanarak değil. Eğer arka plan için bir süreç gönderdiğinizde, nihai sonucu almak için hiçbir yolu yoktur, bu exec çağrısı 0 döner ve php yürütülmesine devam edecektir.

pcntl_fork() however will fork your application, so you can run exec() in the child process and leave it waiting until it finishes. Then exit() with the status the exec call returned. In the parent process you can access that return code with pcntl_waitpid()

Sadece benim 2 sent, nasıl || veya && bash operatörü hakkında?

exec('ls && touch /tmp/res_ok || touch /tmp/res_bad');

Ve sonra dosya varlığını kontrol edin.