У меня есть php-скрипт, который нужно запускать довольно долго.
Что делает скрипт:
Таким образом, существует много циклов, вставки mysql и запросы на завивание. Безопасный режим php отключен, и я могу успешно выполнить ini_set max-execute-time до чего-то смешного, чтобы позволить моему сценарию работать полностью.
Ну, моя проблема – это скрипт или apache, или что-то имеет штрих в середине скрипта, и экран переходит на экран «соединение с сервером был сброшен».
Есть идеи?
Ну, не обращая внимания на то, что попытка 100 000 запросов cURL абсолютно безумна, вы, вероятно, попадаете в пределы памяти.
Попробуйте установить ограничение памяти на что-то более разумное:
ini_set('memory_limit', '256M');
И как побочный совет, не устанавливайте время выполнения на что-то смехотворное, скорее всего, вы в конце концов найдете способ ударить его скриптом вроде этого. ;]
Вместо этого просто установите его в 0
, он функционально эквивалентен полностью отключению предела выполнения:
ini_set('max_execution_time', 0);
Много идей:
1) Не делайте этого внутри HTTP-запроса. Напишите сценарий php для командной строки, чтобы управлять им. Вы можете использовать скрипт, связанный с веб-сайтами, для его запуска, если это необходимо.
2) Вы должны иметь возможность установить max_execution_time в ноль (или вызвать set_time_limit (0)), чтобы гарантировать, что вы не будете закрыты для превышения лимита времени
3) Похоже, вы действительно хотите реорганизовать это в нечто более нормальное. Подумайте о том, как создать небольшую систему очередей и иметь скрипт php, который разворачивает нескольких детей, чтобы пережевывать всю работу.
Как говорит Джош, посмотрите на свой error_log и посмотрите, почему вы сейчас закрыты. Попытайтесь выяснить, сколько памяти вы используете – это может быть проблемой. Попробуйте установить max_execution_time на ноль. Может быть, это приведет вас туда, где вам нужно быть быстро.
Но в конечном итоге это звучит так, будто у вас слишком много работы, чтобы делать внутри одного HTTP-запроса. Выньте это из http, разделите и победите!
Вы можете установить тайм-аут как неопределенный, изменив свой PHP.ini и установив переменную выполнения скрипта.
Но вы также можете рассмотреть небольшое изменение архитектуры. Сначала рассмотрим подход «Запуск и забвение» при получении 100 000 запросов на завивание. Во-вторых, рассмотрите возможность использования «wget» вместо curl.
Вы можете создать простой « wget URL -o UniqueFileName &
». Это позволит получить веб-страницу, сохранить ее в «уникальном» имени файла и все в фоновом режиме.
Затем вы можете перебирать каталог файлов, greping (preg_matching) данных и делать свои вызовы БД. Переместите файлы при их обработке в архив и продолжайте выполнять итерацию до тех пор, пока не будет больше файлов.
Подумайте о каталоге как о «очереди» и попросите один процесс просто обработать файлы. У вас есть второй процесс, который просто выходит и захватывает данные веб-страницы. Вы можете добавить третий процесс, который может быть «монитором», который работает независимо и просто сообщает статистику моментального снимка. Остальные два могут быть просто «веб-сервисами» без интерфейса.
Этот тип многопоточности действительно мощный и сильно недоиспользуемый IMHO. Для меня это истинная сила Интернета.
У меня была та же проблема, когда вы получали данные из 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'");
100 000 запросов cURL ??? Ты безумец. Перерыв данных!
Что находится в apache error_log? Достигаете ли вы предела памяти?
EDIT: Похоже, вы достигли предела вашей памяти. У вас есть доступ к PHP.ini? Если это так, вы можете поднять там memory_limit . Если нет, попробуйте запустить curl или wget двоичные файлы с помощью функций exec
или shell_exec
, таким образом они запускаются как отдельные процессы, а не используют память PHP.