PHP exec()函数只运行极短的Python脚本

2024-05-19 02:56:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用PHP exec()函数时遇到一些问题。每当我尝试运行的脚本很短时,exec()就可以正常工作。但是如果脚本花费的时间超过一秒钟左右,它就会失败。注意,我尝试过在命令行手动运行长脚本,它工作得很好。如果运行的时间超过一秒钟,PHP解释器似乎正在杀死我的外部脚本。有什么想法或建议吗?这是我的代码:

<?php
    $fileName = "foobar.docx";
    $argVar = $fileName;
    exec("python3 /var/www/html/jan8/alexandrina.py /var/www/html/jan8/$argVar");
    echo "$output";
?>

这是我的剧本:

^{pr2}$

附加说明:我增加了php.ini中的max execution time limits,但我不认为这有什么关系,因为“长脚本”只需运行几秒钟。另外,当我提到“短脚本”和“长脚本”时,我实际上指的是同一个脚本。“长脚本”和“短脚本”的区别只是执行的时间,因为它可能会根据我请求脚本处理的文件的大小而有所不同。不管怎样。。。如有任何建议,我们将不胜感激!在


Tags: 函数命令行脚本varhtmlwww时间filename
2条回答

通常,php exec函数应该阻塞,直到您运行的命令完成为止。一、 例如,PHP脚本将停止,等待命令完成,直到继续执行脚本的其余部分。我有一半的想法认为您的服务器正在经历一个max_execution_time超时,但是您已经清楚地指出,即使是几秒钟也太长,甚至这些相当短的脚本也有问题。在

我想到了几个解决办法。最简单的方法是修改python命令,以便a)将任何输出路由到文件或输出流,b)进程在后台运行。根据docs on exec

If a program is started with this function, in order for it to continue running in the background, the output of the program must be redirected to a file or another output stream. Failing to do so will cause PHP to hang until the execution of the program ends.

我还希望您使用exec函数的两个附加可选参数。在

$fileName = "foobar.docx";
$argVar = $fileName;
$cmd = "python3 /var/www/html/jan8/alexandrina.py /var/www/html/jan8/$argVar";
// modify your command to toss output, background the process, and output the process id
$cmd_modified = $cmd . " >/dev/null & echo \$!";
$cmd_output = NULL; // this will be an array of output
$cmd_return_value = NULL; // this will be the return value of the script
exec($cmd_modified, $cmd_output, $cmd_return_value);
echo "exec has completed</br>";
echo "output:<br>" . print_r($cmd_output, TRUE) . "<br>";
echo "return value: " . print_r($cmd_return_value, TRUE);

这可能有帮助,也可能没有帮助。如果没有,我们仍然可以使用posix命令来解决这个问题。在

编辑:根据crispytx,长脚本导致$cmd_return_val为1,这意味着发生了错误。试着改变这一行:

^{pr2}$

为了这个

^{3}$

让我们知道$cmd_output的输出是什么,它至少应该有新生成的进程的进程id。在

谢谢你给我的所有帮助。我在使用你的建议调试时遇到了一点小麻烦,因为我碰巧用AJAX来调用脚本。但是,我使用您的建议编写了更简单的脚本来尝试调试问题,这是我发现的:

数组([0]=>;回溯(最近一次调用):[1]=>;File“/var/www/html/jan8/亚历山大.py“,第28行,in[2]=>;文件.写入(generateHTML(docxFile))[3]=>;UnicodeEncodeError:'ascii'编解码器无法对25位的字符'\u2026'进行编码:序号不在范围(128))

看来问题与ascii编码有关!尽管较大的文件只是一个docx文件,其文本与较短的docx文件重复了300页。看起来,如果一个docx文件超过1页,就会插入单页docx文件中不存在的ascii字符。我不知道这篇文章是否会帮助任何人,但谁知道呢!在

[已解决]

相关问题 更多 >

    热门问题