Лучшая поддержка CURL с PHP и Linux - PullRequest
2 голосов
/ 12 декабря 2008

Я разработчик twittertrend.net, мне было интересно, есть ли более быстрый способ получить заголовки URL, кроме выполнения curl_multi? Я обрабатываю более 250 URL-адресов в минуту, и мне нужен действительно быстрый способ сделать это с точки зрения PHP. Можно использовать сценарий bash и затем выводить заголовки или приложение C, что может быть быстрее? Я в основном только программировал на PHP, но я могу учиться. В настоящее время CURL_MULTI (с 6 URL-адресами, предоставленными одновременно, работает нормально, но я бы предпочел что-то быстрее? В конечном счете, я хотел бы придерживаться PHP для любого хранения и обработки MySQL.

Спасибо, Джеймс Хартиг

Ответы [ 7 ]

2 голосов
/ 27 января 2009

Я недавно написал сообщение в блоге о том, как ускорить curl_multi. По сути, я обрабатываю каждый запрос, как только он заканчивается, и использую очередь для одновременного выполнения большого количества запросов. У меня был хороший успех с этой техникой, и я использую ее для обработки ~ 6000 RSS-каналов в минуту. Надеюсь, это поможет!

http://onlineaspect.com/2009/01/26/how-to-use-curl_multi-without-blocking/

1 голос
/ 12 декабря 2008

Я думаю, вам нужен многопроцессорный демон выборки URL. PHP не поддерживает многопоточность, но ничто не мешает вам создавать несколько процессов PHP-демонов.

Сказав это, отсутствие надлежащего сборщика мусора в PHP означает, что долго работающие процессы могут привести к утечке памяти.

Запустите демон, который порождает множество экземпляров (настраиваемое, но контролируемое число) программы php, которая, конечно, должна быть способна читать рабочую очередь, извлекать URL и записывать результаты таким образом, многопроцессно безопасен; несколько проков не должны заканчиваться попыткой сделать ту же работу.

Вы хотите, чтобы все это работало автономно как демон, а не с веб-сервера. На самом деле.

1 голос
/ 12 декабря 2008

curl_multi + эти варианты, вероятно, лучшая ставка для вас:

curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_NOBODY, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);

Единственным другим вариантом может быть использование wget с

--server-response

, а затем многопоточность с использованием C / C ++, Java и т. Д. Я не уверен, что в конечном итоге это будет более быстрый вариант.

1 голос
/ 12 декабря 2008

re: threading-via-bash-script, это возможно, но маловероятно: накладные расходы на создание процесса для такого сценария, вероятно, убьют скорость.

Если вам это нужно, запустите демон, который ничего не делает, кроме такого разрешения, а затем подключитесь к нему локально. Затем вы можете поработать над тем, чтобы этот демон делал это как можно быстрее, на C или C ++ или чем-то еще.

1 голос
/ 12 декабря 2008

Самый простой способ получить заголовки URL-адреса с помощью get_headers () . С точки зрения производительности, я не думаю, что вы можете победить curl_multi, но попробуйте сравнить его и посмотреть. Трудно сказать.

0 голосов
/ 12 декабря 2008

Хорошо, я понял следующее: get_headers = 0,0606 с на URL cURL = .01235 на URL gethostbynamel = .001025 с на URL

То, что я собираюсь сделать, это сначала запустить gethostbynamel (), а затем cURL, это должно уменьшить время, потому что это будет постоянно разрешать хост, и, таким образом, cURL не придется застревать при загрузке URL.

Есть возражения?

0 голосов
/ 12 декабря 2008

Если вы не возражаете заниматься действительно низкоуровневыми вещами, вы можете отправлять конвейерные необработанные запросы HTTP 1.1, используя функции сокетов.

Было бы полезно узнать, где находится узкое место в том, что вы сейчас используете - сеть, процессор и т. Д. *

...