PHP / Завихрение: ГЛАВНЫЙ Запрос занимает много времени на некоторых сайтах

Как насчет этого с отрицательным прогнозом и задним числом с положительным результатом ,

(?)This Text needed(?!<\/a>)

. regex101.com/r/RT5LZu/1

25
задан bignose 1 May 2009 в 04:15
поделиться

3 ответа

Try simplifying it a little bit:

print htmlentities(file_get_contents("http://www.arstechnica.com"));

The above outputs instantly on my webserver. If it doesn't on yours, there's a good chance your web host has some kind of setting in place to throttle these kind of requests.

EDIT:

Since the above happens instantly for you, try setting this curl setting on your original code:

curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, true);

Using the tool you posted, I noticed that http://www.arstechnica.com has a 301 header sent for any request sent to it. It is possible that cURL is getting this and not following the new Location specified to it, thus causing your script to hang.

SECOND EDIT:

Curiously enough, trying the same code you have above was making my webserver hang too. I replaced this code:

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'

With this:

curl_setopt($ch, CURLOPT_NOBODY, true);

Which is the way the manual recommends you do a HEAD request. It made it work instantly.

43
ответ дан 28 November 2019 в 20:33
поделиться

Если мой память не подводит меня, если выполнить запрос HEAD в CURL, изменив версию протокола HTTP на 1.0 (что является медленной и, вероятно, виновной частью), попробуйте изменить это на:

$ch = curl_init();
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt ($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);

// Only calling the head
curl_setopt($ch, CURLOPT_HEADER, true); // header will be at output
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); // HTTP request is 'HEAD'
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1); // ADD THIS

$content = curl_exec ($ch);
curl_close ($ch);
4
ответ дан 28 November 2019 в 20:33
поделиться

Вы должны помнить, что HEAD - это всего лишь предложение для веб-сервера. Чтобы HEAD делал правильные вещи, часто требуются определенные усилия со стороны администраторов. Если вы НАЧИНАЕТЕ статический файл, Apache (или любой другой веб-сервер) часто вмешивается и делает правильные вещи. Если вы возглавляете динамическую страницу, по умолчанию для большинства установок используется выполнение пути GET, сбор всех результатов и просто отправка заголовков без содержимого. Если это приложение настроено на 3 (или более) уровня, этот вызов потенциально может быть очень дорогим и ненужным для контекста HEAD. Например, в Java-сервлете по умолчанию doHead () просто вызывает doGet (). Чтобы сделать что-то более разумное для приложения, разработчик должен явно реализовать doHead () (и чаще всего они этого не сделают).

Я столкнулся с приложением от компании из списка 100, которое используется для загрузки нескольких сотен мегабайт информации о ценах. Мы будем проверять наличие обновлений этих данных, выполняя запросы HEAD довольно регулярно, пока дата изменения не изменится. Оказывается, что этот запрос будет фактически вызывать внутренние вызовы для генерации этого списка каждый раз, когда мы выполняем запрос, который включает гигабайты данных на их внутреннем конце и пересылает его между несколькими внутренними серверами. Они не были очень довольны нами, но как только мы объяснили сценарий использования, они быстро нашли альтернативное решение. Если бы они внедрили HEAD, вместо того чтобы полагаться на свой веб-сервер для фальсификации, это не было бы проблемой.

d проверять наличие обновлений этих данных, выполняя запросы HEAD довольно регулярно, пока не изменилась дата изменения. Оказывается, что этот запрос будет фактически вызывать внутренние вызовы для генерации этого списка каждый раз, когда мы выполняем запрос, который включает гигабайты данных на их внутреннем конце и пересылает его между несколькими внутренними серверами. Они не были очень довольны нами, но как только мы объяснили сценарий использования, они быстро нашли альтернативное решение. Если бы они внедрили HEAD, вместо того чтобы полагаться на свой веб-сервер для фальсификации, это не было бы проблемой.

d проверять наличие обновлений этих данных, выполняя запросы HEAD довольно регулярно, пока не изменилась дата изменения. Оказывается, что этот запрос будет фактически вызывать внутренние вызовы для генерации этого списка каждый раз, когда мы выполняем запрос, который включает гигабайты данных на их внутреннем конце и пересылает его между несколькими внутренними серверами. Они не были очень довольны нами, но как только мы объяснили сценарий использования, они быстро нашли альтернативное решение. Если бы они внедрили HEAD, вместо того чтобы полагаться на свой веб-сервер для фальсификации, это не было бы проблемой.

Они не были очень довольны нами, но как только мы объяснили сценарий использования, они быстро нашли альтернативное решение. Если бы они внедрили HEAD, вместо того чтобы полагаться на свой веб-сервер для фальсификации, это не было бы проблемой.

Они не были очень довольны нами, но как только мы объяснили сценарий использования, они быстро нашли альтернативное решение. Если бы они внедрили HEAD, вместо того чтобы полагаться на свой веб-сервер для фальсификации, это не было бы проблемой.

7
ответ дан 28 November 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: