PHP sapi_windows_set_ctrl_handler() 函数设置或删除 CTRL 事件处理程序,该处理程序允许 Windows CLI 进程拦截或忽略 CTRL+ C 和 CTRL+BREAK 事件。请注意,在多线程环境中,只有从主线程调用时才可能。
语法
sapi_windows_set_ctrl_handler(handler, add)
参数
handler |
事件:已收到的 CTRL 事件 - PHP_WINDOWS_EVENT_CTRL_C 或 PHP_WINDOWS_EVENT_CTRL_BREAK。 设置空处理程序会导致进程忽略 CTRL+C 事件,但不忽略 CTRL+BREAK 事件。 |
add | 可选。 如果为 true,则设置处理程序。如果为 false,则删除处理程序。默认值为 true。 |
返回值
成功时返回 true,失败时返回 false。
示例: sapi_windows_set_ctrl_handler() 基本用法
下面的示例显示如何将 CTRL+BREAK 事件传递给子进程。在这种情况下,子进程会回显"Hello World!"每秒,直到用户按下 CTRL+BREAK,这会导致仅终止子进程。
<?php
//将CTRL+BREAK事件转发给子进程
sapi_windows_set_ctrl_handler('sapi_windows_generate_ctrl_event');
//创建一个每秒回显的子进程
$cmd = ['php', '-r', 'while (true) { echo "Hello World!\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]);
}
?>
示例:sapi_windows_set_ctrl_handler() 示例
下面的示例显示如何拦截CTRL事件。
<?php
function ctrl_handler(int $event) {
switch ($event) {
case PHP_WINDOWS_EVENT_CTRL_C:
echo "You have pressed CTRL+C\n";
break;
case PHP_WINDOWS_EVENT_CTRL_BREAK:
echo "You have pressed CTRL+BREAK\n";
break;
}
}
sapi_windows_set_ctrl_handler('ctrl_handler');
//无限循环,因此可以触发处理程序
while (true);
?>