Я добываю некоторые данные из Yahoo RSS, но, похоже, происходит утечка памяти? Это довольно базар. Я собираю несколько источников с одним и тем же кодом, но RSS-канал Yahoo — единственный, который перегружает память. Это глупая версия кода, но, в основном, если вы запустите ее в нескольких экземплярах, это в конечном итоге приведет к сбою сервера, потому что у него не хватит памяти:
while(1) {
$get_rss = file_get_contents("https://feeds.finance.yahoo.com/rss/2.0/headline?s=AAPL®ion=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 кэшируются в памяти? Я не понимаю, как / почему это произошло. Любая помощь / знания по этому вопросу будут оценены
Как и в @NoPro, ваш способ получения RSS-канала совершенно нестандартен, поскольку он может рассматриваться как атака, особенно если вы запускаете его в цикле. второй file_get_contents руководство утверждает, что он может потерпеть неудачу, если
Ошибка уровня E_WARNING генерируется, если имя файла не может быть найдено,
maxlength меньше нуля или при поиске указанного смещения в
поток терпит неудачу.
Поскольку вы сталкиваетесь с проблемой только с одним конкретным фидом Yahoo, я задаюсь вопросом, ограничены ли вы скоростью или ограничены серверами Yahoo. Они задерживают куски пакета и file_get_contents
подождите немного дольше, оставаясь в памяти.
Скрипт Bash может потреблять меньше ресурсов, чем запускать его в браузере. К сожалению, когда я запустил это на моей локальной машине, я не увидел проблемы с памятью. Почему бы не запустить его один раз на другой машине или сервере с другим пулом IP.
RSS от Yahoo 34 KB
в то время как ваш образец из другого источника 12 KB
, Тем не менее, это слишком мало, чтобы вызвать ошибки памяти. Проблема лежит где-то еще. И нет, file_get_contents
только получает указанный файл как последовательность байтов — его не волнует, что это за файл, и он ничего не кеширует.
Ваша петля выглядит немного в стиле пещерного человека. Если вы продолжаете опрашивать https-url без задержки в одном экземпляре, это может рассматриваться как плохое поведение, но если вы продолжаете опрашивать один и тот же ресурс одновременно в сотнях экземпляров, это очень раздражает и может даже рассматриваться как DDoS -atack.
Но причиной высокого потребления памяти может быть ssl-рукопожатие.