PHP 杂项函数

PHP sapi_windows_set_ctrl_handler() 函数设置或删除 CTRL 事件处理程序,该处理程序允许 Windows CLI 进程拦截或忽略 CTRL+ C 和 CTRL+BREAK 事件。请注意,在多线程环境中,只有从主线程调用时才可能。

语法

sapi_windows_set_ctrl_handler(handler, add) 

参数

handler

必填。 指定要设置或删除的回调函数。如果设置,每当发生 CTRL+C 或 CTRL+BREAK 事件时都会调用此函数。该函数应该具有以下签名:

handler(int $event): void 

事件:已收到的 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); 
?>