gpt4 book ai didi

php - 通过 HTTP 发送请求时 ZeroMQ 不起作用

转载 作者:行者123 更新时间:2023-12-04 16:13:10 24 4
gpt4 key购买 nike

我有一个 WebSocket 服务器(修改后的 Ratchet),它使用 ZermoMQ 将消息推送到服务器。最近我将服务器迁移到新的 VPS 上。

实现是相同的,但出于某种原因,当我通过 HTTP 请求 PHP 脚本时,ZeroMQ 不会将有效负载发送到 WebSocket 服务器,但是当我通过终端运行脚本时,它可以工作。

这是获取要发送到 Websocket 服务器的新请求的脚本:

<?php

if(isset($_POST['identity'], $_POST['identifier'], $_POST['env'], $_POST['action'], $_POST['payload'])){
$identity = $_POST['identity'];
$identifier = $_POST['identifier'];
$env = $_POST['env'];
$action = $_POST['action'];
$payload = $_POST['payload'];

$context = new ZMQContext();
$client = $context->getSocket(ZMQ::SOCKET_PUSH, 'ICU push');
$client->connect('tcp://127.0.0.1:21002');
$client->send(json_encode(array('identity' => $identity, 'env' => $env, 'message' => formatRequest($identifier, $action, $payload))));
} else {
echo "Invalid request";
exit;
}

和服务器启动脚本:

<?php
require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/../autoload.php');

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use Ratchet\Wamp\WampServer;
use ICU\Server;
use ICU\Logger;

$logger = new Logger();
$logger->setInteractive(true);

$loop = React\EventLoop\Factory::create();
$server = new Server('test');

$context = new React\ZMQ\Context($loop);

$pull = $context->getSocket(ZMQ::SOCKET_PULL);
$pull->bind("tcp://127.0.0.1:21002");
$pull->on('message', array($server, 'onNewRequest'));
$logger->info("ZMQ listening on TCP 127.0.0.1:21002");

$webSock = new React\Socket\Server($loop);
$webSock->listen(21001, '0.0.0.0');
$webServer = new IoServer(
new HttpServer(
new WsServer(
new WampServer(
$server
)
)
),
$webSock
);

$logger->info("ICU Server listening on 0.0.0.0:21001");

$loop->run();

HTTP 请求本身不会失败。响应代码为 200,错误日志中没有错误。此外,在回显整个脚本时,我看到脚本已完全执行,但 ZeroMQ 不会将其发送到 Websocket 服务器。

我查了 netstat并且端口 21001 和 21002 正在运行和监听。我还添加了 iptables两者的条目(尽管 21001 应该足够了,因为 ZeroMQ 仅用于本地级别,但以防万一)。

这是一个 CentOS 7 服务器,我安装了 libzmq 和 zmq pecl 扩展。
$ php -i | grep "zmq"
/etc/php.d/zmq.ini
zmq
libzmq version => 4.1.3

我是否遗漏了代码中的某些内容,或者这可能是服务器配置问题?

最佳答案

经过多天的调试,问题落在了 SELinux 上。

当 SELinux 位于 enforcing 时,ZeroMQ 连接似乎被拒绝了模式。

对于遇到此类问题的任何人,您需要禁用 SELinux:

sudo setenforce 0

关于php - 通过 HTTP 发送请求时 ZeroMQ 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com