Переписал все промисы в своем коде с использованием do / while. Кажется помогло) Уже 5 часов подряд все работает без сбоев и тормозов. Завтра будет все ясно на 100%, отпишусь.
Sanzhar Bazarbek, то что это не ваш уровень. Если хотите красивую загрузку без ломания функционала, то iframe единственный вариант сделать это в лоб. Можно сделать и не в лоб, но тогда возможность загрузки страниц аяксом надо было предусмотреть еще на этапе создания сайта.
Sanzhar Bazarbek, там не все так просто. Если вы делайте это не для себя, а для реального использования, то моя функция вам не подойдет - это просто пример, да еще и не оптимизированный. Там много тонких моментов.
Вообще, чтобы не ломать функционал сайта, имеет смысл загрузку страниц реализовать через полноэкранный iframe. Однако там нужен совершенно другой подход.
Sanzhar Bazarbek, поздно вы написали, уже вечер и я опять без сил. Вообще, зачем вам нужна AJAX-подгрузка контента? Возможно смогу подсказать другое решение.
суть решения: при каждом вызове AJAX к URL'у страницы в качестве якоря добавляется текущий номер элемента в стеке «истории», фактически, просто увеличивающиеся числа. При нажатии кнопки «назад» в браузере, URL страницы меняется на предыдущий. Каждые 100 (200, 400, 1000) миллисекунд страница проверяет, не изменился ли у нее якорь в URL'е, если якорь изменился, то осуществляется подгрузка данных, соответствующих текущему якорю (=элементу в стеке «истории»).
Sanzhar Bazarbek, не знаю, мне чтобы ответ вам дать, надо сначала самому попробовать, поэкспериментировать, да только устал я сегодня, желания нет ковыряться.
Sanzhar Bazarbek, исправить можно, но это надо ковырять в сторону работы с History API. Вешайте обработчик на событие возврата, отменяйте его и грузите страницу вручную. Сори, не могу привести пример, слишком лень писать код.
Дмитрий, кстати, нашел аналог get_headers() который не дублирует запрос: https://www.php.net/manual/ru/reserved.variables.h...
Тоже полезно, буду через него Content-Type проверять. Потому что если я качаю картинку, а почему то получаю в ответ text/html, то запрос явно неудачный.
Vitsliputsli, огромное спасибо. Представьте себе, я реально не знал, что file_get_content возвращает false при ошибке) Серьезно) Ваш ответ решает мою проблему.
Лентюй, вообще то я про опцию CURLOPT_HEADER в curl, она позволяет включит заголовки ответа в тело ответа. Может вы знаете способ прочитать заголовки отдельно, без их включения в тело ответа? Это бы тоже решило проблему.
Дмитрий, при использовании curl я могу проверить заголовки ответа, только проблема в том, что эти заголовки объединены с ответом. Если я качаю html-страничку, не сложно их разделить, а вот если качаю картинку или любой другой файл, то у меня будут проблемы. Поэтому я и решил копать в сторону file_get_contents который при неудачах обычно всегда возвращает ошибку PHP.