什么有效?
真正起作用的似乎是给整个事情一些空间来发挥其信号处理魔力。这样的空间似乎是通过启用cURL的进度处理来提供的,同时还设置了一个“userland”进度回调:
解决方案 1
while (true) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_NOPROGRESS, false); // "true" by default
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function() {
usleep(100);
});
curl_setopt($ch, CURLOPT_URL, 'http://blackhole.webpagetest.org');
curl_exec($ch);
curl_close($ch);
}
似乎在进度回调函数中需要有“某些东西”。空体似乎不起作用,因为它可能没有给PHP太多的时间来处理信号(硬核推测)。
解决方案 2
即使没有 打开,输入回调似乎也可以工作。pcntl_signal_dispatch()
declare(ticks=1);
PHP 7.1
...
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function() {
pcntl_signal_dispatch();
});
...
解决方案 3 ❤ (PHP 7.1+)
使用而不是工作,即使使用空的进度回调函数体。pcntl_async_signals(true)
declare(ticks=1);
这可能是我个人会使用的,所以我将把完整的代码放在这里:
<?php
pcntl_async_signals(true);
$shutdownHandler = function() {
die("Exiting\n");
};
pcntl_signal(SIGINT, $shutdownHandler);
while (true) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function() {});
curl_setopt($ch, CURLOPT_URL, 'http://blackhole.webpagetest.org');
curl_exec($ch);
curl_close($ch);
}
所有这三种解决方案都会导致 在按 Ctrl+C
后几乎立即退出。PHP 7.1