Всем доброго времени суток! Необходимо выполнить импорт файлов в базу данных MySQL с возможностью ограничить количество обрабатываемых строк. Данную задачу решил при помощи редиректов. Но вот не задача, сервер падает с ошибкой: Неверное перенаправление на странице. Огромная просьба помочь разобраться с данной проблемой, ниже прилагаю информацию о сервере, список файлов и алгоритмы работы импорта. Сервер: nginx + apache PHP Version: 7.1.22 Файлы: https://drive.google.com/drive/folders/1z0mLYHI-iAIhkMQHzH_nRDdAEizM4VEw?usp=sharing Обработчик формы загрузки файлов смотрите: upload.php Функция обработчик процесса импорта: offset.php Классы подготовки и обработки файлов импорта: insert.php Отчет импорта данных: finish.php Функция редирект: PHP: /** Функция редирект */ function redirect($url, $status = 302) { header('Location: ' . str_replace(array('&', "\n", "\r"), array('&', '', ''), $url), true, $status); exit(); }
Да нет проблема в циклическом редиректе. Но он нужен для выполнения задачи. Пока ломаю голову как это исправить, возможно ajax поможет, но не уверен буду пробовать.
Просто спросил, т.к. Гугл сразу выдаёт инфу о проблемах с куками. Там про цикличный редирект и прочее...
Далеко не факт, что нужен редирект, в веб программировании редко когда бывает одно единственное и правильное решение, скорее всего вы не нашли более подходящего чем ваше.
Лучше поздно, как говорится... Ошибка "неверное перенаправление" сигналится браузером, если новый URL совпадает с предыдущим и так *цать раз. Он резонно подозревает нездоровое зацикливание. Не надо слишком усложнять задачу и костылить. Достаточно ввести в адрес переменную величину, (бес)полезный параметр типа: текущее время, последний использованный id или номер итерации. Update: используйте header refresh вместо header location https://php.ru/forum/threads/nevernoe-perenapravlenie-na-stranice.75813/#post-596095
Увы PHP: $i = isset($_GET['i']) ? ((int) $_GET['i']) : 0; header('Location: ?i=' . ($i + 1)); отработает 20 раз и пошлёт (по крайней мере в Chrome)
Ну не знаю в чём магия такого невезения, но таким вот способом работают долгоиграющие скрипты. Может быть потому, что реальные скрипты тратят какие-то милисекунды на реальную работу прежде чем вернут ответ. Мне лень выяснять почему работает то, что работает. См. https://php.ru/forum/threads/nevernoe-perenapravlenie-na-stranice.75813/#post-596095 --- Добавлено --- Когда-то на этом форуме я публиковал скрипт, аналог генерируемой иконки gravatar, только он содержал заголовок Refresh. Картинка бесконечно обновлялась, делалая новые запросы с параметром.
Странно, у меня не работает. Добавил рандомную паузу 1...3 секунды, сделал перекидывание между двумя разными хостами, $i инкрементится, добавил &rand=рандомная хрень. Всё равно 20 редиректов - и ошибка. Похоже, что они добавили проверку на общее количество редиректов. И не важно откуда и куда, какие там параметры в запросе, какой хост - всё пофиг. Просто 20 редиректов подряд = ошибка.
@sobachnik, нормально, что не работает. На много редиректов полагаться не стоит. Например, у нас в правилах написано – использовать не более трех редиректов. ТС выбрал норм. решение – AJAX.
@miketomlin ну так-то да, согласен. Тут просто под конец зашёл разговор о том, что это в принципе должно работать, но я добавил, что у меня не работает А вообще, когда мне нужно, что бы скрипт обработал много-много чего-то, и лень делать со всякими аяксами - я обычно просто пишу PHP: set_time_limit(0); и не парюсь
Окей, признаю — был неправ, потому что давно не пробовал. Уточняю: надо использовать не 302-й редирект, а рефреш. Рефреш это либо <meta refresh>, либо http заголовок header('Refresh...')., в зависимости от вашего контекста. Работает в точности как javascript:window.location=... но без javascript. Рабочий пример neverends.php: PHP: <?php $i = isset($_GET['i']) ? intval($_GET['i']) : 0; usleep(mt_rand(500000, 2000000)); header('Content-Type: text/html; charset=utf-8'); header('Refresh:0; url=?i='.($i+1)); ?> Ineration No. <?= $i ?>
@artoodetoo, ну я сразу понял, что у тебя был успешный опыт именно с Refresh. Насколько знаю, это неофициальный (или устаревший?) заголовок, хотя широко поддерживаемый. JS часто используется, как дополнение к нему, а не как полная альтернатива. --- Добавлено --- @sobachnik, ну так можно и из командной строки запустить скрипт. Я подразумевал норм. обратную связь с клиентом, а не штатное «крутящееся колесико» браузера.