服务器A正在向服务器B发送消息。我需要在它们之间插入带有PHP脚本的服务器C.
所以我希望它能像这样工作:
服务器A - >服务器C(进一步处理数据和转发请求) - >服务器B.
我需要服务器B收到完全相同的请求,这是从服务器A发送的。我不需要服务器C充当代理,只需按原样发送请求,这就是
我怎么能这样做?
我尝试过类似的东西,但是没有效果:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'Server B URL');
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
$response = curl_exec($ch);
服务器B返回200但没有做任何事情。我无法访问它,所以我不知道是什么阻止了请求。
答案 0 :(得分:3)
确保curl完全复制任何对最小细节的请求?对于curl来说,这不是一个真正的工作,而是对于socket_ *。我打赌有人会说这对PHP来说也不是一个真正的工作,但PHP肯定能够以单线程的方式做到这一点。使用套接字api接受来自服务器A的连接,读取请求,进行处理,将请求转发给服务器B,从服务器B读取响应,然后将该响应发送回服务器A.
示例(可以调用此ServerC.php):
struct Position: CustomStringConvertible {
let x, y: Int
// order of resulting neighbouring positions, given a position P
// (1) (2) (3)
// (4) (P) (5)
// (6) (7) (8)
private static let surroundingPositionsTranslations: [(x: Int, y: Int)] = [
(-1, -1), (0, -1), (1, -1),
(-1, 0), (1, 0),
(-1, -1), (0, -1), (1, -1)]
var surroundingPositions: [Position] {
return Position.surroundingPositionsTranslations
.map { Position(x: x + $0.x, y: y + $0.y) }
}
var description: String {
return "(\(x),\(y))"
}
}
// Note that I've changed the order w.r.t. OP:s original code
// (modify the transfotmation above to modify the order)
let testPosition = Position(x: 1, y: 1)
print(testPosition.surroundingPositions)
// Output: [(0,0), (1,0), (2,0), (0,1), (2,1), (0,0), (1,0), (2,0)]
(这个脚本很慢,一次只处理1个请求(虽然操作系统为socket_accept缓存并发请求)和同步。但它可以优化并与socket_select& co完全异步,如果它值得优化)
答案 1 :(得分:0)
尝试更改此行
curl_setopt($ch, CURLOPT_POSTFIELDS, $_POST);
为:
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_POST));
当您发出常规cURL请求时,不能直接将数组($_POST
是数组)用作CURLOPT_POSTFIELDS
的值。您必须将该数组转换为postdata字符串,这正是http_build_query()
所做的。它转换为例如
["name" => "my first name", "email" => "my@email.com"]
成:
name=my%20first%20name&email=my@email.com