PHP Предупреждение: exec () не может работать с fork

Итак, вот небольшая информация о моей настройке. Запуск Centos с apache и php 5.2.17. У меня есть веб-сайт, на котором перечислены продукты со многих сайтов розничной торговли. У меня есть сценарии сканера, которые запускаются для захвата продуктов с каждого веб-сайта. Поскольку каждый веб-сайт отличается, каждый сценарий искателя должен быть настроен для сканирования определенного веб-сайта розничной торговли. Так что в основном у меня есть 1 гусеничный ход на одного продавца. В это время у меня есть 21 сканер, который постоянно работает, чтобы собирать и обновлять продукты с этих сайтов. Каждый искатель является php-файлом, и как только PHP-скрипт выполняется, он проверяет, чтобы убедиться, что он единственный экземпляр сам, и в самом конце скрипта он использует exec, чтобы начать все сначала, пока оригинальный экземпляр закрывается. Это помогает защитить от утечек памяти, поскольку каждый искатель перезагружается, прежде чем он закроется. Однако в последнее время я проверю скрипты сканера и заметлю, что один из них больше не работает, и в журнале ошибок я обнаружил следующее.

PHP Warning: exec() [<a href='function.exec'>function.exec</a>]: Unable to fork [nice -n 20 php -q /home/blahblah/crawler_script.php &gt;/dev/null &amp;] 

Это то, что должно было запустить этот конкретный искатель снова, но поскольку он был «неспособен», он никогда не перезапускался, и исходный экземпляр искателя заканчивался, как обычно.

Очевидно, что это не проблема разрешения, потому что каждый из этих 21 скриптов-искателей запускает эту команду exec каждые 5 или 10 минут в конце ее запуска, и большую часть времени он работает так, как должен. Кажется, это происходит один или два раза в день. Кажется, что его предел какой-то степени, как я только недавно начал видеть, что это происходит с тех пор, как я добавил своего 21-го искателя. И его не всегда один и тот же искатель, который получает эту ошибку, будет в любой момент случайным временем, которое не сможет разблокировать команду перезапуска exec.

Кто-нибудь имеет представление о том, что может заставить php быть неспособным развить или, возможно, даже лучший способ справиться с этими процессами, чтобы обойти ошибку вместе? Есть ли предел процесса, который я должен изучить или что-то в этом роде? Заранее благодарим за помощь!

Related of "PHP Предупреждение: exec () не может работать с fork"

Лимит процесса

«Есть ли предел процесса, который я должен изучить»

Подозрительно, что кто-то (системный администратор?) Ограничил max user process по соображениям безопасности. Вы могли бы попробовать это?

 $ ulimit -a .... .... max user processes (-u) 16384 .... 

пожалуйста, запустите предыдущую команду внутри PHP примерно так:

 echo system("ulimit -a"); 

Я искал, имеет ли php.ini или httpd.conf такое ограничение, но я не смог его найти.

Обработка ошибок

«даже лучший способ справиться с этими процессами, чтобы обойти ошибку вместе? »

Третий параметр exec() возвращает код выхода $cmd . 0 для успеха, не равным нулю для кода ошибки ошибки. обратитесь к http://php.net/function.exec

 exec($cmd, &$output, &$return_val); if ($ret_val != 0) { // do stuff here } else { echo "success\n"; } 

В моем случае (большой набор тестов PHPUnit) он сказал бы, что unable to fork только процесс достигнет 57% использования памяти. Итак, еще одна вещь, на которую нужно следить, это может быть не предел процесса, а память.

Для всех, кто сталкивается с этой проблемой, это может быть несколько проблем, как указано в ответе на этот вопрос.

Однако моя проблема заключалась в том, что у моего пользователя nginx не было надлежащей оболочки для выполнения команд, которые я хотел. Добавление .bashrc в домашний каталог пользователя nginx устранило это.

Я столкнулся с той же проблемой, и я попробовал это, и это сработало для меня;

 ulimit -n 4096 

Проблема часто вызвана системой или процессом или исчерпанием доступной памяти. Убедитесь, что у вас достаточно, запустив free -m . Вы получите следующий результат:

total used free shared buffers cached Mem: 7985 7722 262 19 189 803 -/+ buffers/cache: 6729 1255 Swap: 0 0 0

Буфера / кеш-строка – это то, что вы хотите посмотреть. Обратите внимание: свободная память составляет 1255 МБ на этой машине. Когда вы запускаете свою программу, продолжайте пытаться free -m и проверьте free память, чтобы узнать, попадает ли она в низкие сотни. Если это так, вам нужно будет найти способ запустить программу, а потребитель – меньше памяти.