2017-01-18 13 views
0

私はPHPでの応答送信の後にコールバック関数を実行しようとしています。 たとえば、JAVAでは、スレッドを使って作成しました。しかし、PHPの応答後、それはスクリプトのプロセスを終了します。私はpthreadsを実装しようとするだけでなく、あまりにも複雑です。私のコードでPHPで応答を送信した後に関数を実行する方法

if(isset($_REQUEST['x']) && $_REQUEST['x'] == "x") { 
    header('Content-type: application/json'); 
    $data = json_decode(file_get_contents('php://input'), TRUE); 
    if (!empty($data)) { 
     $request = new XRequest($data['params']); 
     $customParams = unserialize(file_get_contents('customParams')); 
     $customParams->callCallback($request); //Calling from another PHP class 
     echo(json_encode(array('status' => 'OK'))); 
    } 
} 

別のサーバから来る要求。私は最初のPHPエコー応答を開始したい応答を送信したいときに電話したい$customParams->callCallback($request);

どうすればいいですか?何か案は?

+0

問題が何か分かりません。設定した後で、 'var_dump($ customParams);'を追加できますか? – jeroen

+0

$ customParamsは、パブリックメソッドにアクセスするためのYClassを参照するオブジェクトです。 – mrpehlivan

+0

'$ data ['params']' – Kulvar

答えて

0

PHPの並行性モデルは単純で、複数のPHPスクリプトをWebサーバーで同時に実行できるという事実に基づいています。したがって、通常、これを実装する方法は次のとおりです。

  • コールバック関数の本体を独自の別のスクリプトに配置します。

  • 発信Web要求(cURLなどを使用)によって親スクリプトから呼び出します。ある

は、ユーザーがWebブラウザに2つのURLを順番に開いていただけであるかのように、最初のPHPスクリプト要求(おそらく)同じWebサーバー上のURLで秒を持っています。こうすることで、2番目のスクリプトは最初のスクリプトが応答を完了して終了した後も実行を続けることができます。

より洗練されたアプローチは、第二のPHPスクリプトは、独自のプロセスで別個に連続して実行するように作られている場合、XML-RPCApache Thriftなどのmessage queuesまたはremote-procedure callメカニズムを含む、可能です。しかし、私はこれがあなたがしようとしていることに十分であると思います。

0

PHPでは、ボトムコードを使用して私の問題を解決しました。しかし、fastcgi_finish_requestに注意してください。これで私のサーバーは最初の応答を停止してコールバックを開始することはできません。

ありがとうございました。

ob_start(); 
// Send your response. 
echo json_encode(array('status' => 'ok')) ; 

// Get the size of the output. 
$size = ob_get_length(); 

// Disable compression (in case content length is compressed). 
header("Content-Encoding: none"); 
header($_SERVER["SERVER_PROTOCOL"] . " 202 Accepted"); 
header("Status: 202 Accepted"); 
// Set the content length of the response. 
header("Content-Length: {$size}"); 

// Close the connection. 
header("Connection: close"); 
ignore_user_abort(true); 
set_time_limit(0); 

// Flush all output. 
ob_end_flush(); 
ob_flush(); 
flush(); 
session_write_close(); 
fastcgi_finish_request(); 
// Do processing here 
sleep(5); 
callBackAfterResponse(); 
関連する問題