【问题标题】:Long running Python script returned no result using shell_exec in PHP长时间运行的 Python 脚本在 PHP 中使用 shell_exec 没有返回任何结果
【发布时间】:2020-06-29 07:19:44
【问题描述】:

我使用 shell_exec 从命令行运行 Python 脚本,进行测试,Python 脚本只是在等待 一段时间后返回True:

def test(minutes):
   import time
   time.sleep(minutes*60)
   return True

根据我的测试,如果时间段是 30 分钟或 60 分钟,则结果成功返回给 PHP,但是如果我将其设置为 80 分钟,则 PHP 没有收到任何结果,甚至没有错误消息。

php.ini 中的 max_execution_time 是 30000 秒,足够长了。

环境:带有 IIS 的 Windows Server 2016 Standard

PHP 版本:7.3.4

【问题讨论】:

  • 返回“什么”?您的 php 引擎“如何处理布尔类型(包括系统设置)”。不能将 Web 服务用作 crontab !

标签: python php shell-exec


【解决方案1】:

根据answer 的说法,你睡得越久,遇到问题的可能性就越大,尽管 80 分钟看起来确实很长。

如果这确实导致了您的问题,也许您应该考虑将睡眠时间分成几个块(例如 1 分钟)作为一种解决方法:

def test(minutes):
   import time
   for k in range(minutes):
       time.sleep(60)
   return True

【讨论】:

  • 睡眠只是为了模拟我长时间运行的程序。真正的过程是我使用 subprocess 模块从 Python 调用了一些长时间运行的 Teradata 脚本,而 Python 脚本本身是使用 shell_exec 从 PHP 调用的。 Teradata 脚本部分通过 cmd 测试是可以的,而如果我从 PHP 调用 Python 脚本,如果花费了 70 分钟以上,它将失败而没有结果/错误消息。
【解决方案2】:

试试这些,

  1. 在您的 PHP 脚本中,添加“timeout 100m”,这可能会增加 python 脚本执行超时

$output = shell_exec("timeout 100m python3 longrun.py"); echo $output;

  1. 在您的服务器配置文件中(对于 Ubuntu 中的 Apache2,它是“/etc/apache2/apache.conf”)将超时更改为 6000,默认为 300。6000 表示 6000 秒,即 100 分钟

【讨论】:

  • 非常感谢! IIS 的服务器配置文件在哪里?
  • “超时”是 Linux 命令吗? Windows 是否有等效命令?
  • "timeout" 是 Apache 参数(服务器参数)。 @Chen,您似乎正在使用 IIS,这是另一台服务器,因此,即使此答案对 Apache 用户可能非常有用,但我认为它与您的问题无关。我不太了解Windows,但也许你应该看看here 和here。
【解决方案3】:

在 php.ini 中检查你的 max_input_time

【讨论】:

  • max_input_time为60000秒,足够长了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多