PHP安全Websocket客户端麻烦,需要不阻止

时间:2016-07-13 11:39:32

标签: php websocket ratchet phpwebsocket

我正在构建一个仪表板,允许我在运行时可视化我的crontab(想想即将执行的任务的队列,当前正在运行的那些以及已经完成的那些以及结果是否成功。)为此,我需要从我的服务器上的任务(由PHP运行或监视)发送消息到使用javascript运行仪表板的客户端浏览器。它也必须是安全的。

为了解决这个问题,我在Python中实现了一个Twisted / Autobahn套接字服务器,一旦我付了适当的安全证书就可以正常工作。然而,我遇到的问题是让运行crontasks的PHP能够将消息发送到webSocket服务器,并将它们传递给客户端浏览器,到目前为止,我已经通过编写一个接受消息发送的Python客户端来攻击它。参数并将其作为PHP的exec运行。

显然这不是一个强大的解决方案(执行起来也相对较慢),我现在想通过websockets将crontasks中的logfile条目发送到我的仪表板,这样我就可以看到当我的服务器运行时发生了什么。我一直在寻找一段时间并且尝试了各种方法(大多数方法都太长而无法发布)但是它们的范围从教程,到PHP网站的分段到诸如Thruway之类的库(对于我的用例而言似乎过于设计,专门并且很难适应。

我到目前为止取得的最佳进展是Pawl,使用以下代码,我可以使用wss成功向Python套接字服务器发送三条消息:

<?php

    require __DIR__ . '/vendor/autoload.php';

    \Ratchet\Client\connect('wss://127.0.0.1:9000')->then(function($conn) {
        $conn->on('message', function($msg) use ($conn) {
            echo "Received: {$msg}\n";
            $conn->close();
        });

        $conn->send('MSG 1');

        $conn->send('MSG 2');

        $conn->send('MSG 3');

    }, function ($e) {
        echo "Could not connect: {$e->getMessage()}\n";
    });
?>

(请注意,这取决于找到的库here

我遇到的问题是,我希望能够打开和关闭连接,并在代码示例(我很难适应)中单独发送消息,它似乎是打开,发送和关闭都包含在then方法和匿名函数中,我不能单独调用这些方法。理想情况下,我想在crontask执行开始时打开连接,每次记录消息时调用send方法并在结束时关闭连接而不浪费时间打开和关闭到我的套接字服务器的连接信息。请注意,无需收听回复。

此外,任何通过WSS工作到127.0.0.1:9000且不需要库或使用不同库的解决方案我很乐意考虑。还请注意(在看到其他帖子后)这个问题专门指的是websocket客户端,而不是服务器。

非常感谢,

詹姆斯

1 个答案:

答案 0 :(得分:1)

如果其他人发现此最终解决方案欢迎,请留下:

最后,我将Fredrik Liljegren等人在一个小班中包含了一个名为Textalk的模块,以使其更易于访问,这解决了我的问题。

这是我最后使用的代码:

 require('vendor/autoload.php');

 use WebSocket\Client;

        class secureSocketClient {

                private $OClient;

                function __construct($VProtocol, $VLocation, $VPort, $VDir) {

                        $this->OClient = new Client("$VProtocol://$VLocation:$VPort" . ($VDir != null ? "/$VDir" : ""));
                }

                function sendMessage($ORequestData) {

                        $VLocalMessage = json_encode($ORequestData);

                        $this->OClient->send($VLocalMessage);
                }

                function __destruct() {

                        $this->OClient->close();
                }
        }

可以这样调用:

require_once <class location>

$this->OSecureSocketClient = new secureSocketClient("wss", "127.0.0.1", "9000", null);

$this->OSecureSocketClient->sendMessage($OMSG1);
$this->OSecureSocketClient->sendMessage($OMSG2);
$this->OSecureSocketClient->sendMessage($OMSG3);

要安装textTalk(在linux上),您可以在类所在的目录中使用以下命令:

curl -sS https://getcomposer.org/installer | php

将以下内容添加到composer.json(在同一目录中):

{
    "require": {
        "textalk/websocket": "1.0.*"
    }
}

然后执行以下操作:

sudo php composer.phar install

此致

詹姆斯