Использование file_get_contents — это перегрузка памяти при получении RSS-канала, но не обычный URL?

Я добываю некоторые данные из Yahoo RSS, но, похоже, происходит утечка памяти? Это довольно базар. Я собираю несколько источников с одним и тем же кодом, но RSS-канал Yahoo — единственный, который перегружает память. Это глупая версия кода, но, в основном, если вы запустите ее в нескольких экземплярах, это в конечном итоге приведет к сбою сервера, потому что у него не хватит памяти:

while(1) {
$get_rss = file_get_contents("https://feeds.finance.yahoo.com/rss/2.0/headline?s=AAPL&region=US&lang=en-US");
}

Однако, если вы запускаете этот же код из другого источника, он работает абсолютно нормально и стабильно, например:

while(1) {
$get_rss = file_get_contents("http://www.marketwatch.com/news/headline/getheadlines?ticker=AAPL&countryCode=US&dateTime=&docId=&docType=2007&sequence=bb90b87a-9f6f-4d70-9a1d-b052088523f5&messageNumber=0&count=10&channelName=%2Fnews%2Fpressrelease%2Fcompany%2Fus%2Faapl&topic=&_=1460832767208");
}

Может кто-нибудь объяснить мне это поведение? Я нахожу это довольно базарным / странным. Я обычно использую метод curl для извлечения содержимого URL, но переключился на этот file_get_contents, чтобы посмотреть, действовал ли он так же, и это так. Я пробовал простой XML, он также имеет такое же поведение. Я не понимаю?

Файлы RSS кэшируются в памяти? Я не понимаю, как / почему это произошло. Любая помощь / знания по этому вопросу будут оценены

2

Решение

Как и в @NoPro, ваш способ получения RSS-канала совершенно нестандартен, поскольку он может рассматриваться как атака, особенно если вы запускаете его в цикле. второй file_get_contents руководство утверждает, что он может потерпеть неудачу, если

Ошибка уровня E_WARNING генерируется, если имя файла не может быть найдено,
maxlength меньше нуля или при поиске указанного смещения в
поток терпит неудачу.

Поскольку вы сталкиваетесь с проблемой только с одним конкретным фидом Yahoo, я задаюсь вопросом, ограничены ли вы скоростью или ограничены серверами Yahoo. Они задерживают куски пакета и file_get_contents подождите немного дольше, оставаясь в памяти.

Скрипт Bash может потреблять меньше ресурсов, чем запускать его в браузере. К сожалению, когда я запустил это на моей локальной машине, я не увидел проблемы с памятью. Почему бы не запустить его один раз на другой машине или сервере с другим пулом IP.

3

Другие решения

RSS от Yahoo 34 KB в то время как ваш образец из другого источника 12 KB, Тем не менее, это слишком мало, чтобы вызвать ошибки памяти. Проблема лежит где-то еще. И нет, file_get_contents только получает указанный файл как последовательность байтов — его не волнует, что это за файл, и он ничего не кеширует.

2

Ваша петля выглядит немного в стиле пещерного человека. Если вы продолжаете опрашивать https-url без задержки в одном экземпляре, это может рассматриваться как плохое поведение, но если вы продолжаете опрашивать один и тот же ресурс одновременно в сотнях экземпляров, это очень раздражает и может даже рассматриваться как DDoS -atack.

Но причиной высокого потребления памяти может быть ssl-рукопожатие.

1
По вопросам рекламы [email protected]