2016-05-13 4 views
9

Я пишу многопоточный клиент php, который делает https-запросы для обратного прокси-сервера apache и измеряет некоторые статистические данные. Я пишу диплом бакалавра об улучшении производительности с помощью TLS Session Resumption. Теперь мне нужно сделать доказательство концепции, которое доказывает/опровергает это. На данный момент у меня есть этот код:Возобновление сеанса 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, сокращение времени затрачиваемого на SSL рукопожатии при повторном подключении к одному серверу. Обратите внимание, что идентификаторы сеансов SSL повторно используются в одной и той же ручкой по умолчанию

Как вы можете прочитать из описания выше, идентификатор сессии повторно по одной и той же ручкой. Но если вы хотите поделиться между ручками вы можете использовать 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

Смежные вопросы