Помощь Php скрипт упирается в time-out

  • Автор темы Автор темы dell2201
  • Дата начала Дата начала

dell2201

Разрушитель (V)
Сообщения
216
Реакции
147
Баллы
2 521
Добрый день. Подскажите. Пишу скрипт php, он получая из базы массив id товаров, должен отправлять их по одному через foreach, по api на строгий сервер. Тут я и приуныл. Массив большой, упираюсь в тайм оут. Как разбивают на порции? Через ajax? Смотрел код simplapars, вот что то наподобие, когда идёт паркинг у него. Но не фига не понял))
 
В верху скрипта пропиши:
PHP:
ini_set('max_execution_time', '300'); // 5мин
или
PHP:
ini_set('max_execution_time', '0'); // бесконечно

Либо как вариант, запускать через cli cron
 
Это понятно. Без вмешательства в пыху хотелось. Как то бьют на порции, тем же ajax, скрипт не протухает. Простой пример, массовая генерация url, может содержать и несколько миллионов строк и по тайм-аут не отваливается. Буду копать))
 
Это понятно. Без вмешательства в пыху хотелось. Как то бьют на порции, тем же ajax, скрипт не протухает. Простой пример, массовая генерация url, может содержать и несколько миллионов строк и по тайм-аут не отваливается. Буду копать))
Первый модуль, который вспомнил, это UniXML, там такое
Можно там подсмотреть. Код открытый
 
некоторые хостинг панели имеют возможность изменить параметры php для отдельного каталога из веб интерфейса. Также, можно прописать через отдельные файлы .user.ini или php.ini, а также, через .htaccess
 
Это понятно. Без вмешательства в пыху хотелось. Как то бьют на порции, тем же ajax, скрипт не протухает. Простой пример, массовая генерация url, может содержать и несколько миллионов строк и по тайм-аут не отваливается. Буду копать))
Все просто. В начале скрипта записываешь время старта скрипта. В цикле (или любом другом долговыполняющемся месте) ставишь проверку на время выполнения, т.е. текущее время - время старта скрипта, если это значение больше или равно времени выполнения скрипта минус 2 секунды (тут зависит от нагрузки операции), то редиректишь на этот же скрипт с переменной последней обработанной строки и в цикле начинаешь обработку с нее.
 
Да все уже. Разобрался. )) Ajax ом шаг задаем, и из slice вытаскиваем массив, повторяем
 
JavaScript:
<button id="pars" ....">Парс</button>
$("#pars").bind("click", function() {
        var iter = 0;
        
        ajax_pars(iter);
    });

function ajax_pars(iter) {
        iter = iter + 10;
        $.ajax({
            url: 'url',
            type: "POST",
            data: { "iter": iter },
            dataType: "json",
            success: function(data) {
                if (data.status == 'finish') {
                    /// что то делаем, когда все перебрали
                } else if (data.status == 'work') {
                    //что то делаем, когда еще идет работаем, например отображаем прогресс
                    ajax_parse(iter); //перезапускаем
                } else if (data.status == 'error') {
                    //тут ошибки если есть
                }
            }
        });
    };

PHP:
//считаем шаг и подставляем в array_slice
$tmp = array_slice($tmp, (int) $part, $step, true);
// потом отправляем обратно
 
Назад
Верх