Intereting Posts
Получение всех узлов с тем же именем с использованием xpath для XML-файла BMECAT? Почему var_dump возвращает большее значение, чем длина строки? Функция, чтобы проверить, соответствует ли значение db текущей опции выбора Фильтровать, сортировать и разбивать на страницы в Codeigniter определение типа файла php Как автозагрузка расширенных классов? Лучшая практика: как структурировать массивы – стандарты и соглашения об именах Экспорт данных из php в excel Дата форматирования PHP Как использовать order_id как номер счета-фактуры и конвертировать любую переменную в качестве gloabal Проблема с Imagick, а также с phmagick: делегат Postscript не удалось / Нет такого файла или каталога Создать таблицу с проверкой PHP с использованием значения и текущего значения (Массив) Magento SOAP API – исключение PHP для вызова метода входа: «похоже, что у нас нет XML-документа» Magento – пустая страница при создании нового модуля Как автозагрузите Guzzle в Laravel 4?

Предотвращение тайм-аута шлюза 504 с огромным скриптом PHP

В настоящее время я запускаю сервер Apache (2.2) на моем локальном компьютере (Windows), который я использую для запуска некоторых PHP-скриптов, чтобы позаботиться о какой-то утомительной работе. Один из сценариев включает в себя тонну перемещения, изменения размера и загрузки / выгрузки файлов на другой сервер. Я бы очень хотел, чтобы сценарий работал постоянно, так что мне не нужно записывать сценарий, открывая его каждый раз, когда он истекает.

set_time_limit(0); ignore_user_abort(1); 

Оба установлены в моем скрипте, но примерно через 30 минут до часа скрипт останавливается, и я получаю сообщение 504 Gateway Time-out в своем браузере. Есть что-то, чего я не хватает в Apache или PHP, чтобы предотвратить таймаут? Или я должен запускать сценарий по-другому?

Solutions Collecting From Web of "Предотвращение тайм-аута шлюза 504 с огромным скриптом PHP"

Или я должен запускать сценарий по-другому?

Определенно. Вы должны запустить свой скрипт из командной строки ( CLI )

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

  • A. process_controller.php
  • B. process.php

Рабочий процесс должен быть:

  1. пользователь вызывает сценарий A с помощью браузера
  2. сценарий A запустите сценарий B с помощью system () или exec () и передайте ему «токен процесса» через командную строку.
  3. сценарий B записывает статус выполнения в разделяемое пространство: файл, названный как токен, таблица базы данных. в общем, что-то, что может быть прочитано также скриптом A, используя токен в качестве ссылки
  4. сценарий A содержит вызов AJAX в опросе, который запрашивает сценарий A статус процесса для данного токена

Опрос Ajax:

 <script> var $myToken; function ajaxPolling() { $.get('process_controller.php?action=getStatus&token='+$myToken, function(data) { $('.result').html(data); }); } setInterval("ajaxPolling()",60*1000); //Every minute </script> 

есть некоторые соображения о связи между двумя процессами, в зависимости от того, сколько экземпляров сценария B вы могли бы выполнять параллельно

  1. Только один: вам не нужен случайный / уникальный токен
  2. Один на пользователя: session_start(); $token = session_id(); session_start(); $token = session_id();
  3. Более одного пользователя: session_start (); $ token = session_id (). microtime ();

Если вам нужно запустить его в своем браузере, вы должны убедиться, что в файле php.ini нет ограничения на выполнение php, но также нет ограничения, установленного в mod_php (или том, что вы используете) под apache.

Используйте system() php system() для вызова сценария оболочки, который запускает службу / фоновое задание.