通过HTTP

时间:2015-12-01 10:53:08

标签: php zeromq ratchet

我有一个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

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

1 个答案:

答案 0 :(得分:1)

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

当SELinux处于{{}}模式时,似乎拒绝了ZeroMQ连接。

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

enforcing