Проблема header/Location: и copy($path, $copy_path) — как решить?
Скрипт считывает огромный прайс лист на несколько сотен тысяч позиций.
Разумеется залить его в базу битрикса, определенного политикой компании невозможно за раз, учитывая особенности получения ID свойств
Соответственно поставлена задача написать считывалку прайслиста, которая будет редиректом запускать себя еще раз, если все ляжет, мы должны иметь возможность запустить скрипт с параметром продолжения загрузки и все должно отработать
Значит скрипт то я написал весь, он много чего умеет, но запутался вот где:
Я запускаю скрипт для 15 товаров с шагом 5 товаров.
В скрипте написано - если он запущен первый раз (нету $_GET["nofirst"]), то скопировать исходный файл и переименовать его в !#name чтобы не терять оригиналы.
После этого начинается построчный разбор файла с отжиранием от него верхней части и сохранением в рабочий вариант того, что осталось.
Для 15 товаров скрипт должен отработать 3 раза, по 5 товаров. Вместо этого он работает через раз правильно/неправильно - один раз он все делает идеально, второй раз он почему-то отгрызает кусок файла и сохраняет уже отгрызенный (в коде явно сначала сохранение, а потом отгрызание), а логи создаются как будто он запустился всего 2 раза (2 лог файла создано) - причем в первом входные параметры такие, как будто я первый раз его запустил, то есть он 1 раз отработал, отожрал кусок, ничего не сделал, а потом редиректом запустился второй раз причем забыв передать жестко заданные для редиректа параметры и запустился второй раз будто человеком и соответственно скопировал уже отгрызенный файл.
Создание логов висит на register_shutdown_function. Создание копии файла - функцией copy. Отгрызание - file_get_contents(), file_put_contents();
Соответственно такое поведение похоже на то, что какая-то функция работает асинхронно (в синхронном то языке) и ко второму выполнению еще не успела выполнится.
Надо собрать минимально нерабочую версию: убрать всю бизнес логику загрузки в битрикс (заменить на sleep(N) чтобы было похоже), оставить только "отгрызание" и редиректы - после чего все тут и посмотрим
Понял суть, оформите как ответ, годится.
Конкретно моя проблема решилась заменой file_get_contents() на file() но думаю что это для маленьких прайслистов имеет смысл, потому что file отрабатывает для 500кб файла мгновенно. Если ей скормить пару мегабайт - будет беда.
Думаю вопрос именно в том, что пока file_get_contents читает файл помещенный в оперативку, скрипт каким-то хреном уже успевает отработать и начать записывать в считываемый файл, по итогу первый раз как будто выполнился но только отгрыз и все, а действий никаких нет, и получается будто первый раз он сначала отгрыз, а потом отработал.
оно так и происходит.
разве что ты имеешь в виду, что один скрипт отжирает и создает маленький файл, а загрузчик соответсвенно грузит из маленького, потому что сейчас все совмещено. что думаешь:?