2016-05-13 96 views
9

我正在寫一個多線程的PHP客戶端,使https請求到apache反向代理並測量一些統計數據。我正在撰寫關於通過TLS會話恢復提高性能的學士論文。現在我需要做一個證明/證明這一點的概念證明。目前,我有這樣的代碼:在TLS會話恢復在PHP

  $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捲曲和使用CURL_LOCK_DATA_SSL_SESSION

從PHP文件http://php.net/manual/en/function.curl-share-setopt.php

CURL_LOCK_DATA_SSL_SESSION股份SSL會話ID,減少重新連接到同一臺服務器時,花費在SSL握手的時間 。需要注意的是 SSL會話ID會被默認

同一手柄內重用你可以從上面的描述看,會話ID是由同一個手柄重用。但是如果你想把手之間共享,你可以使用curl_share_init例如

$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); 

,那麼你可以在不同請求之間重用$sh

$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); 

,然後再利用(復會握手)

$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); 

並關閉連接

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

但是你也需要玩CURLOPT_SSLVERSION和CURLOPT_SSL_CIPHER_LIST。另外,我認爲你應該改用不同的語言,因爲PHP有​​它自己的怪癖,如果你證明或反駁論文,最好使用更接近裸機的東西,所以你確信額外層(PHP)不會破壞你的基準。我確實測量了這兩個請求的性能,這有點違反直覺,但第二個幾乎慢了兩倍。

+1

感謝您的解決方案,這幾乎是我最終實現它!而且我也意識到,使用php作爲我的論文並不是最佳選擇,但沒有時間切換語言。話雖如此,我的論文將由我的大學出版。 – Nicolas