2010-10-31 14 views
1

Le problème est, ce que je veux développer une application (probablement PHP?), Capable de faire une connexion rapide à un serveur sécurisé SSL et envoyer/obtenir des données de celui-ci. Mon but est de le faire envoyer la requête et lire le résultat le plus rapidement possible. J'essaie différentes solutions et les compare toutes. J'ai essayé fsockopen() et CURL, cependant, se demandant s'il y a des solutions comment je pourrais les améliorer?Application PHP - Connexion rapide au serveur HTTPS

Les résultats sont les suivants: fsockopen():

  • têtes envoyés: 0,26755499839783;
  • Page reçue: 0.48934602737427;

résultats CURL:

  • [TOTAL_TIME] => 0,484
  • [pretransfer_time] => 0,281
  • [starttransfer_time] => 0,437

Les questions sont: 1) Lorsque la requête est lancée pour s'exécuter sur le serveur auquel je me connecte - après l'envoi des en-têtes ou après la fermeture de la page et des connexions? 2) Quelle est l'heure exacte de CURL à laquelle je devrais comparer le résultat de fsockopen()? Starttransfer_time est-il avant même que les en-têtes ne soient envoyés au serveur? Cela voudrait dire que fsockopen() est plus rapide, n'est-ce pas? 3) Des solutions pour tordre la connectivité SSL sur le serveur, sur lequel le code est exécuté? Toutes les modifications possibles au module OpenSSL de PHP (des downgrades possibles de crypto?) Pour le rendre plus rapide? 4) Toute solution pour aller sans SSL au serveur sécurisé SSL? 5) C++ ou autre solution serait-elle plus rapide dans ce cas?

Toutes les idées sont les bienvenues :) Je suis obsédé par cette course "ms" :)

Merci, Jonas

+0

J'ai besoin de trouver une solution, comment rendre la partie prise de contact plus rapide. Il semble que je ne puisse plus améliorer la partie connexion;) – flyeris

Répondre

1

Il n'y a pas de solution close-forme à votre question. A propos de C++, il est vrai que PHP est interprété et que C++ est compilé + optimisé, mais toutes les bibliothèques crypto en PHP sont en langage C, donc compilées + optimisées.

La création d'une clé de serveur plus courte permet de réduire un peu la phase de prise de contact, en fonction du matériel du serveur. Aussi, le plus important, tous les protocoles réseau qui dépendent de TCP sont affectés par les retards de réseau lors du traitement des transactions, qui sont différents dans le comportement des transferts de données (comme FTP) en raison du fait qu'ils sont synchronisés.

... Quoi qu'il en soit

1.You doivent fermer la connexion manuellement

4.Unless vous voulez écrire le protocole complet SSL par vous-même, mieux utiliser la bibliothèque la plus performante disponible, OpenSSL

5. Oui et non, au moins vous pouvez obtenir une augmentation de performance mais peut-être pas significative.En général, je le recommande

+0

1. Il semble que le code soit lancé une fois que vous avez envoyé des en-têtes et que vous les exécutiez avant de commencer à recevoir des données. assez logique. la page de sortie doit être générée avant d'afficher :) – flyeris

+0

P.S. des idées comment faire la clé du serveur plus courte pour la poignée de main? – flyeris

+0

Même si vous faites 512 octets, le minimum, le partage de mains nécessite un certain temps. Fractions de secondes mais toujours le temps ... –

0

Un commentaire sur votre approche, en général, et une réponse à votre question n ° 2:

Lorsque vous créez des repères (comparaison de la performance relative de deux ou plusieurs différents options technologiques), vous ne devriez pas compter sur les informations de synchronisation qui sont rapportées par la technologie elle-même. La raison principale est qu'il est difficile (à moins que vous ne creusez le code d'un tiers) de connaître exactement ce que est signalé, et bien sûr, il n'y a aucun moyen de faire une comparaison exacte entre deux valeurs qui ne peuvent être garanties représenter la même mesure.

Au lieu de cela, vous devez effectuer les opérations suivantes:

  • écrire deux morceaux de code qui sont fonctionnellement identiques en d'autres termes, ils font exactement la même chose, avec le même algorithme, fonctionnant sur les mêmes données , etc, etc ... à la seule différence que l'on utilise une technologie (par exemple, fsockopen), tandis que l'autre utilise l'autre technologie (par exemple CURL).

  • Maintenant, enveloppez les deux morceaux de code dans des boucles identiques qui appellent le code à plusieurs reprises pendant un grand nombre de fois (par exemple 1000). Vous voulez que votre temps d'exécution total soit de l'ordre de 10 secondes ou plus pour chaque lot d'essais. Enfin, enveloppez chaque boucle (une qui essaie CURL, et une autre qui essaie fsockopen) dans deux bits de code de temps identiques. Il suffit de capturer l'heure (en millis ou micros) avant de démarrer la boucle, puis d'exécuter tous les cycles de la boucle, puis de capturer à nouveau l'heure et soustraire. Cela vous donnera une image beaucoup plus représentative de la performance réelle des deux technologies. Vous pouvez diviser vos temps finaux par le nombre d'itérations dans votre boucle si vous le souhaitez, mais il n'est pas nécessaire de le faire tant que les deux tests ont le même nombre d'itérations.

Side note: Vous savez peut-être, mais lors de l'écriture du code de référence en php, vous devez utiliser la fonction microtime avec le paramètre optionnel, comme suit:

<?php 
    $start = microtime(true); 
    /* run benchmark code */ 
    $elapsed = microtime(true) - $start; 
    echo("elapsed time: {$elapsed} microseconds"); 

le paramètre en option sur microtime est seulement disponible en php> 5.0, donc si vous êtes encore sur php 4.x, alors vous devrez stocker les deux fois en tant que chaînes, puis faire un peu d'analyse après le fait afin de les mettre en nombres afin que vous puissiez fais des maths avec eux. Voir php docs for microtime() pour plus de détails.

+0

c'est exactement ce que je fais.Je ne peux pas comparer cURL dans les étapes comme avec fsockopen(), mais le résultat final avec fsockopen() semble être plus rapide. – flyeris

0

Vous pouvez utiliser l'emballage https fopen() (avec stream_context_create()), bien que je ne sais pas si c'est plus rapide que les deux autres ou non.

+0

merci pour l'idée. d'autres méthodes sont plus rapides :) – flyeris