PHP与shell_-exec

PHP与shell_-exec,php,debugging,Php,Debugging,我有一个PHP网站,我想在后台执行一个很长的Python脚本(300 MB内存和100秒)。过程通信通过数据库完成:当Python脚本完成其工作时,它更新数据库中的一个字段,然后网站根据Python脚本的结果呈现一些图形 我可以从bash(任何当前目录)中“手动”执行Python脚本,它可以正常工作。我想将其集成到PHP中,并尝试了函数shell_exec: shell\u exec(“python/full/path/to/my/script”)但它不工作(我看不到任何输出) 你有什么想法或建

我有一个PHP网站,我想在后台执行一个很长的Python脚本(300 MB内存和100秒)。过程通信通过数据库完成:当Python脚本完成其工作时,它更新数据库中的一个字段,然后网站根据Python脚本的结果呈现一些图形

我可以从bash(任何当前目录)中“手动”执行Python脚本,它可以正常工作。我想将其集成到PHP中,并尝试了函数shell_exec:

shell\u exec(“python/full/path/to/my/script”)
但它不工作(我看不到任何输出)

你有什么想法或建议吗?值得一提的是,python脚本是其他多语言工具(Java与C++混合)的包装器


谢谢

一个问题可能是脚本所花的时间比为请求定义的服务器等待时间长(可以在php.ini或httpd.conf中设置)

另一个问题可能是服务器帐户无权执行或访问脚本运行所需的代码或文件。

首先将使脚本永远运行,因此超时不应成为问题。第二,PHP中的任何*exec调用在默认情况下都不使用路径(可能取决于配置),因此您的脚本将在不提供任何有关问题的信息的情况下退出,并且通常会导致找不到程序(在本例中为python)。因此,将其更改为:

shell_exec("/full/path/to/python /full/path/to/my/script");

如果您的python脚本自己运行,没有问题,那么很可能就是这个问题。至于内存,我很确定PHP不会使用python使用的相同内存。因此,如果它使用的是300MB,PHP应该保持默认值(比如1MB),只需等待shell_exec的结束。

之前发现了这一点,并帮助我解决了后台执行问题:

function background_exec($command)
{
    if(substr(php_uname(), 0, 7) == 'Windows')
    {
        pclose(popen('start "background_exec" ' . $command, 'r'));
    }
    else
    {
        exec($command . ' > /dev/null &');
    }
}
资料来源:


谢谢你的回答,但没有一个有效:(.我决定以一种肮脏的方式实现,使用忙等待,而不是在插入记录时触发事件


我编写了一个永远运行的备份过程,每次迭代都会检查数据库中是否有新的内容。当它找到记录时,它会执行脚本,一切正常。我的想法是从shell启动备份过程。

shell\u exec返回一个字符串,如果单独运行它,它将不会产生任何输出,因此您可以编写:

$output = shell_exec(...);
print $output;

我在尝试此操作时发现问题很简单,我没有在运行它的服务器上编译源代码。通过在本地计算机上编译,然后上载到服务器,它将以某种方式损坏。shell_exec()应该通过编译您试图在运行脚本的同一服务器上运行的源代码来工作。

请包括更多详细信息,例如脚本将作为web进程运行,或通过命令行界面运行-简而言之,100秒,300Mb可能会超过允许的页面执行时间和内存-请阅读此内容-他说他正在使用shell_exec-所以我假设他正在使用脚本作为命令行工具脚本是一个命令行工具这里有一个技巧与您的问题没有直接关系,但可能很有用:如果这个脚本需要很长时间才能运行,您可以这样做以使它在后台运行:
shell_exec(“python/full/path/to/my/script>dev/null&”)
关于第一个问题,您是对的,但是如何从PHP启动后台作业?(另外,如何从命令行调试该作业,而不是从exec_shell调试该作业)好吧,你有一个脚本——当通过exec从php执行这个脚本时,你需要获得一些调试信息。为什么不在脚本中加入一些调试语句(写入STDERR或文件?)问题是调试信息模糊;我正在执行“黑盒”我改变了实现,现在一切都好了(检查我的答案)。我可能误读了主题,但如果你的脚本太长,可能会有所帮助