php некоторые разветвленные процессы продолжают работать - PullRequest
3 голосов
/ 21 февраля 2012

У меня есть скрипт php, который делит задачу на несколько частей и запускает каждую часть в отдельном дочернем процессе. Код выглядит так:

foreach($users as $k => $arr) {
  if(($pid = pcntl_fork()) === -1) continue;
  if($pid) {
      pcntl_wait($status,WNOHANG);
      continue;
  }
  ob_start();
  posix_setsid();
  dbConnect();
  // do stuff to data
  exit();
}

Я запускаю этот скрипт, используя crontab на сервере Debian, но проблема в том, что некоторые процессы продолжают работать и резервируют память. Через некоторое время память сервера затопляется. Мне нужно найти способ убедиться, что все процессы завершаются правильно.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2012

Я думаю, что проблема заключается в использовании WNOHANG в вызове pcntl_wait.Это означает, что функция pcntl_wait существует до дочернего процесса - что вы хотите, чтобы иметь возможность одновременно обрабатывать другие дочерние процессы.Но у этого есть побочный эффект, что основной родитель заканчивает раньше некоторых детей.Эта ссылка http://www.devshed.com/c/a/PHP/Managing-Standalone-Scripts-in-PHP/2/ описывает, как выполнить цикл pcntl_wait с WNOHANG до тех пор, пока все дочерние элементы не завершат работу.

0 голосов
/ 21 февраля 2012

То, что вы делаете с данными, занимает много времени или навсегда.Вам необходимо отладить выполняемые вами операции.

...