PHP:待機中のスクリプトに情報を返して処理を続ける方法


6

Requester.phpとProvider.phpの2つのスクリプトがあり、リクエスタがプロバイダからの処理を必要とし、http要求を出したとします(Provider.php?data = "データ")。この状況では、プロバイダは迅速に答えを見つけますが、システム全体を維持するために、データベース全体でさまざまな更新を実行する必要があります。すぐに値をリクエスタに戻し、プロバイダで処理を続ける方法はありますか。

擬コード

Provider.php 
{ 
    $answer = getAnswer($_GET['data']); 
    echo $answer; 
    //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
    processDBUpdates(); 
    return; 
} 
1

基本的に1つのプロセスの終了(元のRequester.phpに戻る)と新しいプロセス(終了Provider.php)を通知する必要があります。おそらくこれを取り除くよりエレガントな方法がありますが、これをいくつかの方法で管理しています。それらのすべては、基本的に、第2のプロセスを外すためのコマンドを実行します。あなたのコマンドの最後に次の> /dev/null 2>&1 &を追加

は、次のようなものがあなたのために働くことがあり、それはあなたの現在のスクリプトの実際の実行を阻害することなくバックグラウンドで実行できるようになります:

exec("wget -O - \"$url\" > /dev/null 2>&1 &"); 

- あなたはコマンドラインPHPプロセスとしてもそれを行うことができます。

処理が必要な情報を保存し、残りの処理をcronジョブで処理して、同じ種類の機能を再作成することもできます。


2

あなたはフラッシュ()コマンドを使用して、出力バッファをフラッシュすることができます。
は2で詳細は


0

スプリットプロバイダをPHP manualのコメントを読む:ProviderCoreProviderInterfaceを。 ProviderInterfaceでは、「迅速かつ簡単」な部分を実行するだけでなく、最近のリクエストがまだ処理されていないというフラグをデータベースに保存します。そのフラグを検索して処理を完了するcronジョブとしてProviderCoreを実行します。何もしなければ、ProviderCoreは終了し、2分で再試行します。


1

データを送信する(必ずフラッシュしてください)必要があると思うし、リクエスタでfopen/freadを使用してデータ量を読み込むと、接続をプロバイダと継続します。期待するデータ量を指定しなければ、リクエスタが接続を閉じるのを待っているリクエスタがそこに座っていると思うでしょう。これは接続が終了するまで起こらないかもしれません(つまり、すべてのセカンダリ作業が集中しますタスクは完了しました)。あなたはいくつかのPOCを試してみる必要があります。

幸運。


2

私はthis codeをバックグラウンドでプロセスを実行するために使用します(Linuxで動作します)。

プロセスは実行され、その出力はファイルにリダイレクトされます。

このように、プロセスのステータスを表示する必要がある場合、出力ファイルの内容を読み込んで表示するために少量のコードを書くだけです。

私はこの方法が好きです。これは、ブラウザを完全に終了し、後で状況を確認するために簡単に戻ることができるためです。


0

ここで私は外に出ていますが、おそらくあなたはcURLを試すか、ソケットを使ってリクエスタを更新する必要がありますか?


0

あなたはpcntl_fork()

Provider.php 
{ 
    // Fork process 
    $pid = pcntl_fork(); 

    // You are now running both a daemon process and the parent process 
    // through the rest of the code below 

    if ($pid > 0) { 
     // PARENT Process 
     $answer = getAnswer($_GET['data']); 
     echo $answer;  
     //SIGNAL TO REQUESTER THAT WE ARE FINISHED 
     return; 
    } 

    if ($pid == 0) { 
     // DAEMON Process 
     processDBUpdates(); 
     return; 
    } 

    // If you get here the daemon process failed to start 
    handleDaemonErrorCondition(); 
    return; 

} 
を使用してProvider.phpで別のPHPのプロセスを開始することができます