2011-01-08 7 views
0

ウェブアプリケーションにはいくつかのプロセスがあり、実行には最大10分かかることがあります。場合によっては、これらのプロセスはユーザーによってトリガーされ、処理されるときに出力が必要になることがあります。phpプロセスをフォークして特定のウェブユーザーと結ぶ

例えば、ユーザーは、必要な数のレコードを 探しています。 ボタンをクリックして レコードを取得します(これは に10分かかります)。彼らは を他のものに取り組むことができますが、 をクリックすると返品を見ることができます。 が更新され、レコードは としてシステムにダウンロードされます。

今のところ、プロセスの実行中にユーザーがロックされます。子プロセスをフォークするpcntl_fork()について知っているので、長いプロセスが完了するまで待つ必要はありません。

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

+0

私は 'pcntl_fork'をその文脈で使うべきではないと思います。フォークプロセスとマルチスレッドWebサーバーは問題があることが知られています。 Webアプリケーションの場合は、代わりにAJAXを使用して非同期アップデートをブラウザに送信することができます。 – netcoder

答えて

4

私はgearmanがあなたのニーズに合っていると思います。 DOCから取られたこのサンプルコード、見て:

<?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を保存する場合は、制御スクリプトを作成するために、サンプルを適応させることができます。

+0

素晴らしい、私はおそらくより良い方法があることを知っていたが、私は前にGearmanについて聞いたことがない。 Gearmanの場合は – Patrick

+0

+1です。 –

関連する問題