2016-05-13 31 views
9

https bir apache ters proxy istekleri yapan ve bazı istatistikleri ölçer, çok iş parçacıklı bir php istemcisi yazıyorum. TLS Session Resumption ile performansın iyileştirilmesi hakkında bir lisans tezi yazıyorum. Şimdi bunu kanıtlayan/onaylayan bir kavram kanıtı yapmalıyım. Şu anda bu kodu vardır:TLS Oturum Başlatma php olarak

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

Bu kod tam el sıkışma yapmak için çalışır, ama ben php bir yeniden el sıkışma nasıl anlamaya görünüyor olamaz?

Herhangi bir yardım çok takdir edilecektir!

+1

... veya onaylamıyor. :) – bishop

+0

file_get_contents() istekte hemen sonra TCP bağlantısını kapatır ... genellikle. İhtiyaç duymak için bağlantı başlıkları ve fopen() bir tutamaç ile… Şimdilik şu anda araştırmak için yeterince zamanım yok: -/ – bwoebi

cevap

5

PHP curl denemek ve aynı sunucuya tatbik ederken SSL anlaşması için harcanan zamanı azaltarak, PHP belgelerinden http://php.net/manual/en/function.curl-share-setopt.php

CURL_LOCK_DATA_SSL_SESSION Paylar SSL oturum kimlikleri CURL_LOCK_DATA_SSL_SESSION

kullanabilirsiniz. Yukarıdaki açıklamadan okuyabilir gibi SSL oturum kimlikleri varsayılan

aynı sap içinde yeniden olduğunu Not, oturum kimliği aynı koldan yeniden kullanılır. Eğer kolları arasında paylaşmak istiyorsanız Ama

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

(el sıkışma devam)

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

o zaman farklı istekler arasında

$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 yeniden kullanabilirsiniz örneğin curl_share_init kullanmak ve daha sonra yeniden kullanabilirsiniz ve yakın bağlantıları

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

Ayrıca CURLOPT_SSLVERSION ve CURLOPT_SSL_CIPHER_LIST ile oynamanız da gerekiyor. Ayrıca, PHP'nin kendi tuhaflıkları olduğu gibi farklı bir dile geçmeniz gerektiğini düşünüyorum ve eğer tezi kanıtlarsanız ya da onaylamazsanız, çıplak metale daha yakın bir şey kullanmak daha iyidir, böylece ekstra katmanın (PHP) sizin kriterler. Her iki isteğin performansını ölçtüm ve biraz karşı sezgisel ama ikincisi neredeyse iki kat daha yavaş.

+1

Çözümünüz için teşekkürler, bu neredeyse onu nasıl uygulamaya koyduğum kadar! Ayrıca, tezim için php kullanmanın optimal olmadığını, ancak dilleri değiştirecek zamanım olmadığını da fark ettim. Bu söylüyorum, tezim üniversitem tarafından yayınlanacak. – Nicolas