Сервис Интернет Объявлений

 
29
Январь
2013

Параллельные (фоновые) процессы в PHP




Фоновое, параллельное, многопоточное и т.д. выполнение процессов в PHP нужно в том случае, когда процесс достаточно длительный, а пользователь торопливый, и ждать выполнение процесса не собирается.

Второе применение — системные ответы платежным системам об успешности операции. В данном случае при длительной обработке запроса (записи в БД, отправка письма, СМС…), удаленный сервер может и не дождаться своевременного ответа (в виде сгенерированной страницы) и свалиться в таймаут.

Порывшись в интернетах и перебрав массу вариантов, я пришел к следующему решению.

Берем функцию:

function launchBackgroundProcess($call,$file=false,$errors=false)
{
      if (PHP_OS == 'WINNT' || PHP_OS == 'WIN32')
      {
      $handle=popen('start /MIN '.$call, "r");
      if($handle===false)
      trigger_error("Can't start process $call",E_USER_ERROR);
      else pclose($handle);
      }
      else{
      $add = "";
      if($file===false){
      $file = '/dev/null';
      }
      if($errors!==false){
      $add = " 2> ".$errors;
      }
      exec($cmd = ($call.' > '.$file.$add.' &'));
      }
}

И обращаемся к ней:

launchBackgroundProcess('wget http://yoursite.com/yourfile.php');

В файле http://yoursite.com/yourfile.php находятся все хроноемкие процессы, которые нужно выполнить в фоне, но результат которых уже не будет возвращен в сформированную страницу.
Причем, можно передавать GET-параметры:

launchBackgroundProcess('wget http://yoursite.com/yourfile.php?param1=val1');

Учтите, что функция exec() очень часто пребывает в отключенном состоянии из-за режима безопасности на вашем хостинге. Если не работает — пишите в саппорт.

Posted in: Wordpress's, На заметку

Читайте далее:

Trackback from your site.

Leave a comment

Security Code: