Я выполняю огромный импорт в свою базу данных (о записях 200k), и у меня есть серьезная проблема с моим таймаутом сценария импорта. Я использовал свой сотовый телефон в качестве часов остановки и нашел, что он приводит к таймауту точно в 45 секунд каждой передачи (внутренняя ошибка сервера)... он только делает приблизительно 200 записей за один раз, иногда меньше. Я просканировал свой phpinfo (), и ничто не установлено на 45 секунд; таким образом я невежествен относительно того, почему это сделало бы это.
Мой max_execution_time установлен на 5 минут, и мой max_input_time установлен на 60 секунд. Я также пытался установить set_time_limit (0); ignore_user_abort (1); наверху моей страницы, но это не работало.
Может также быть полезно отметить, что мой ошибочный файл читает: "Преждевременный конец заголовков сценария" как ошибка выполнения.
Любая помощь значительно ценится.
Во-первых, вы должны запустить сценарий из командной строки, если это займет некоторое время. . По крайней мере, ваш браузер будет отключен через 2 минуты, если он не получит контента.
php -f filename.php
Но если вам нужно запустить его из браузера, попробуйте добавить заголовок («Content-type: text / html») до того, как импорт начнется.
Если вы находитесь на общем хосте, то, возможно, существуют ограничения в системе, когда любые длительные запросы и / или скрипты автоматически завершаются через определенный промежуток времени. Эти ограничения обычно снимаются для скриптов, не работающих в Интернете. Таким образом, может помочь запуск его из командной строки.
Вполне возможно, что вы достигли принудительного ограничения ресурсов на вашем сервере, особенно если сервер не полностью находится под вашим контролем.
Предполагая, что это какой-то тип Linux-сервера, вы можете увидеть свои ограничения ресурсов с помощью ulimit -a
в командной строке. ulimit -t
также покажет вам только ограничения на время процессора.
Если ваш процессор ограничен, вам, возможно, придется обрабатывать импорт партиями.
45 секунд могут быть совпадением - это может быть то, сколько времени вам понадобится, чтобы достичь предела памяти .. увеличение ограничение памяти будет примерно таким:
ini_set('memory_limit', '256M');
Это также может быть время ожидания фактического соединения с базой данных .. Какой сервер базы данных вы используете? Для меня время ожидания mssql истекает с крайне бесполезной ошибкой: "База данных контекст изменен ", по умолчанию через 60 секунд. Чтобы обойти это, сделайте:
ini_set('mssql.timeout', 60 * 10); // 10 min