Итак, вот небольшая информация о моей настройке. Запуск 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 >/dev/null &]
Это то, что должно было запустить этот конкретный искатель снова, но поскольку он был «неспособен», он никогда не перезапускался, и исходный экземпляр искателя заканчивался, как обычно.
Очевидно, что это не проблема разрешения, потому что каждый из этих 21 скриптов-искателей запускает эту команду exec каждые 5 или 10 минут в конце ее запуска, и большую часть времени он работает так, как должен. Кажется, это происходит один или два раза в день. Кажется, что его предел какой-то степени, как я только недавно начал видеть, что это происходит с тех пор, как я добавил своего 21-го искателя. И его не всегда один и тот же искатель, который получает эту ошибку, будет в любой момент случайным временем, которое не сможет разблокировать команду перезапуска exec.
Кто-нибудь имеет представление о том, что может заставить php быть неспособным развить или, возможно, даже лучший способ справиться с этими процессами, чтобы обойти ошибку вместе? Есть ли предел процесса, который я должен изучить или что-то в этом роде? Заранее благодарим за помощь!
«Есть ли предел процесса, который я должен изучить»
Подозрительно, что кто-то (системный администратор?) Ограничил 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
память, чтобы узнать, попадает ли она в низкие сотни. Если это так, вам нужно будет найти способ запустить программу, а потребитель – меньше памяти.