【发布时间】:2018-04-10 17:12:59
【问题描述】:
我有一个带有自定义关闭处理程序的 PHP 命令行应用程序:
<?php
declare(ticks=1);
$shutdownHandler = function () {
echo 'Exiting';
exit();
};
pcntl_signal(SIGINT, $shutdownHandler);
while (true) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://blackhole.webpagetest.org');
curl_exec($ch);
curl_close($ch);
}
如果我在 CURL 请求正在进行时使用 Ctrl+C 终止脚本,则它没有任何效果。该命令只是挂起。如果我删除了我的自定义关闭处理程序,Ctrl+C 会立即终止 CURL 请求。
为什么当我定义 SIGINT 处理程序时,CURL 无法杀死?
【问题讨论】:
-
为什么你认为 CURL 是在响应信号,而不是完全被忽略?
-
@IMSoP 抱歉,我的问题可能有点误导(我已经更新)。问题的关键是为什么 CURL 在这种情况下无法杀死。
-
Curl 是一个外部库,因此在操作过程中杀死它从用户态来说并不容易/不可能。您将不得不弄清楚如何重新连接到默认信号处理程序以使其正确终止。
-
我认为答案在于stackoverflow.com/questions/26934216/…,问题是您的 curl 调用被阻塞 io 卡住并且 php 根本无法访问您的信号处理程序,并且设置处理程序会禁用原始处理程序一起
-
@Jonathan,如果不重构
7.0.X中的代码,就不可能做到这一点。看看这个要点是否是您可以接受的解决方案? gist.github.com/tarunlalwani/6b4f2b81f20c781234899e62f22b0436,如果是那我就发一个答案