此函数可能会产生警告
sapi_windows_set_ctrl_handler(): CTRL 事件捕获仅在 script.php 中的控制台中受支持。
当脚本由 “php-cgi.exe” 启动时,就会发生这种情况,因此应改为使用 “php.exe -q”。
按下 CTRL+C 时,不要指望处理程序立即运行,我曾在循环中运行了一些 curl 请求,发现处理程序在响应到达或请求因超时而结束时才运行。
(PHP 7 >= 7.4.0, PHP 8)
sapi_windows_generate_ctrl_event — 向另一个进程发送 CTRL 事件
event
要发送的 CTRL
事件;要么是 PHP_WINDOWS_EVENT_CTRL_C
或者 PHP_WINDOWS_EVENT_CTRL_BREAK
。
pid
要发送事件的进程的 ID。如果提供 0
,则将事件发送到进程组的所有进程。
范例 #1 基本 sapi_windows_generate_ctrl_event() 用法
此示例展示了如何将 CTRL+BREAK
事件传递给子进程。在本例中,子进程每秒钟回显 I'm still alive
,直到用户按下 CTRL+BREAK
,这将导致仅子进程被终止。
<?php
// 将 CTRL+BREAK 事件转发到子进程
sapi_windows_set_ctrl_handler('sapi_windows_generate_ctrl_event');
// 创建一个子进程,每秒钟回显
$cmd = ['php', '-r', 'while (true) { echo "I\'m still alive\n"; sleep(1); }'];
$descspec = array(['pipe', 'r'], ['pipe', 'w'], ['pipe', 'w']);
$options = ['create_process_group' => true];
$proc = proc_open($cmd, $descspec, $pipes, null, null, $options);
while (true) {
echo fgets($pipes[1]);
}
?>