(PHP 7 >= 7.4.0, PHP 8)
sapi_windows_generate_ctrl_event —Send a CTRL event to another process
Sends a CTRL event to another process in the same process group.
event
TheCTRL
event to send; eitherPHP_WINDOWS_EVENT_CTRL_C
orPHP_WINDOWS_EVENT_CTRL_BREAK
.
pid
The ID of the process to which to send the event to. If0
is given, the event is sent to all processes of the process group.
Example #1 Basicsapi_windows_generate_ctrl_event() Usage
This example shows how to pass alongCTRL+BREAK
events to a child process. In this case the child process echoesI'm still alive
every second, until the user pressesCTRL+BREAK
, what causes only the child process to be terminated.
<?php
// forward CTRL+BREAK events to the child process
sapi_windows_set_ctrl_handler('sapi_windows_generate_ctrl_event');
// create a child process which echoes every second
$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) {
echofgets($pipes[1]);
}
?>
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.