2017-07-11 14 views
0

caller.phptask.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を持って

+0

あなたのコマンドの最後に&を置くと、これはバックグラウンドで動作するようになりますが、あなたが追加したdo whileループはスクリプトのcaller.phpをブロックするものだと思います。 あなたはあなたのajaxにステータスを返すだけで、テストを行うことができます。 –

+0

@seifeddineBesbes私はあなたが正しいと思います。私はそれを確認することができます保持してください。 –

+0

@seifeddineBesbes Nop。これはdo-whileブロックを削除して応答を直接入力しても動作しません。 –

答えて

0

[OK]を私はyou'rは、例えば、AJAXにステータスを返すようにフラッシュ()ステートメントを行方不明だと思う:

do { 
    // get the pid of the child process and it's exit code 
    $status = proc_get_status($process); 
    echo $status['running']; 
    ob_flush();flush(); // Send output to browser immediately 

} while($status['running'] !== FALSE); 

ob_flush()とflush()を使用すると、done関数ではなくxhr.onprogressイベントで結果が得られることを覚えておいてください。https://www.sitepoint.com/php-streaming-output-buffering-explained/

希望します。

+0

Nopが機能していません。 –

+0

私は自分の回答を編集し、あなたに役立つ例のリンクを追加しました。 –

+0

作業していません:(:( –

関連する問題