caller.php
とtask.php
という2つのPHPスクリプトがあります。以下のコードのようなcaller.php
jQueryのAjaxリクエストし、その後caller.php
がバックグラウンドでPHPファイルを実行するプロセスを開始して呼び出されたproc_open()の直後にPHPが返されない
jQueryのAjaxリクエスト
var xhr = $.ajax({
url: "https://www.example.com/caller.php",
type: "post",
data: ""
}).done(function(){}
});
Caller.php
$cmd = 'php task.php &'; // To call task.php in background
$descriptorspec = array(
0 => array('pipe', 'r'), // STDIN
1 => array('pipe', 'w'), // STDOUT
2 => array('pipe', 'w') // STDERR
);
$pipes = array();
$process = proc_open($cmd, $descriptorspec, $pipes);
do {
// get the pid of the child process and it's exit code
$status = proc_get_status($process);
} while($status['running'] !== FALSE);
$pid = $status['pid'];
$exitcode = $status['exitcode'];
proc_close($process);
if($exitcode == 0){echo 'Task.php is running.';}
私は上記のコードをRunning a php script via ajax, but only if it is not already runningから学んだ
上記のコードは完璧ですが、task.php
が完了しないうちにproc_open()
が待っています。私はtask.php
をバックグラウンドで実行し、caller.php
からすぐに応答します。
exec()
とshell_exec()
でも試してみましたが、それ以外はうまくいきませんでした。彼らは完全な仕事をしてから応答するためにtask.php
を待つ。
私はまた、ajaxの応答を残すだけで、xhr.abort()
を試しましたが、後で私はxhr.abort()
がサーバーとの接続を閉じないことを発見しました。
コードをトリムし、コードを短くするために基本的なセッションとユーザーのログインなどの手順を削除しました。
P.S.私は等を可能にするための十分な権限/無効PHPの機能を持っているので、VPSを持って
あなたのコマンドの最後に&を置くと、これはバックグラウンドで動作するようになりますが、あなたが追加したdo whileループはスクリプトのcaller.phpをブロックするものだと思います。 あなたはあなたのajaxにステータスを返すだけで、テストを行うことができます。 –
@seifeddineBesbes私はあなたが正しいと思います。私はそれを確認することができます保持してください。 –
@seifeddineBesbes Nop。これはdo-whileブロックを削除して応答を直接入力しても動作しません。 –