我正在开发一个解决方案,我使用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有一个所谓的REQ
和REP
,但是我无法弄清楚这是否有助于让它像这样工作。
将cURL回复发送回最初的请求对我来说最好的是什么?