php / timeout / подключение к серверу перезагрузить? - PullRequest
5 голосов
/ 23 октября 2009

У меня есть скрипт php, который нужно запустить довольно долго.

Что делает скрипт:

  • подключается к mysql
  • инициирует от 100 до 100 000 запросов cURL
  • каждый запрос cURL возвращает компактно-декодированные данные от 1 до 2000 списков недвижимости - я использую preg-match-all, чтобы получить все данные и сделать одну вставку mysql для каждого листинга. каждый запрос никогда не превышает 1 МБ данных.

Так что происходит много циклов, вставок mysql и запросов curl. Безопасный режим php отключен, и я могу успешно установить максимальное время выполнения в ii_set, чтобы позволить моему скрипту работать до конца.

Что ж, моя проблема в том, что скрипт или apache, или что-то имеет инсульт в середине скрипта, и экран переходит к экрану "соединение с сервером было сброшено".

Есть идеи?

Ответы [ 6 ]

4 голосов
/ 23 октября 2009

Что ж, несмотря на то, что попытки 100 000 запросов cURL абсолютно безумны, вы, вероятно, достигли предела памяти.

Попробуйте установить ограничение памяти на что-то более разумное:

ini_set('memory_limit', '256M');

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

Вместо этого просто установите его на 0, что функционально эквивалентно полному отключению предела выполнения:

ini_set('max_execution_time', 0);
3 голосов
/ 23 октября 2009

Множество идей:

1) Не делайте этого внутри HTTP-запроса. Напишите php-скрипт командной строки, чтобы управлять им. При необходимости вы можете использовать веб-скрипт, чтобы запустить его.

2) Вы должны иметь возможность установить max_execution_time на ноль (или вызвать set_time_limit (0)), чтобы гарантировать, что вас не отключат за превышение лимита времени

3) Звучит так, будто вы действительно хотите преобразовать это в нечто более разумное. Подумайте о том, чтобы настроить небольшую систему организации очередей на работу и иметь скрипт php, который заставит нескольких детей пережить всю работу.

Как говорит Джош, посмотрите на ваш error_log и выясните, почему вас закрывают прямо сейчас. Попытайтесь выяснить, сколько памяти вы используете - это может быть проблемой. Попробуйте установить max_execution_time на ноль. Может быть, это приведет вас туда, где вам нужно быть быстро.

Но в долгосрочной перспективе кажется, что у вас слишком много работы внутри одного http-запроса. Возьми это из http, и разделяй и властвуй!

1 голос
/ 16 февраля 2012

У меня была такая же проблема, когда я получал данные из MySQL через PHP, которые содержали специальные символы, такие как umlauts ä, ö, ü, амперсанды и т. Д. Соединение было сброшено, и я не нашел ошибок ни в журнале apache, ни в журналах php. Сначала я убедился в PHP, что правильно обращался к символам, установленным в БД, с помощью:

mysql_query("SET NAMES 'latin1' COLLATE 'latin1_german2_ci'");

mysql_query("SET CHARACTER SET 'latin1'");

Then, finally, I resolved the problem with this line in PHP:

mysql_query("SET character_set_connection='latin1'");
1 голос
/ 23 октября 2009

Вы можете установить тайм-аут на неопределенный срок, изменив свой PHP.ini и установив переменную выполнения скрипта.

Но вы также можете рассмотреть небольшое изменение архитектуры. Сначала рассмотрим подход «Запусти и забудь» при получении 100 000 запросов curl. Во-вторых, рассмотрите возможность использования "wget" вместо curl.

Вы можете выполнить простое «wget URL -o UniqueFileName &». Это приведет к извлечению веб-страницы, сохранению ее с «уникальным» именем файла и всем в фоновом режиме.

Затем вы можете выполнять итерацию по каталогу файлов, выполнять поиск данных (preg_matching) и выполнять вызовы из вашей БД. Перемещайте файлы по мере их обработки в архив и продолжайте итерацию до тех пор, пока файлов больше не будет.

Думайте о каталоге как о «очереди», и один процесс просто обрабатывает файлы. Попросите второй процесс просто выйти и взять данные веб-страницы. Вы можете добавить третий процесс, который может быть вашим «монитором», который работает независимо и просто сообщает статистику моментальных снимков. Два других могут быть просто «веб-сервисами» без интерфейса.

Этот тип многопоточности действительно мощен и очень мало используется ИМХО. Для меня это истинная сила сети.

0 голосов
/ 23 октября 2009

100 000 запросов cURL ??? Ты безумец. Разбейте эти данные!

0 голосов
/ 23 октября 2009

Что в apache error_log? Достигаете ли вы предела памяти?

РЕДАКТИРОВАТЬ: похоже, вы достигли предела памяти. У вас есть доступ к PHP.ini? Если это так, вы можете поднять там memory_limit . Если нет, попробуйте запустить двоичные файлы curl или wget с использованием функций exec или shell_exec, чтобы они выполнялись как отдельные процессы, не используя память PHP.

...