-
-
Notifications
You must be signed in to change notification settings - Fork 158
Closed
Labels
Description
require_once __DIR__.'/vendor/autoload.php';
$inner = count($argv) > 1;
$loop = new \React\EventLoop\ExtEventLoop();
$connector = new React\Socket\Connector($loop);
runme($loop, $connector, $inner);
if (!$inner) {
echo "Outer start\n";
$loop->run();
}
function runme(\React\EventLoop\LoopInterface $loop, React\Socket\Connector $connector, $inner)
{
$connector->connect('tcp://127.0.0.1:3306')->
then(function (\React\Socket\ConnectionInterface $conn) {
echo ("Hello MySQL!\n");
$conn->close();
},function ($e) {
echo ("Bye MySQL!\n");
})->done();
if ($inner) {
echo "Inner start\n";
$loop->run();
}
echo "Exit runme\n";
}
it works proper and returns:
$ php ./testMysql.php
Exit runme
Outer start
Hello MySQL!
$ php ./testMysql.php --inner
Inner start
Hello MySQL!
Exit runme
But if you go into \React\Socket\TcpConnector::waitForStreamOnce() and remove $canceller function in new Promise object like below, than it hangs again. Looks like it works in latest version of react a kind of accidentally as socket not stored obvious way, and in fact similar to code in v0.4.6.
private function waitForStreamOnce($stream)
{
$loop = $this->loop;
return new Promise\Promise(function ($resolve, $reject) use ($loop, $stream) {
$loop->addWriteStream($stream, function ($stream) use ($loop, $resolve, $reject) {
$loop->removeWriteStream($stream);
// The following hack looks like the only way to
// detect connection refused errors with PHP's stream sockets.
if (false === stream_socket_get_name($stream, true)) {
fclose($stream);
$reject(new \RuntimeException('Connection refused'));
} else {
$resolve(new Connection($stream, $loop));
}
});
});
}
$ php ./testMysql.php --inner
Inner start
.....HANGING
$ php ./testMysql.php
Exit runme
Outer start
...HANGING
Initial discussion here: https://stackoverflow.com/questions/47551054/php-7-1-pecl-event-libevent-is-hanging-in-weird-case