PHP 安全 Websocket 客户端问题,需要非阻塞
PHP Secure Websocket Client Trouble, Needs to be Non Blocking
我正在构建一个仪表板,它允许我在 运行s 时可视化我的 crontab(想想即将到来的任务队列,那些当前 运行ning 和那些已经完成和结果是否成功。)为此,我需要从我服务器上的任务(运行ning 或由 PHP 监视)发送消息到 运行 的客户端浏览器使用 javascript 的仪表板。它还必须是安全的。
为了解决这个问题,我在 Python 中实现了一个 Twisted/Autobahn 套接字服务器,一旦我支付了适当的安全证书,它就可以正常工作。然而,我遇到的问题是让 PHP 运行 使 crontasks 能够将消息发送到 webSocket 服务器,webSocket 服务器将它们传递给客户端浏览器,到目前为止,我已经通过编写一个 Python 接受消息作为参数发送的客户端,运行 这是来自 PHP.
的执行程序
显然这不是一个可靠的解决方案(执行起来也相对较慢),我现在想通过 websockets 将日志文件条目从 crontasks 发送到我的仪表板,这样我就可以看到我的服务器上发生了什么作为任务运行。我一直在寻找一段时间并尝试了各种方法(大多数都太长到 post)但是它们的范围从教程到 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)
我遇到的问题是我希望能够打开和关闭连接并作为单独的步骤发送消息,在代码示例中(我很难适应)似乎打开,发送和 close 都包裹在 then
方法和匿名函数中 我不能单独调用这些方法。理想情况下,我想在我的 crontask 执行开始时打开连接,每次记录一条消息时调用发送方法并在结束时关闭连接,而不会浪费时间打开和关闭与我的套接字服务器的连接信息。请注意,监听回复不是必需的。
此外,任何适用于 WSS 127.0.0.1:9000 且不需要库或使用其他库的解决方案我都很乐意考虑。另请注意(在看到其他 posts 之后)这个问题专门指的是 websocket 客户端,而不是服务器。
非常感谢,
詹姆斯
留下这个以防其他人发现这个最终解决方案是受欢迎的:
最后,我将 Fredrik Liljegren 等人称为 Textalk 的模块包装在一个小 class 中,使其更易于访问,这解决了我的问题。
这是我最后使用的代码:
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 上),您可以在 class 所在的目录中使用以下命令:
curl -sS https://getcomposer.org/installer | php
将以下内容添加到 composer.json(在同一目录中):
{
"require": {
"textalk/websocket": "1.0.*"
}
}
然后 运行 以下内容:
sudo php composer.phar install
此致,
詹姆斯
我正在构建一个仪表板,它允许我在 运行s 时可视化我的 crontab(想想即将到来的任务队列,那些当前 运行ning 和那些已经完成和结果是否成功。)为此,我需要从我服务器上的任务(运行ning 或由 PHP 监视)发送消息到 运行 的客户端浏览器使用 javascript 的仪表板。它还必须是安全的。
为了解决这个问题,我在 Python 中实现了一个 Twisted/Autobahn 套接字服务器,一旦我支付了适当的安全证书,它就可以正常工作。然而,我遇到的问题是让 PHP 运行 使 crontasks 能够将消息发送到 webSocket 服务器,webSocket 服务器将它们传递给客户端浏览器,到目前为止,我已经通过编写一个 Python 接受消息作为参数发送的客户端,运行 这是来自 PHP.
的执行程序显然这不是一个可靠的解决方案(执行起来也相对较慢),我现在想通过 websockets 将日志文件条目从 crontasks 发送到我的仪表板,这样我就可以看到我的服务器上发生了什么作为任务运行。我一直在寻找一段时间并尝试了各种方法(大多数都太长到 post)但是它们的范围从教程到 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)
我遇到的问题是我希望能够打开和关闭连接并作为单独的步骤发送消息,在代码示例中(我很难适应)似乎打开,发送和 close 都包裹在 then
方法和匿名函数中 我不能单独调用这些方法。理想情况下,我想在我的 crontask 执行开始时打开连接,每次记录一条消息时调用发送方法并在结束时关闭连接,而不会浪费时间打开和关闭与我的套接字服务器的连接信息。请注意,监听回复不是必需的。
此外,任何适用于 WSS 127.0.0.1:9000 且不需要库或使用其他库的解决方案我都很乐意考虑。另请注意(在看到其他 posts 之后)这个问题专门指的是 websocket 客户端,而不是服务器。
非常感谢,
詹姆斯
留下这个以防其他人发现这个最终解决方案是受欢迎的:
最后,我将 Fredrik Liljegren 等人称为 Textalk 的模块包装在一个小 class 中,使其更易于访问,这解决了我的问题。
这是我最后使用的代码:
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 上),您可以在 class 所在的目录中使用以下命令:
curl -sS https://getcomposer.org/installer | php
将以下内容添加到 composer.json(在同一目录中):
{
"require": {
"textalk/websocket": "1.0.*"
}
}
然后 运行 以下内容:
sudo php composer.phar install
此致,
詹姆斯