Socket通信でレスポンスが遅い
PHP プログラムで Web サーバと SSL 通信すると非常にレスポンスが遅くなるという
現象に出くわしたので、その対処方法を書いておきます(HTTP通信でも同じ現象になるかもしれません)。
fsockopen() で 443 ポートに接続し、データを送受信する以下のプログラムでは、レスポンスが遅くなります。
$send_data = '送信データ'; $fp = @fsockopen("ssl://192.168.0.xxx", 443, $errno, $errstr, 30); $request = ""; $request .= "POST /xxx.php HTTP/1.1\r\n"; $request .= "Host: 192.168.0.xxx\r\n"; $request .= "Content-Type: text/plain\r\n"; $request .= "Content-Length: " . strlen($send_data) . "\r\n"; $request .= "\r\n"; $request .= $send_data; $request .= "\r\n"; fputs($fp, $request); while(!feof($fp)) { $response .= fgets($fp, 4096); } fclose($fp);
「HTTP/1.1」→「HTTP/1.0」にするとレスポンスは速いのですが、HTTP/1.1 では遅くなります。
調べてみると、HTTP/1.1 では持続接続機能が追加されたようで、接続が維持された状態になって終了されず遅くなっていたようです。
リクエストヘッダに「Connection: Close」を入れてやると、接続を維持せず終了するとのことです。
以下のように「Connection: Close」を入れると、レスポンスが速くなりました。
$send_data = '送信データ'; $fp = @fsockopen("ssl://192.168.0.xxx", 443, $errno, $errstr, 30); $request = ""; $request .= "POST /xxx.php HTTP/1.1\r\n"; $request .= "Host: 192.168.0.xxx\r\n"; $request .= "Content-Type: text/plain\r\n"; $request .= "Content-Length: " . strlen($send_data) . "\r\n"; $request .= "Connection: Close\r\n"; $request .= "\r\n"; $request .= $send_data; $request .= "\r\n"; fputs($fp, $request); while(!feof($fp)) { $response .= fgets($fp, 4096); } fclose($fp);