Приложение PHP - Быстрое подключение к серверу HTTPS - PullRequest
1 голос
/ 31 октября 2010

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

Результаты следующие: fsockopen ():

  • Отправлено заголовков: 0,26755499839783;
  • Страница получена: 0,48934602737427;

CURL результаты:

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

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

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

Спасибо, Jonas

Ответы [ 3 ]

1 голос
/ 31 октября 2010

Нет точного решения вашего вопроса.

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

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

В любом случае...

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

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

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

0 голосов
/ 31 октября 2010

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

0 голосов
/ 31 октября 2010

Комментарий к вашему подходу в целом и ответ на ваш вопрос № 2:

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

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

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

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

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

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

Сторонапримечание: вы, возможно, уже знаете это, но при написании кода теста в php вам следует использовать функцию microtime с необязательным параметром, как показано ниже:

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

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

...