PHP 8.4.1 Released!

sapi_windows_generate_ctrl_event

(PHP 7 >= 7.4.0, PHP 8)

sapi_windows_generate_ctrl_eventПослать событие CTRL другому процессу

Описание

sapi_windows_generate_ctrl_event(int $event, int $pid = 0): bool

Послать событие CTRL другому процессу в той же группе процессов.

Список параметров

event

Событие CTRL; PHP_WINDOWS_EVENT_CTRL_C или PHP_WINDOWS_EVENT_CTRL_BREAK.

pid

Идентификатор процесса, которому необходимо послать событие. Если задано как 0, то событие будет послано всем процессам в группе.

Возвращаемые значения

Функция возвращает true в случае успешного выполнения или false, если возникла ошибка.

Примеры

Пример #1 Использование sapi_windows_generate_ctrl_event()

В этом примере показано, как послать события CTRL+BREAK дочернему процессу. В данном случае дочерний процесс будет печатать Я всё ещё жив! раз в секунду, пока пользователь не нажмёт CTRL+BREAK. После этого дочерний процесс завершится.

<?php
// Пересылка событий CTRL+BREAK дочернему процессу
sapi_windows_set_ctrl_handler('sapi_windows_generate_ctrl_event');

// Создаём дочерний процесс
$cmd = ['php', '-r', 'while (true) { echo "Я всё ещё жив!\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]);
}
?>

Смотрите также

  • proc_open() - Выполняет команду и открывает указатель на файл для ввода или вывода
  • sapi_windows_set_ctrl_handler() - Установить или удалить обработчик события CTRL
Добавить

Примечания пользователей 1 note

up
1
Michael Q
3 years ago
This function may produce a Warning:

sapi_windows_set_ctrl_handler(): CTRL events trapping is only supported on console in script.php..

It happens when script is started by "php-cgi.exe", so "php.exe -q" should be used instead.

While pressing CTRL+C don't expect the handler to run instantly, i've ran some curl request in a loop and found that handler runs when either response arrives or request finishes by timeout.
To Top