разветвление PHP-процесса и привязка к конкретному веб-пользователю - PullRequest
0 голосов
/ 08 января 2011

У меня есть веб-приложение, в котором есть несколько процессов, выполнение которых может занять до 10 минут. Иногда эти процессы запускаются пользователем, и они нуждаются в выводе по мере его обработки.

Например, пользователь ищет несколько записей, которые им нужны. нажмите кнопку, чтобы получить записи (это та часть, которая может займет 10 минут). Они могут продолжить работать над другими вещами, но когда они нажмите, чтобы просмотреть результаты, это обновляется по мере загрузки записей в систему.

В данный момент пользователь заблокирован во время выполнения процесса. Я знаю о pcntl_fork (), чтобы разветвлять дочерний процесс, чтобы пользователю не приходилось ждать завершения длинного процесса.

Мне было интересно, можно ли привязать этот разветвленный процесс к конкретному пользователю, который вызвал запрос в переменной $_SESSION, чтобы я мог обновить пользователя после завершения процесса. Кроме того, это лучший способ обновить пользователя в длительном процессе?

1 Ответ

4 голосов
/ 08 января 2011

Я думаю Шестерня соответствует вашим потребностям.Посмотрите на этот пример кода, взятый из документа:

<?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 в сеансе, вы можете адаптировать образец для создания управляющего сценария.

...