2010-04-19 4 views
6

У меня возникли некоторые проблемы с задержкой, созданной с помощью fgets, чтобы получить ответ сервера на некоторые вызовы пакетной базы данных, которые я делаю.PHP самый быстрый способ считывания ответа сервера

Я отправляю через партию, скажем, 10 000 звонков, и я отслеживаю отставание от fgets, заставляя задерживать скорость моего приложения, так как ответ на каждый вызов нужно схватить.

Я нашел эту нить http://bugs.php.net/bug.php?id=32806, объясняющую проблему довольно хорошо, но он читает файл, а не ответ сервера так fread может быть немного сложно, как я мог бы получить часть следующей строки, и дополнительный материал, который я дон Не хочу.

Итак, мой вопрос: какой лучший/самый быстрый способ прочитать ответ с сервера в качестве альтернативы fgets?

+0

Что вы спрашиваете? php-язык не имеет ничего общего с обработкой скорости, но для этого языка нет. – Svisstack

+0

И вы можете показать какой-то код? Какие вызовы базы данных? –

+0

- это вызовы на сервер Redis NoSQL –

ответ

0

Информация не совсем здесь.

Предположительно, вы имеете в виду, что вы используете какой-то PHP, который вызывает fgets для чтения в данных из чего-то другого - но что еще? Вы намекаете, что это не файл - так что это? Местная программа? труба? сетевой сокет? веб-страницу? ... что-то другое?

Можете ли вы прочитать это быстрее с помощью другого инструмента? Что вы пробовали? В какой операционной системе вы работаете? У вас есть доступ к оболочке для запуска netcat или аналогичного?

Также вы говорите о запаздывании, в то время как «ошибка», о которой вы говорите, в основном касается пропускной способности.

Не зная намного больше о проблеме, ее невозможно предложить решение.

C.

+0

Конечно, хорошие точки - им, используя фреймворк PHP (Predis), взаимодействовать с базой данных Redis. Похоже, что когда я отправляю пакет команд через соединение сокета от PHP до Redis, fgets, который используется для чтения ответа сервера Redis, вызывает отставание. В основном инфраструктура Predis использует fgets для чтения ответов с сервера, и там все время тратится - на отправку и получение данных по проводу. –

+0

Итак, следующий вопрос: как вы знаете, что проблема в конце PHP? Вы протестировали его с другим клиентом? Вы пытались запустить сокет как неблокирующий? – symcbean

+0

И вы уверены, что задержка находится в PHP, а не на стороне базы данных. –

2

file_get_contents (или stream_get_contents, если у вас есть поток) должен быть самым быстрым способом чтения ответа сервера. Ну, это самый быстрый способ получить данные, но часто это самый расточительный способ взглянуть на использование памяти, поскольку он считывает весь файл сразу в память, в то время как fgets не нужно хранить более одной строки в памяти.

Вы также используете fread, который быстрее, чем fgets, и который читает файл в кусках определенного размера, который вы можете определить.

Если вы зависите от чтения данных linewise, вы можете использовать файл(), который будет медленнее, чем file_get_contents, но который дает вам массив с строками файла.

Чтобы дать вам лучший ответ, как уже упоминалось выше, нам нужна дополнительная информация.