Intereting Posts
Как получить все записи после одного с идентификатором в symfony? Почему разработчики PHP не могут предоставить функцию setlocale в соответствии с областью потоков Модуль Zend Forms включает пути Извлечение данных через две модельные соотношения Eclipse и Zend Debugger всегда ломаются в первой строке, несмотря на то, что эта опция не установлена Загрузка строки в виде кода? Периодически обновлять копию базы данных MySQL CodeIgniter в отчетах об ошибках 1 и 1 Попытка добавить строку в электронную таблицу Google в PHP Laravel – принудительный выход определенного пользователя по идентификатору пользователя Создание Eclipse для просмотра разных расширений файлов как PHP Драйвер файлов CI_Session (ошибка PHP) Мой тег заголовка php не будет перенаправлен Установка Composer в глобальном масштабе для использования laravel? Symfony2: прерывистое высокое время отклика / медленное завершение SessionHandlerProxy :: read ()

php / timeout / соединение с перезагрузкой сервера?

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

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

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

Таким образом, существует много циклов, вставки 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.