Потенциальные проблемы с очень длинным скриптом PHP - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть PHP-скрипт, который запускается раз в день, и на его запуск уходит добрые 30 минут (я думаю).Все там безопасно и надежно.Я продолжаю получать ошибку 500 примерно через 10 ~ 15 минут.Однако я ничего не вижу в журналах и т. Д., Поэтому я немного растерялся.

Пока что я установил как «неограниченный»:

  • max_execution_time
  • max_input_time
  • default_socket_timeout

Также установите для них непристойно большие цифры только для этого раздела (папки, в которой выполняется скрипт)

  • memory_limit
  • post_max_size

Природаэтого сценария - API-интерфейс типа SOAP, который импортирует тысячи строк данных из сторонних URL-адресов, помещает их в локальную таблицу MySQL, а затем загружает изображения, прикрепленные к каждой строке, поэтому объем данных является значительным.

Я пытаюсь выяснить, какие другие переменные PHP и т. Д. Мне не хватает, чтобы завершить все это.Другие PHP переменные, которые я установил:

  • display_errors = On
  • log_errors = On
  • error_reporting = E_ALL & ~ E_NOTICE & ~ E_WARNING
  • error_log= "error_log"

Ответы [ 4 ]

3 голосов
/ 10 ноября 2011

Существует три таймаута:

  1. Уровень PHP: set_time_limit
  2. Уровень Apache: Тайм-аут
  3. MysqlУровень: Mysql Options

В вашем случае кажется, что Apache достиг своего таймаута.В такой ситуации лучше использовать PHP CLI.Но если вам действительно нужно сделать эту операцию в режиме реального времени.Затем вы можете использовать Gearman , благодаря которому вы достигнете истинного параллелизма в PHP.

Если вам нужно простое решение, которое запускает ваш скрипт из обычного HTTP-запроса (Browser-> Apache), выВы можете запустить свой внутренний скрипт (скрипт CLI) как команду оболочки из PHP, но «асинхронно».Дополнительную информацию можно найти в Асинхронная оболочка в PHP

3 голосов
/ 10 ноября 2011

Запустите его из командной строки с помощью PHP (например, php yourscript.php), и эта ошибка не должна возникать.Также не рекомендуется использовать set_time_limit(0);Вы должны максимально использовать set_time_limit(86400).Вы можете установить работу cron, чтобы делать это один раз в день.Просто убедитесь, что все пути к файлам в сценарии являются абсолютными и не относительными, чтобы не путать их.

Компиляция сценария также может помочь.HipHop - отличный PHP-компилятор, тогда ваш скрипт будет работать быстрее, использовать меньше памяти и может использовать столько ресурсов, сколько пожелает.HipHop просто очень сложно установить.

3 голосов
/ 10 ноября 2011

Попробуйте использовать PHP-интерфейс командной строки (php-cli) для выполнения длительных задач.Время выполнения - бесконечность в командной строке, если вы не установите его / не завершите его.Также вы можете установить расписание по заданию cron.

0 голосов
/ 10 ноября 2011

Если время выполнения является проблемой, то, возможно, вам следует установить время max_execution, используя set_time_limit функцию внутри скрипта:

set_time_limit(0);

Я бы также вызвал скрипт из командной строки, используя php напрямую, а не через apache. Кроме того, распечатайте некоторые сообщения о состоянии и отправьте их в журнал.

Я подозреваю, что ваша настоящая проблема в том, что скрипт задыхается от плохих данных где-то вдоль линии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...