2016-05-13 12 views
9

Sto scrivendo un client php multithread che fa una richiesta https a un proxy inverso di Apache e misura alcune statistiche. Sto scrivendo una tesi di laurea sul miglioramento delle prestazioni con la ripresa della sessione TLS. Ora ho bisogno di fare una dimostrazione del concetto che lo dimostri/lo smentisca. Al momento ho questo codice:TLS Session Ripr. In 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); 

questo codice funziona per fare una stretta di mano piena, ma io non riesco a capire come fare una stretta di mano ripreso in php?

Qualsiasi aiuto sarebbe molto apprezzato!

+1

... o smentisce. :) – bishop

+0

file_get_contents() chiude la connessione TCP immediatamente dopo la richiesta ... di solito. Ha bisogno di intestazioni di connessione keep-alive e fopen() con un handle ... Purtroppo non ho abbastanza tempo per indagare in questo momento: -/ – bwoebi

risposta

5

Si può provare PHP curl e utilizzare CURL_LOCK_DATA_SSL_SESSION

dalla documentazione di PHP http://php.net/manual/en/function.curl-share-setopt.php

ID di sessione

CURL_LOCK_DATA_SSL_SESSION Azioni SSL, riducendo il tempo speso per l'handshake SSL quando si ricollega allo stesso server. Si noti che ID di sessione SSL vengono riutilizzati all'interno della stessa maniglia di default

Come si può leggere dalla descrizione di cui sopra, l'ID di sessione viene riutilizzato dalla stessa maniglia. Ma se si desidera condividere tra le maniglie è possibile utilizzare curl_share_init ad esempio

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

allora si può riutilizzare $sh fra diverse richieste

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

e poi riutilizzare (ripreso la stretta di mano)

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

e chiudi i collegamenti

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

Ma devi anche giocare con CURLOPT_SSLVERSION e CURLOPT_SSL_CIPHER_LIST. Inoltre, penso che dovresti passare a una lingua diversa dal momento che PHP ha le sue peculiarità, e se provi o confuti la tesi, è meglio usare qualcosa di più vicino al bare metal in modo da essere sicuro che il livello aggiuntivo (PHP) non infrange il tuo parametri di riferimento. Ho misurato le prestazioni di entrambe le richieste ed è un po 'contro-intuitivo, ma il secondo è quasi due volte più lento.

+1

Grazie per la soluzione, è quasi esattamente come ho finito per implementarlo! E ho anche capito che non era ottimale usare php per la mia tesi, ma non avevo tempo per cambiare lingua. Detto questo, la mia tesi sarà pubblicata dal mio college. – Nicolas