PHP Script истекает через 45 секунд - PullRequest
5 голосов
/ 23 апреля 2010

Я выполняю огромный импорт в свою базу данных (около 200 тыс. Записей), и у меня возникла серьезная проблема с тайм-аутом сценария импорта. Я использовал свой мобильный телефон в качестве секундомера и обнаружил, что время его прохождения составляет ровно 45 секунд на каждый проход (внутренняя ошибка сервера) ... он делает только около 200 записей за раз, иногда меньше. Я просканировал свой phpinfo (), и ничего не установлено на 45 секунд; поэтому я не знаю, почему он это делает.

Мое время max_execution_time установлено на 5 минут, а время max_input_time установлено на 60 секунд. Я также попытался установить set_time_limit (0); ignore_user_abort (1); вверху моей страницы, но это не сработало.

Также полезно отметить, что мой файл ошибок гласит: «Преждевременный конец заголовков скриптов» как ошибка выполнения.

Любая помощь очень ценится.

Ответы [ 5 ]

15 голосов
/ 18 марта 2011

Я перепробовал все решения на этой странице и, конечно же, запустил из командной строки:

php -f filename.php

как говорит Брент, есть разумный способ обойти это.

Но если вы действительно хотите запустить скрипт из своего браузера, который сохраняет время ожидания через 45 секунд с внутренней ошибкой 500 (как я обнаружил при перестройке моего поискового индекса phpBB), то есть хороший шанс это вызвано mod_fcgid.

У меня есть Plesk VPS, и я исправил его, отредактировав файл

/etc/httpd/conf.d/fcgid.conf

В частности, я изменил

FcgidIOTimeout 45

до

FcgidIOTimeout 3600

3600 секунд = 1 час. Должно быть достаточно длинным для большинства, но при необходимости отрегулировать вверх. Я видел один пример, цитирующий 7200 секунд.

Наконец, перезапустите Apache, чтобы активировать новый параметр.

apachectl graceful

HTH кто-то. Это беспокоит меня уже 6 месяцев!

Приветствия

Rich

0 голосов
/ 04 апреля 2016

Прежде всего

max_input_time и set_time_limit (0)

будет работать только с VPS или выделенными серверами. Вместо этого вы можете следовать некоторым правилам вашей реализации, как показано ниже

  1. Сначала прочитайте весь файл CSV.
  2. Затем захватите только 10 записей (строк) или меньше и выполните вызовы ajax для импорта в БД
  3. Попробуйте каждый раз вызывать ajax с 10 записями и после этого выводить что-либо в браузере. В этом методе ваш сценарий никогда не остановится.
  4. Следуйте тому же методу, пока строки CSV не будут завершены.
0 голосов
/ 23 апреля 2010

Во-первых, вы должны запустить скрипт из командной строки, если это займет некоторое время. По крайней мере, ваш браузер будет отключен через 2 минуты, если он не получит контент.

php -f filename.php

Но если вам нужно запустить его из браузера, попробуйте добавить заголовок («Content-type: text / html»), прежде чем начнется импорт.

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

0 голосов
/ 23 апреля 2010

45 секунд может быть совпадением - это может быть то, сколько времени вам потребуется, чтобы достичь предела памяти ... увеличение предела памяти будет выглядеть так:

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

Это также может быть фактическое соединение с БД, для которого истекло время ожидания. Какой сервер БД вы используете? Для меня mssql истекает с чрезвычайно бесполезной ошибкой «Контекст базы данных изменен» через 60 секунд по умолчанию. Чтобы обойти это, вы делаете:

ini_set('mssql.timeout', 60 * 10); // 10 min
0 голосов
/ 23 апреля 2010

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

Предполагая, что это какой-то тип сервера Linux, вы можете увидеть ограничения ресурсов с помощью ulimit -a в командной строке. ulimit -t также покажет вам только ограничения по времени процессора.

Если ваш процессор ограничен, возможно, вам придется обрабатывать импорт партиями.

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