Во-первых, я я далеко не эксперт по Linux, так что это может быть проблемой здесь, но в любом случае, к проблеме:
я следовал тому, что написано здесь :http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html
, чтобы запустить долгий -работающий процесс PHP. Это безупречно работает в моей конфигурации MAMP на моем Mac. Однако, как только я развернул его на нашем VPS, я получил действительно странные результаты.
Итак, сначала я делаю простой тест, используя SSH-соединение.:
echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes
Результат:
warning: commands will be executed using /bin/sh
job 2300 at 2012-04-29 19:24
И действительно, через 2 минуты выполняется php-скрипт. Все идет нормально.
Затем я пробую следующий подход:
в своем браузере я открываю:
www.myserver.com/Update/LaunchUpdates.php
этот php-скрипт содержит строку:
exec("echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes");
Происходит следующее :Я проверяю состояние -l и вижу :
job 2304 at 2012-04-29 19:32
. Затем жду 2 минуты и снова запускаю -l. Я ожидаю увидеть пустой результат, но вместо этого получаю :
job 2305 at 2012-04-29 19:34
, а через 2 минуты получаю
job 2306 at 2012-04-29 19:36
. У меня нет ни малейшего представления о том, что там происходит. PHP-скрипт не выполняется, и задание, похоже, перепланируется через 2 минуты. И так продолжается до тех пор, пока я не приступаю к работе.
Кто-нибудь знает, что происходит?
Еще немного информации:
cat /etc/*-release
Gentoo Base System version 1.6.14
Еще немного информации. Вот содержимое задания at, когда оно запланировано:(в -c [ID])
#!/bin/sh
# atrun uid=1002 gid=100
# mail user 1
umask 33
SERVER_SIGNATURE=\Apache/2.2.20\ \(Unix\)\ mod_ssl/2.2.20\ OpenSSL/0.9.8o\ Server\ at\ xxx.yyyyy.com\ Port\ 80\"
"; export SERVER_SIGNATURE
HTTP_USER_AGENT=Mozilla/5.0\ \(Macintosh\;\ Intel\ Mac\ OS\ X\ 10_7_3\)\ AppleWebKit/534.55.3\ \(KHTML,\ like\ Gecko\)\ Version/5.1.5\ Safari/534.55.3; export HTTP_USER_AGENT
HTTP_HOST=xxx.yyyyy.com; export HTTP_HOST
SERVER_PORT=80; export SERVER_PORT
DOCUMENT_ROOT=/home/user/www; export DOCUMENT_ROOT
SCRIPT_FILENAME=/home/user/www/Update/LaunchUpdates.php; export SCRIPT_FILENAME
REQUEST_URI=/Update/LaunchUpdates.php; export REQUEST_URI
SCRIPT_NAME=/Update/LaunchUpdates.php; export SCRIPT_NAME
HTTP_CONNECTION=keep-alive; export HTTP_CONNECTION
REMOTE_PORT=36291; export REMOTE_PORT
PATH=/bin:/usr/bin; export PATH
PWD=/home/user/www/Update; export PWD
SERVER_ADMIN=webmaster@abcdef.com; export SERVER_ADMIN
REDIRECT_STATUS=200; export REDIRECT_STATUS
HTTP_ACCEPT_LANGUAGE=en-us; export HTTP_ACCEPT_LANGUAGE
HTTP_ACCEPT=text/html,application/xhtml+xml,application/xml\;q=0.9,\*/\*\;q=0.8; export HTTP_ACCEPT
REMOTE_ADDR=83.101.41.41; export REMOTE_ADDR
SHLVL=764; export SHLVL
SERVER_NAME=xxx.yyyyy.com; export SERVER_NAME
SERVER_SOFTWARE=Apache/2.2.20\ \(Unix\)\ mod_ssl/2.2.20\ OpenSSL/0.9.8o; export SERVER_SOFTWARE
QUERY_STRING=; export QUERY_STRING
SERVER_ADDR=1.2.3.4; export SERVER_ADDR
GATEWAY_INTERFACE=CGI/1.1; export GATEWAY_INTERFACE
SERVER_PROTOCOL=HTTP/1.1; export SERVER_PROTOCOL
HTTP_ACCEPT_ENCODING=gzip,\ deflate; export HTTP_ACCEPT_ENCODING
REQUEST_METHOD=GET; export REQUEST_METHOD
cd /home/user/www/Update || {
echo 'Execution directory inaccessible' >&2
exit 1
}
/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;
При ожидании перепланирования задания через 2 минуты я получаю содержимое нового задания, и оно идентично, за исключением:
SHLVL=764, который стал SHLVL=765
Подробнее!
По предложению пользователя я попытался использовать nohup вместо at. Итак, я сделал следующее:
Сгенерировал команду для запуска nohup в файле.sh (с разрешениями на выполнение ).а затем выполнить exec ('nohup.....')
Я также добавил проверку в LaunchUpdates, чтобы убедиться, что он не вызывается снова до того, как пакет nohup завершит работу (Я в основном rm файл.sh и конец его пакета, и в LaunchUpdates я проверяю наличие этого файла ).
Итак, вкратце.
batchProcess.sh содержит:
/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;
rm /home/user/batchProcess.sh
мой php-код LaunchUpdates содержит:
$batchFile = "/home/user/batchProcess.sh";
if (file_exists($batchFile))
{
echo 'Process still running. Try again later!';
exit;
}
exec('nohup /home/user/batchProcess.sh > ~/process.out 2> ~/process.err < /dev/null &');
Ничего не происходит:
Я закомментировал строку exec в своем php-скрипте, чтобы файл не выполнялся, а генерировался. Я тестирую файл вручную, войдя в систему с помощью ssh, перейдя на пользователя «пользователь» и запустив:
nohup /home/user/batchProcess.sh > ~/process.out 2> ~/process.err < /dev/null &
все работает нормально (, и файл.sh удаляется в конце )!
Затем я раскомментирую строку exec и перезапущу php-скрипт. process.out содержит :
Process still running. Try again later!
. Это означает, что он снова выполняет базовый сценарий -, а не оператор exec??? Я ПОЛНОСТЬЮ потерялся здесь! Поскольку в обеих учетных записях я запускаю один и тот же сценарий bash, не может быть ошибки в отношении того, какие команды выполняются.
Должен ли я начать копаться в журналах Apache?
Это должно было занять мало времени, мальчик был я неправ....