我正在构建一个仪表板,允许我在 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
问候
詹姆斯