我有一个PHP网站,我想在后台执行一个很长的Python脚本(300 MB内存和100秒)。进程通信是通过数据库完成的:当Python脚本完成其工作时,它会更新数据库中的字段,然后网站会根据Python脚本的结果呈现一些图形。
我可以从bash(任何当前目录)“手动”执行Python脚本,并且它可以工作。我想将它集成到PHP中,我尝试了函数shell_exec:
shell_exec("python /full/path/to/my/script")
但它不起作用(我没有看到任何输出)
您有任何想法或建议吗?值得一提的是,python脚本是其他多语言工具(Java与C ++混合)的包装。
谢谢!
答案 0 :(得分:3)
shell_exec返回一个字符串,如果你单独运行它就不会产生任何输出,所以你可以写:
$output = shell_exec(...);
print $output;
答案 1 :(得分:1)
首先关闭set_time_limit(0);将使您的脚本永远运行,因此超时应该不是问题。 PHP中的第二个* exec调用默认情况下不使用PATH(可能取决于配置),因此您的脚本将退出而不提供有关该问题的任何信息,并且它经常最终导致无法找到该程序,在这种情况下python。所以改成它:
shell_exec("/full/path/to/python /full/path/to/my/script");
如果你的python脚本自己运行没有问题,那很可能就是这个问题。至于内存,我很确定PHP不会使用相同的内存python正在使用。因此,如果它使用300MB PHP应保持默认值(比如1MB)并等待shell_exec结束。
答案 2 :(得分:0)
问题可能是您的脚本花费的时间超过了为请求定义的服务器等待时间(可以在php.ini或httpd.conf中设置)。
另一个问题可能是服务器帐户无权执行或访问脚本运行所需的代码或文件。
答案 3 :(得分:0)
之前找到了这个并帮助我解决了我的后台执行问题:
function background_exec($command)
{
if(substr(php_uname(), 0, 7) == 'Windows')
{
pclose(popen('start "background_exec" ' . $command, 'r'));
}
else
{
exec($command . ' > /dev/null &');
}
}
来源:
http://www.warpturn.com/execute-a-background-process-on-windows-and-linux-with-php/
答案 4 :(得分:0)
感谢您的回答,但没有一个能够工作:(。我决定以肮脏的方式实施,使用忙碌的等待,而不是在插入记录时触发事件。
我编写了一个永久运行的备份过程,并在每次迭代检查数据库中是否有新内容。当它找到一条记录时,它会执行脚本,一切都很好。我的想法是从shell启动备份过程。
答案 5 :(得分:0)
我发现我尝试这个问题的原因很简单,我没有在运行它的服务器上编译源代码。通过在本地计算机上进行编译然后上传到服务器,它将以某种方式损坏。 shell_exec()应该通过编译您尝试在运行脚本的同一服务器上运行的源来工作。