2010-10-31 4 views
1

Проблема в том, что я хочу разработать приложение (возможно, PHP?), Способное быстро подключаться к защищенному сервером SSL и отправлять/получать данные от него. Моя цель - заставить его отправить запрос и прочитать результат как можно быстрее. Я использую различные решения и сравниваю их. Я пробовал fsockopen() и CURL, однако, задаваясь вопросом, есть ли какие-либо решения, как я мог бы их улучшить?Приложение PHP - Быстрое подключение к серверу HTTPS

Результаты таковы: fsockopen():

  • Заголовки отправлено: 0.26755499839783;
  • Полученная страница: 0.48934602737427;

Результаты Скручивание

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

Вопросы являются: 1) Когда запрос запускается на сервере, к которому я подключаюсь - после отправки заголовков или после закрытия страницы и соединений? 2) Который является временем exect CURL, которому я должен сравнивать результат fsockopen()? Является ли starttransfer_time еще до отправки заголовков на сервер? Это означает, что fsockopen() быстрее, не так ли? 3) Любые решения по настройке SSL-соединения на сервере, на котором выполняется код? Любые настройки, доступные OpenSSL-модулю PHP (любые возможные понижения крипто?), Чтобы сделать это быстрее? 4) Любое решение для перехода без SSL на защищенный SSL-сервер? 5) Может ли C++ или другое решение быть быстрее в этом случае?

Любые идеи приветствуются :) Я был одержим этим «мс» гонки :)

Спасибо, Jonas

+0

Мне нужно найти решение, как быстро сделать рукопожатие. Кажется, я больше не могу улучшить соединительную часть;) – flyeris

ответ

1

Там нет близко форма решения вашего вопроса.

О C++, это правда, что PHP интерпретируется, а C++ скомпилирован + оптимизирован, но все крипто-библиотеки в PHP находятся на простом C, поэтому скомпилированы + оптимизированы.

Выполнение более короткого ключа сервера немного облегчает фазу установления связи, в зависимости от аппаратного обеспечения сервера. Кроме того, самое главное, все сетевые протоколы, которые полагаются на TCP, зависят от сетевых задержек при обработке транзакций, которые отличаются поведением от передачи данных (например, FTP) из-за того, что они синхронизированы.

Во всяком случае ...

1.You должны закрыть соединение вручную

4.Unless вы хотите написать полный протокол SSL самостоятельно, лучше использовать самую производительную библиотеку доступной, OpenSSL

5. Да и нет, по крайней мере, вы можете увеличить производительность, но, возможно, не значительно.В общем, я бы рекомендовал его

+0

1. Кажется, что код запускается, как только вы отправляете заголовки и выполняетесь перед тем, как начать получать данные. вполне логично. выходная страница должна быть сгенерирована ранее: – flyeris

+0

P.S. любые идеи, как сделать более короткий ключ сервера для рукопожатия? – flyeris

+0

Даже если вы сделаете это 512 байт, минимальный, handshare требуется некоторое время. Фракции секунд, но все еще ВРЕМЯ ... –

0

комментарий на вашем подходе, в общем, и ответ на ваш вопрос # 2:

При создании тестов (т.е. сравнения относительной эффективности двух или более различных технологии), вы не должны полагаться на информацию о времени, о которой сообщает сама технология. Основная причина заключается в том, что это сложно (если вы не собираетесь копать через сторонний код), чтобы точно знать , что сообщается, и, конечно же, нет никакого способа сделать точное сравнение между двумя значениями, которые не могут быть гарантированы такое же измерение.

Вместо этого, вы должны сделать следующее:

  • пишут два фрагмента кода, которые функционально идентичны, другими словами, они делают одно и то же, с тем же алгоритмом, работающие на тех же данных , и т. д. и т. д. - с той лишь разницей, что одна использует одну технологию (например, fsockopen), а другая использует другую технологию (например, CURL).

  • Теперь оберните оба фрагмента кода в идентичные циклы, которые будут вызывать код несколько раз в течение некоторого большого количества раз (например, 1000). Вы хотите, чтобы ваше общее время выполнения составляло примерно 10 секунд или более для каждой партии испытаний.

  • , наконец, оберните каждый цикл (тот, который пытается CURL, и отдельный, который пытается fsockopen) в двух идентичных битах кода синхронизации. Просто запишите время (в миллисекундах или микросах) до начала цикла, затем запустите все циклы цикла, затем снова запишите время и вычтите.

  • Это даст вам более представительную картину того, насколько хорошо эти две технологии действительно выполняются. Вы можете разделить свои последние времена на количество итераций в вашем цикле, если хотите, но это не обязательно, если оба теста выполняли одинаковое количество итераций.

Side Примечание: Возможно, вы уже знаете, но при написании код тестов в PHP, вы должны использовать функцию микропоры с дополнительным параметром, следующим образом:

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

необязательный параметр на микропоры доступен только в php> 5.0, поэтому, если вы все еще находитесь на php 4.x, вам придется записывать два раза в виде строк, а затем выполнять синтаксический анализ после факта, чтобы получить их в числах, чтобы вы могли делайте математику с ними. См. php docs for microtime() для получения более подробной информации.

+0

Это именно то, что я делаю.Я не могу сравнивать cURL пошагово, как с fsockopen(), но конечный результат с fsockopen() кажется более быстрым. – flyeris

0

Вы можете использовать обертку https fopen()stream_context_create()), хотя я не знаю, если она быстрее других двух или нет.

+0

спасибо за идею. другие методы быстрее :) – flyeris

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