I need run command line app and send live output to websocket server:
<?php
$loop = React\EventLoop\Factory::create();
$connector = new Ratchet\Client\Connector($loop);
$app = function (Ratchet\Client\WebSocket $conn) use ($connector, $loop, &$app, $server_id) {
$conn->on('message', function (\Ratchet\RFC6455\Messaging\MessageInterface $msg) use ($conn) {
global $server_id;
$msg = json_decode($msg);
if($msg->type=='run') {
$proc = popen("ping -t 127.0.0.1",'r');
while (!feof($proc))
{
$read = fread($proc, 4096);
if($read) {
$conn->send($read);
}
}
}
});
$conn->on('close', function ($code = null, $reason = null) use ($connector, $loop, $app) {
echo "Connection closed ({$code} - {$reason})\n";
$loop->addTimer(3, function () use ($connector, $loop, $app) {
connectToServer($connector, $loop, $app);
});
});
};
function connectToServer($connector, $loop, $app)
{
$connector('wss://server:1234')
->then($app, function (\Exception $e) use ($loop) {
echo "Could not connect: {$e->getMessage()}\n";
$loop->stop();
});
}
connectToServer($connector, $loop, $app);
$loop->run();
The problem is when i try to use while (!feof($proc)) it looks like blocks main thread and $conn->send($read); doesn't send anything inside while...
Any way to use popen and Pawl?