私はUbuntu13.04でこのコードを使用しています。
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
実際には20秒間そこにとどまり、待機しますが:/通常&
、プロセスをバックグラウンドに送信するために使用する場合は正常に機能しますが、このマシンではphpはそれを実行しません:/
これを引き起こしている可能性がありますか?
私はUbuntu13.04でこのコードを使用しています。
$cmd = "sleep 20 &> /dev/null &";
exec($cmd, $output);
実際には20秒間そこにとどまり、待機しますが:/通常&
、プロセスをバックグラウンドに送信するために使用する場合は正常に機能しますが、このマシンではphpはそれを実行しません:/
これを引き起こしている可能性がありますか?
試す
<?PHP
$cmd = '/bin/sleep';
$args = array('20');
$pid=pcntl_fork();
if($pid==0)
{
posix_setsid();
pcntl_exec($cmd,$args,$_ENV);
// child becomes the standalone detached process
}
echo "DONE\n";
私はそれが機能するかどうかをテストしました。ここでは、最初にphpプロセスをフォークしてから、タスクを実行します。
または、pcntlモジュールが使用できない場合:
<?PHP
$cmd = "sleep 20 &> /dev/null &";
exec('/bin/bash -c "' . addslashes($cmd) . '"');
これが機能しない理由はexec()
、渡した文字列を実行するためです。シェルによって「バックグラウンドで実行」として解釈されますが、呼び出しで&
シェルを実行しないため、実行可能ファイルに渡されるだけです。おそらくそれは無視されます。exec
&
20
/bin/sleep
同じことが出力のリダイレクトにも当てはまります。これは、execではなくシェルによっても解析されるためです。
したがって、(上記のように)プロセスをフォークする方法、またはサブプロセスをシェルとして実行する方法を見つける必要があります。
Apache2と任意のバージョンのPHPを使用してubuntu13.04でこれを行うための回避策:
libssh2-php
、 PHPを使用nohup $cmd &
してローカルSSHセッション内で使用し、バックグラウンドで問題なく実行しました。もちろん、これには、有効化などの特定のセキュリティプロトコルを設定する必要があります。 WebサーバーユーザーのSSHアクセス。これにより、execのような権限が付与され、localhostのみがWebサーバーのsshアカウントにログインできるようになります。