限制调用外部脚本的持续时间

问题描述 投票:0回答:2

我正在使用 Symfony 与 Office365 邮件服务器进行通信,方法是在一个定时进程(每分钟)中调用 Symfony 命令。

显然,有时通信中的某些内容会被卡住,并且我的 php 脚本会继续运行 - 即使在下一个计划的调用发生之后,所以我有 2 个、然后 3 个、然后 4 个脚本并行运行。

问题是:我怎样才能可靠地将这个 Symfony 命令调用的“总持续时间”限制为最大值。 1分钟? 我说“总持续时间”,因为我确实尝试设置

max_execution_time

,即

set_time_limit(60)
,但显然此设置不计入对其他脚本的任何外部调用 - 因此任何等待 MX 服务器的时间回复不会被计算。
我也想过尝试设置 

max_input_time

但这在我的情况下不起作用,有两个原因:1. 显然 Symfony 控制台以某种方式用

-1
覆盖了我的常规 php.ini 值,2. 我不能在 Symfony 脚本中手动设置此设置。无论我设置什么,使用
ini_set("max_input_time", XX)
,它都会保持“无限”值(-1)。谢谢!
    

php symfony command duration max-execution-timeout
2个回答
1
投票
但显然此设置不计入对其他脚本的任何外部调用

确实如此,如
https://www.php.net/manual/en/function.set-time-limit.php

set_time_limit()函数和配置指令max_execution_time仅影响脚本本身的执行时间。在确定脚本运行的最长时间时,不包括在脚本执行之外发生的任何活动所花费的时间,例如使用 system() 的系统调用、流操作、数据库查询等。在 Windows 上情况并非如此,因为测量的时间是真实的。

为API调用设置一个
超时

怎么样?如果您使用 Guzzle,https://docs.guzzlephp.org/en/stable/request-options.html#timeout // Timeout if a server does not return a response in 3.14 seconds. $client->request('GET', '/delay/5', ['timeout' => 3.14]);

然后你必须确保你设置的限制 
set_time_limit()

+

timeout
小于 cron 为运行脚本保留的时间间隔。


0
投票

由于脚本是从标准 crontab 调用的,因此我在该调用前面添加了对 linux'

timeout

命令的调用作为前缀,如下所示:

timeout 55 -k 4 php bin/console somesymfony:command

这会有效地停止脚本,无论此时正在做什么。

我的示例中的

55

尝试在 55 秒后停止脚本,而

-k 4
实际上会在额外 4 秒后终止脚本(如果第一次尝试不起作用)。
就我而言 - 简单的超时 55 不起作用,我还必须使用 

-k

参数。

    

© www.soinside.com 2019 - 2024. All rights reserved.