Req #77377 [Fbk->Opn]: No way to handle CTRL+C in Windows
| From: | ab@php.net | Date: | Tue, 12 Feb 2019 20:39:51 +0000 |
| Subject: | Req #77377 [Fbk->Opn]: No way to handle CTRL+C in Windows | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-219539@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=77377&edit=1
ID: 77377
Updated by: ab@php.net
Reported by: gadelat at gmail dot com
Summary: No way to handle CTRL+C in Windows
-Status: Feedback
+Status: Open
Type: Feature/Change Request
Package: Win32API related
Operating System: Windows 10
PHP Version: 7.2Git-2018-12-30 (Git)
Assigned To: ab
Block user comment: N
Private report: N
New Comment:
Cool, thanks for the info so far and for filing the issue. I'm still gonna document this and
then close this one. I expect there'll be more reports closer to the 7.4 final, when more
people start using this functionality.
Cheers.
Previous Comments:
------------------------------------------------------------------------
[2019-02-12 20:20:04] gadelat at gmail dot com
stream_select is not in my expertise as I don't use it myself, just streamlined the hang to
such peace of code in library. I have created issue https://github.com/amphp/amp/issues/262 and
hopefully guys from AMPHP can take over this conversation. Outside of that, this works nicely
------------------------------------------------------------------------
[2019-02-12 18:12:41] ab@php.net
@gadelat at gmail dot com, how is it going? :) Any other feedback?
Thanks.
------------------------------------------------------------------------
[2019-02-11 00:42:15] ab@php.net
Thanks for sending the code. Yes, the select sticks in a blocking call, because it's given the
timeout of zero. The CTRL+C handler can't be called, as no further PHP code can be interpreted.
My suggestion you do similar to the following instead
while (true) {
$read = [$server];
$write = [];
$except = null;
stream_select($read, $write, $except, 0, 5000);
}
The basic idea - just occasionally return from the blocking calls to give the VM a chance to handle
the interrupt. It is one of the Windows specific points, as CTRL+* event doesn't automatically
cancel all the I/O nor it does anything else except invoking the handler function. Internally, the
VM interrupt is set, but because the select blocks, VM doesn't execute.
I'll think about a way to improve this, but I'm pessimistic there can be done much. One
could try to close the open descriptors, that might work, but for that one has to record all of them
which might be not doable.
Thanks.
------------------------------------------------------------------------
[2019-02-10 23:35:17] gadelat at gmail dot com
Here's reproducer
<?php
sapi_windows_set_ctrl_handler(function () {
echo 'shutting down';
exit(0);
});
$server = stream_socket_server('localhost:1337');
stream_set_blocking($server, false);
$read = [$server];
$write = [];
$except = null;
stream_select($read, $write, $except, null, null);
------------------------------------------------------------------------
[2019-02-10 22:14:46] ab@php.net
The sapi_windows_generate_ctrl_event() can be used to send CTRL+C to a child process opened by
proc_open(). It's otherwise same as one would press the keys.
Thansk.
------------------------------------------------------------------------
The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
https://bugs.php.net/bug.php?id=77377
--
Edit this bug report at https://bugs.php.net/bug.php?id=77377&edit=1