Длительный PHP скребок возвращает 500 внутренних ошибок - PullRequest
3 голосов
/ 22 сентября 2011

В основном я нахожу ответы на свои вопросы в Google, но теперь я застрял.Я работаю над сценарием скребка, который сначала очищает некоторые имена пользователей веб-сайта, а затем получает все детали пользователя.задействованы два скребка: первый проходит через главную страницу, получает первое имя, затем получает информацию о странице своего профиля, затем он переходит на следующую страницу ... первый сайт, который я очищаю, имеет в общей сложности64 имени отображаются на одной главной странице, а на второй - 4 страницы с отображением более 365 имен.

первое работает отлично, однако второе продолжает выдавать мне 500 внутренних ошибок.Я пытался ограничить сценарий, чтобы очистить только несколько имен, что работает как шарм, поэтому я более чем уверен, что сам сценарий в порядке!max_execution_time в моем php ini-файле установлено на 1500, так что я думаю, что это тоже не проблема, однако есть что-то, вызывающее ошибку ... не уверен, что добавление команды сна после каждых 10 имен, например, решит мою ситуацию, ноЧто ж, я пытаюсь сделать это сейчас!

, так что если у кого-нибудь из вас есть какие-либо идеи, которые помогут решить эту ситуацию, я был бы признателен за вашу помощь!

заранее спасибо, z

Ответы [ 2 ]

0 голосов
/ 08 июня 2012
Поддержка

говорит, что я могу увеличить объем памяти до 4 гигабайт

Типичный ответ службы поддержки по выдавливанию денег.Экономьте свои деньги и пишите лучший код, потому что то, что вы делаете, может быть легко запущено с общего сервера бесплатного веб-хостинга даже при ограниченных ресурсах.

Сначала получите / обновите список пользователей как одну работузатем извлекайте детали небольшими партиями как другую.Используйте команду SQL BULK Insert, чтобы уменьшить количество соединений с базой данных.Кроме того, он работает намного быстрее, чем циклически проходя через отдельные INSERTS.

Имена пользователей и детали, по сути, представляют собой статический список, поэтому нет никакой необходимости получать все данные в реальном времени.Просто откусите cronjob, извлекающий детали, и в конце концов сценарий догонит новые имена пользователей, добавленные во входящий список, и вы получите более быструю, более гибкую и эффективную систему.

0 голосов
/ 08 июня 2012

Это определенно проблема с памятью.Одна из ваших переменных выходит за пределы лимита памяти, который вы определили в php.ini.Если вам нужно хранить огромное количество данных, я бы рекомендовал записывать ваши результаты в файл и / или БД через регулярные промежутки времени (а затем освобождать ваши переменные) вместо того, чтобы хранить их все в памяти во время выполнения.

  1. получить данные пользователя
  2. дамп в файл
  3. очистить переменные
  4. повторить ..

Если вы установили исполнениеВремя до бесконечности и регулярный сброс VAR в файл / DB. PHP-скрипт должен работать в течение нескольких часов.

...