2011-01-08 6 views
0

웹 애플리케이션에 몇 가지 프로세스가 있으며 실행하는 데 최대 10 분이 걸릴 수 있습니다. 때로는 이러한 프로세스가 사용자에 의해 트리거되고 프로세스가 처리 될 때 출력이 필요할 수 있습니다.php 프로세스를 포킹하고 특정 웹 사용자와 연결

예를 들어, 사용자는 필요한 레코드 몇 개를 찾고 있습니다. 단추를 클릭하여 레코드를 검색하십시오 (이 부분은 이 10 분이 소요될 수 있음). 그들은 계속 다른 일을 할 수 있지만 그들이 반환을 보려면 클릭하십시오 레코드가 시스템에 다운로드로 업데이 트되었습니다.

지금은 프로세스가 실행되는 동안 사용자가 잠깁니다. 나는 긴 프로세스가 완료 될 때까지 기다리지 않아도되도록 자식 프로세스를 포크하는 pcntl_fork()에 대해 알고있다.

$_SESSION 변수에서 요청을 트리거 한 특정 사용자에게 해당 분기 된 프로세스를 묶어서 프로세스가 완료 될 때 사용자를 업데이트 할 수 있는지 궁금합니다. 또한 장기 실행 프로세스에서 사용자를 업데이트하는 가장 좋은 방법입니까?

+0

나는 그 상황에서'pcntl_fork'가 사용되어서는 안된다고 생각합니다. 포크 프로세스 및 멀티 스레드 웹 서버는 문제가있는 것으로 알려져 있습니다. 웹 응용 프로그램의 경우 AJAX를 사용하여 브라우저에 비동기 업데이트를 보낼 수 있습니다. – netcoder

답변

4

내 생각에 gearman이 적합하다고 생각합니다. 다큐먼트에서 촬영이 샘플 코드, 봐 : 당신이 세션에서 $job_handle를 저장하는 경우

<?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"; 

?> 

, 당신은 제어 스크립트를 만들기 위해 샘플을 적용 할 수 있습니다.

+0

굉장한, 나는 아마 더 좋은 길이있다라는 것을 알고 있었다. 그러나 나는 결코 Gearman에 대해 듣지 않고 있었다. – Patrick

+0

+1 Gearman. –

관련 문제