我正在使用 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)。谢谢!https://www.php.net/manual/en/function.set-time-limit.phpset_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 为运行脚本保留的时间间隔。
由于脚本是从标准 crontab 调用的,因此我在该调用前面添加了对 linux'
timeout
命令的调用作为前缀,如下所示:
timeout 55 -k 4 php bin/console somesymfony:command
这会有效地停止脚本,无论此时正在做什么。
我的示例中的
55
尝试在 55 秒后停止脚本,而
-k 4
实际上会在额外 4 秒后终止脚本(如果第一次尝试不起作用)。就我而言 - 简单的超时 55 不起作用,我还必须使用 -k
参数。