首先,我远离Linux专家,所以这可能是问题,但无论如何,问题是:
我按照这里写的内容:http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html
启动一个长期运行的PHP进程.这在我的Mac上的MAMP配置中完美无瑕.然而,一旦我将它部署到我们的VPS,我得到了一些非常奇怪的结果.
首先,我使用SSH连接进行简单的测试:
echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes
Run Code Online (Sandbox Code Playgroud)
结果:
warning: commands will be executed using /bin/sh
job 2300 at 2012-04-29 19:24
Run Code Online (Sandbox Code Playgroud)
事实上,2分钟后执行php脚本.到现在为止还挺好.
接下来我尝试以下方法:
在我的浏览器中我打开:
www.myserver.com/Update/LaunchUpdates.php
Run Code Online (Sandbox Code Playgroud)
这个php脚本包含以下行:
exec("echo '/usr/local/php53/bin/php -d memory_limit=512M -q /home/user/www/Update/Update.php;' | at now + 2minutes");
Run Code Online (Sandbox Code Playgroud)
会发生以下情况:我在-l处检查状态,我看到:
job 2304 at 2012-04-29 19:32
Run Code Online (Sandbox Code Playgroud)
然后我等了2分钟再次跑到-l.我希望看到一个空的结果,但我得到:
job 2305 at 2012-04-29 19:34
Run Code Online (Sandbox Code Playgroud)
2分钟后我得到了
job 2306 at 2012-04-29 19:36
Run Code Online (Sandbox Code Playgroud)
我对那里发生的事情一无所知.PHP脚本没有执行,工作似乎在2分钟后重新安排.这种情况一直持续到我工作为止.
有谁知道可能会发生什么?
更多信息:
cat /etc/*-release
Gentoo Base System version 1.6.14
Run Code Online (Sandbox Code Playgroud)
更多细节.以下是at job安排时的内容:( at -c [ID])
#!/bin/sh
# atrun uid=1002 gid=100
# mail user 1
umask 33
SERVER_SIGNATURE=\<address\>Apache/2.2.20\ \(Unix\)\ mod_ssl/2.2.20\ OpenSSL/0.9.8o\ Server\ at\ xxx.yyyyy.com\ Port\ 80\</address\>"
"; 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;
Run Code Online (Sandbox Code Playgroud)
在等待工作重新安排2分钟后,我得到新工作的内容,除了:
SHLVL = 764已成为SHLVL = 765
更多信息!
正如用户建议我尝试使用nohup而不是at.所以我做的是以下内容:
生成由.h文件中的nohup运行的命令(具有执行权限).然后做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
Run Code Online (Sandbox Code Playgroud)
我的LaunchUpdates php代码包含:
$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 &');
Run Code Online (Sandbox Code Playgroud)
没有发生什么:
我在我的php脚本中注释掉exec行,所以文件没有被执行但是生成了.我通过使用ssh登录手动测试文件,更改为用户"user"并运行:
nohup /home/user/batchProcess.sh > ~/process.out 2> ~/process.err < /dev/null &
Run Code Online (Sandbox Code Playgroud)
一切正常(最后删除.sh文件)!
接下来,我取消注释exec行并重新运行php脚本.process.out包含:
Process still running. Try again later!
Run Code Online (Sandbox Code Playgroud)
这意味着它再次执行基本脚本而不是exec语句??? 我完全迷失在这里!因为在两个帐户上我运行相同的bash脚本,所以执行什么命令都没有错误.
我应该开始挖掘apache日志吗?
这应该花很少的时间,男孩是我错了....
我假设您在运行时以 root 身份登录(或 uid PHP 在网络服务器中运行)at -l,并且作业与 uid PHP 在网络服务器中运行相关联?
但是,其他人可能正在访问该网页,因为新作业的添加间隔与初始运行的延迟相同,这让我认为 Update.php 可能正在调用命令来再次运行自身?