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;
}