PHP安全Websocket客户端问题,需要非阻塞



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

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

显然,这不是一个强大的解决方案(执行速度也相对较慢),我现在想通过 websocket 将日志文件条目从 crontasks 发送到我的仪表板,以便我可以看到任务运行时服务器上发生的事情。我一直在寻找一段时间并尝试了各种方法(大多数都太长而无法发布),但它们的范围从教程到PHP网站的片段再到Thruway等库(对于我的用例来说似乎过于过度设计,专业且难以适应)。

到目前为止,我

最好的进展是Pawl,使用以下代码,我能够使用wss成功将三条消息发送到Python Socket服务器:

<?php
    require __DIR__ . '/vendor/autoload.php';
    RatchetClientconnect('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";
    });
?>

(请注意,这取决于此处找到的库)

我遇到的问题是我希望能够打开和关闭

连接并将消息作为单独的步骤发送,在代码示例中(我很难适应),似乎由于打开、发送和关闭都包装在 then 方法和匿名函数中,我无法单独调用这些方法。理想情况下,我想在 crontask 执行开始时打开连接,每次记录消息时调用 send 方法并在结束时关闭连接,而不会浪费时间为每条消息打开和关闭与我的套接字服务器的连接。请注意,无需听取回复。

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

非常感谢,

詹姆斯

保留这个以防其他人发现这个最终解决方案受欢迎:

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

这是我最后使用的代码:

 require('vendor/autoload.php');
 use WebSocketClient;
        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

问候

詹姆斯

相关内容

  • 没有找到相关文章

最新更新