0

実行に最大 10 分かかるプロセスがいくつかある Web アプリがあります。場合によっては、これらのプロセスがユーザーによってトリガーされ、処理中に出力が必要になることがあります。

たとえば、ユーザーは必要ないくつかのレコードを探しています。ボタンをクリックしてレコードを取得します (この部分には 10 分かかる場合があります)。彼らは他の作業を続けることができますが、返品を表示するためにクリックして戻ると、レコードがシステムにダウンロードされると更新されます。

現在、プロセスの実行中はユーザーがロックされています。ユーザーが長いプロセスが完了するまで待つ必要がないように、子プロセスをフォークする pcntl_fork() について知っています。

フォークされたプロセスを変数でリクエストをトリガーした特定のユーザーに関連付けて$_SESSION、プロセスが完了したときにユーザーを更新できるかどうか疑問に思っていました。また、これは実行時間の長いプロセスでユーザーを更新する最良の方法ですか?

4

1 に答える 1

4

ギアマンはあなたのニーズに合っていると思います。ドキュメントから取得したこのサンプル コードを見てください。

<?php

/* create our object */
$gmclient= new GearmanClient();

/* add the default server */
$gmclient->addServer();

/* run reverse client */
$job_handle = $gmclient->doBackground("reverse", "this is a test");

if ($gmclient->returnCode() != GEARMAN_SUCCESS)
{
  echo "bad return code\n";
  exit;
}

$done = false;
do
{
   sleep(3);
   $stat = $gmclient->jobStatus($job_handle);
   if (!$stat[0]) // the job is known so it is not done
      $done = true;
   echo "Running: " . ($stat[1] ? "true" : "false") . ", numerator: " . $stat[2] . ", denomintor: " . $stat[3] . "\n";
}
while(!$done);

echo "done!\n";

?>

をセッションに保存する$job_handleと、サンプルを調整して制御スクリプトを作成できます。

于 2011-01-08T08:05:11.090 に答える