1

php-curl を使用して同じサーバー上の別の URL を要求する php でプロキシ サービスを開発しました。うまく機能する場合もありますが、非常に長い時間がかかり、多くの場合タイムアウトする場合もあります。

このアプリケーションはセッションを使用しないため、ロックされたセッションの問題になることはありません。curl_exec を呼び出す前に session_write_close() をテストとして試しましたが、違いはありませんでした。

この一貫性のない動作の原因は何ですか? 実行しているのは 302 リダイレクトを提供することだけなので、すぐに応答することを期待しています。以下にプロキシ関数を貼り付けました。

protected function proxy( $pURL,  $opts = array() ){

    $defaults = array(
        'headers' => array(),
        'follow' => true,
        'return' => false,
        'return_headers' => false,
        'referer' => fp_get_config( 'referer_override' ),
        'user_agent' => $_SERVER['HTTP_USER_AGENT'],
        'timeout' => 30,
        'connect_timeout' => 10,
        'fresh_connect' => false
    );

    $options = array_merge( $defaults, $opts );

    extract( $options );

    $c = curl_init( $pURL );

    curl_setopt_array( $c, array(
        CURLOPT_HEADER => $return_headers,
        CURLOPT_USERAGENT => $user_agent,
        CURLOPT_REFERER => $referer,
        CURLOPT_CONNECTTIMEOUT => $connect_timeout,
        CURLOPT_TIMEOUT => $timeout,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_FOLLOWLOCATION => $follow,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_FRESH_CONNECT => $fresh_connect,
        CURLOPT_AUTOREFERER => true
    ));

    //session_write_close();

    $response = curl_exec( $c );

    if ( $response === false )
        die("Proxy Error: " . curl_error( $c ) );


    curl_close( $c );

    if ( $return )
        return $response;
    else {

        if ( $return_headers ){

            list( $headerblock, $body ) = explode("\r\n\r\n", $response, 2);
            $headers = explode("\r\n", $headerblock );

            foreach( $headers as $header )
                header( $header );

            echo $body;

        } else
            echo $response;
    }

    exit;

}
4

1 に答える 1

1

何が起こっていたのかが判明しました: 高可用性のために構成された 2 つのロード バランサーがあります。1 つの lb が他の lb に curl 要求を行うたびに、ファイアウォールによってブロックされ、接続がタイムアウトしました。ファイアウォール ルールを修正すると、この問題は解決しました。

于 2013-12-02T17:48:47.390 に答える