PHP。按原样将请求转发给另一台服务器

时间:2017-05-25 11:08:35

标签: php curl proxy request forward

服务器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但没有做任何事情。我无法访问它,所以我不知道是什么阻止了请求。

2 个答案:

答案 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