等待第二台Ratchet / ZeroMQ服务器的cURL响应

时间:2015-10-01 13:37:22

标签: php curl zeromq ratchet

我正在开发一个解决方案,我使用cURL从第一台服务器向第二台服务器发送POST请求。

function sendIcuCurlRequest($identity, $action, $payload){
    $url = '-- Removed --';

    $data = array(
        'identity' => $identity,
        'action' => $action,
        'payload' => $payload
    );
    $fields = http_build_query($data);

    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, count($data));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    curl_close($ch);

    return $result;
}

在拾取cURL请求的第二台服务器上,ZeroMQ使用SOCKET_PUSH将数据发送到WebSocket服务器(WebSocket服务器位于第二台服务器上)。

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

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

然后,WebSocket服务器向客户端发出RPC调用。

public function onNewRequest($request){
    $requestData = json_decode($request, true);
    echo "Outgoing new request for Charge Point: ".var_export($request, true)."\n";

    // Check if is valid Station
    if(!array_key_exists($requestData['identity'], $this->stations)){
        echo "Identity {$requestData['identity']} not found.\n";
        return;
    }

    $station = $this->stations[$requestData['identity']];
    $res = $station->send(json_encode($requestData['message']));
    file_put_contents(dirname(__FILE__).'/../../logs/broadcast-'.date('Ymd').'.log', print_r($res, true)."\n\n", FILE_APPEND);
}

经过一番思考后,客户端会使用响应将CallResult发送到onCallResult方法。 (注意:我已经修改了Ratchet的WAMP核心,因此可以从客户端接收CallResults)

public function onCallResult(ConnectionInterface $conn, $id, array $params){
    $url = $conn->WebSocket->request->getUrl();

    echo "URL path -- ".$url."\n";
    echo "IP -- ".$conn->remoteAddress."\n";
    echo "Incoming call result (ID: $id)\n";
    echo "Payload -- ".var_export($params, true)."\n";
}

现在到了有趣的部分 既然我收到了客户的回复,我想使用与初始请求相同的连接将回复发送回cURL。

我在想,仅凭cURL我就无法实现这一目标(我发现有一种新的方法,如curl_pause但是适用于5.5及以上。当前服务器正在运行5.4)

我也发现ZeroMQ有一个所谓的REQREP,但是我无法弄清楚这是否有助于让它像这样工作。

将cURL回复发送回最初的请求对我来说最好的是什么?

0 个答案:

没有答案