2016-05-13 20 views
9

私はApacheの逆プロキシにhttps要求を行い、いくつかの統計を測定するマルチスレッドPHPクライアントを作成しています。私は、TLSセッション再開でパフォーマンスを向上させることに関する学士論文を書いています。今私はそれを証明する/否定する概念の証明をする必要があります。私はこのコードを持っている現時点では:PHPでのTLSセッション再開

  $this->synchronized(function($this){ 
       $this->before = microtime(true); 
      }, $this); 

      $url = 'https://192.168.0.171/'; 
      # Some dummy data 
      $data = array('name' => 'Nicolas', 'bank account' => '123462343'); 

      // use key 'http' even if you send the request to https://... 
      $options = array(
       'http' => array(
        'header' => "Content-type: application/x-www-form-urlencoded\r\n", 
        'method' => 'POST', 
        'content' => http_build_query($data) 
       ), 
       "ssl" => array(
        "verify_peer" => false, 
        "verify_peer_name" => false, 
        "ciphers" => "HIGH:!SSLv2:!SSLv3" 
       ) 
      ); 

      $context = stream_context_create($options); 
      $result = file_get_contents($url, false, $context); 
      $this->synchronized(function($this){ 
       $this->after = microtime(true); 
      }, $this); 

      $this->counter_group->write($this->before, $this->after, $result); 

このコードは、完全なハンドシェイクを行うために動作しますが、私はPHPで再開ハンドシェイクを行う方法を見つけ出すように見えることはできませんか?

ご協力いただければ幸いです!

+1

...またはその反対です。 :) – bishop

+0

file_get_contents()はリクエストの直後にTCP接続を閉じます。通常は。キープアライブ接続ヘッダーが必要で、ハンドルを使ってfopen()が必要です...私は悲しいことに、今すぐ調査する時間がありません: -/ – bwoebi

答えて

5

あなたは、PHPのカールを試してみて、同じサーバーに再接続する際にSSLハンドシェイクに費やす時間 を減らし、PHPのドキュメントからhttp://php.net/manual/en/function.curl-share-setopt.php

CURL_LOCK_DATA_SSL_SESSION株式のSSLセッションIDをCURL_LOCK_DATA_SSL_SESSION

を使用することができます。 SSLセッションIDを使用すると、上記の説明から読み取ることができたように、セッションIDが同じハンドルで再利用されているデフォルト

で同じハンドル内で再利用されていることを に注意してください。あなたがハンドルの間で共有したい場合しかし、あなたは

$ch2 = curl_init('https://192.168.0.171'); 
curl_setopt($ch2, CURLOPT_SHARE, $sh); 
curl_setopt($ch2, CURLOPT_SSLVERSION, 6); // TLSV1.2 
curl_setopt($ch2, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); 
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); 
// (...) 
curl_exec($ch2); 

(握手再開)

$sh = curl_share_init(); 
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_SSL_SESSION); 
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS); 

、あなたは別の要求の間

$ch1 = curl_init('https://192.168.0.171'); 
curl_setopt($ch1, CURLOPT_SHARE, $sh); 
curl_setopt($ch1, CURLOPT_SSLVERSION, 6); // TLSV1.2 
curl_setopt($ch1, CURLOPT_SSL_CIPHER_LIST, 'TLSv1'); 

curl_setopt($ch1, CURLOPT_POST, 1); 
curl_setopt($ch1, CURLOPT_POSTFIELDS, 
http_build_query(array('name' => 'Nicolas', 'bank account' => '123462343'))); 
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); 

$output = curl_exec($ch1); 

$shを再利用することができ、たとえばcurl_share_initを使用し、再利用することができます閉じる接続

curl_close($ch1); 
curl_close($ch2); 

でも、CURLOPT_SSLVERSIONとCURLOPT_SSL_CIPHER_LISTを使用してプレイする必要があります。また、PHPは独自の特徴を持っているので、別の言語に切り替えるべきだと思います。もし論文を証明したり、それを裏付けるならば、ベアメタルに近いものを使う方がよいでしょう。ベンチマーク。私は両方のリクエストのパフォーマンスを測定しましたが、それは直感的ではありませんが、2番目のリクエストはほぼ2倍遅くなります。

+1

あなたのソリューションをありがとう、これはほとんど私がそれを実装し終えた方法です!そして、私は自分の論文にphpを使うのは最適ではなかったが、言語を切り替える時間はなかったことに気づいた。つまり、私の論文は私の大学で出版されるつもりです。 – Nicolas

関連する問題