【发布时间】:2011-07-14 09:36:26
【问题描述】:
我尝试在后台运行 php 进程并从 php 文件启动它。
一些信息:PHP 版本 5.2.17,php safe_mode 已关闭,linux 系统。我用 exec 开始这个过程,已经尝试过 shell_exec。我将所有文件设置为 0755、0777。
$pid = exec("nohup $cmd > /dev/null 2> /dev/null & echo $!");
如果我打印这个语句,我会得到这个并且 pid 没问题:
nohup /usr/local/bin/php5 /.../../file.php > /dev/null 2> /dev/null & echo $!
如果我在 ssh 下查找进程
top
我看到我的 php5 进程具有正确的 pid。用户是root
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3533 xxxxxxxx 20 0 21356 8868 4580 S 0 0.4 0:00.13 php5
3536 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
3539 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
3542 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
3545 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
3548 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
3551 xxxxxxxx 20 0 20836 8260 4428 S 0 0.4 0:00.09 php5
如果我启动流程手册顶部看起来像这样:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
8141 xxxxxxxx 22 2 24048 9.9m 5344 S 10 0.5 0:00.31 php5
问题: 似乎什么也没发生。为了调试一点,我在文件中写了一个输出
ob_start();
echo "STARTING...";
writeLog(ob_get_contents());
//...
function writeLog($info){
$handle = fopen("file.log", "a+");
fwrite($handle, $info);
fclose($handle);
}
exit;
我的文件中没有日志。如果我在浏览器中启动此文件,它会正确处理并获取带有“调试”信息的 file.log。
为什么这在浏览器中运行而不是在 exec/shell_exec 命令上运行??!我有这些具有正确 pid 的 php 进程,但没有结果。
非常感谢您的帮助!
【问题讨论】:
-
您应该首先尝试为您尝试执行的脚本提供一个绝对路径,而不是您现在似乎正在做的相对路径。 IE。使用
nohup /usr/local/bin/php5 /absolute/path/to/file.php > /dev/null 2> /dev/null & echo $! -
我有这个文件的绝对路径。我可以从 ssh 中的每个目录启动这个 nohup。它的工作。不幸的是,没有 php。
-
那么可能是权限问题。因此,请检查您的日志(Apache、php 错误日志、控制台日志)...如果您正在运行 AppArmor/SELinux,请尝试将其关闭以测试您是否需要更改安全策略以允许这些后台任务。
标签: php process background cron nohup