Проблема такова. Необходимо подгрузить страницу с кодом, некий template для модуля самописной кмс. Подгружаю функцией file_get_contents() через http чтобы код в начале выполнился в шаблоне но по непонятным мне причинам происходит редирект на главную страницу (например читаю file_get_contents('http://сайт/страница.пхп') перехожу на http://сайт) чего по сути быть не должно. На локальной машине где стоит просто Apache все в порядке но на сервере где стоит связка Apache Nginx вот такая штука. С других доменов все хорошо работает. 1) Сама страница html код с кодом php 2) Делать все в строку на php не вариант слишком громоздко (большой код с циклами да и страниц таких много) Ребят куда копать, где искать от чего такое происходит? Может есть другой вариант как исполнить код страницы шаблона и получить все это дело в строке? инклуд не подходит сразу говорю
Читая ваше описание понимается, что вы два-по-пять. Так зачем тогда говорить, что инклуд не подходит? Не понимаю таких, кто пытается через file_get_contents парсить свой же сайт. И когда вы наконец поймете, КМС - это Кандидат Мастера Спорта, а CMS - Система управления содержимым Заучите это раз и на всегда, дабы не позориться.
Вы меня простите но, ИНКЛУД НЕ ПОДХОДИТ поскольку он выводит сразу весь код а надо встроить в нужное место и передать строку на страницу из класса, именно передать а не инклудить и раз вы этого не поняли вам лично надо разъяснять сто-по-двести. Дальше, оставлять проблему не решенной это плохой тон. КМС это CMS и не ваше собачье дело говорить людям о том, как пользоваться жаргонным словарем заучите это раз и навсегда что иногда, за подобные нравоучения взрослых дядей, получают по зубам. Если вы ни фига не осмыслили идите лесом и не отвечайте совсем ибо от вашей помощи ни чего кроме ну нужного поста в ответ
@Sanchis получать шаблон по http это как забивать гвозди микроскопом. Очень дорого по времени и нагрузки в плане веб-сервера и PHP. Можно перехватить вывод в отдельную переменную, тогда и include подойдёт. Пример с фруктами из документации https://secure.php.net/manual/ru/function.ob-start.php Другой мой пример https://php.ru/forum/threads/include-vs-file_get_contents.58988/#post-474571 Вот ещё пример конкретно для твоей ситуации https://secure.php.net/manual/ru/function.ob-get-contents.php PHP: <?php ob_start(); include 'tpl1.php'; $out1 = ob_get_contents(); include 'tpl2.php'; $out2 = ob_get_contents(); ob_end_clean(); var_dump($out1, $out2);
Это то что нужно, спасибо! Век живи век учись ) Далее проблему именно с file_get_contents решу позже, все же поведение странное а возможно это и nginx дыры затыкает таким образом
Банальный return решит проблему при подключении и объявлении в переменной. a.php: PHP: $a = 20; $a ^= 5 % 20; $a = $a ^ ($a * 20); return $a; PHP: $a = require'a.php'; echo $a; или сразу: PHP: echo require'a.php';
Вариант самый простой. Но тогда придётся всё загнать в переменную, а у автора там шаблон и думаю проще перехватить вывод и засунуть в переменную.
Именно, там КМС на 58 мб. уже, пакеты Packagist много весят а именно они составляют основное ядро, бета версия большая вышла дней через 10 доделаю но думаю как облегчить взяв те наработки что уже есть. Тестировать буду у товарища, это магазин со своими задачами что другие не решают а Битрикс дорогой. Пытаюсь сделать качественно. Опыт штука ценная. То что Родент предлагает это странный код PHP: echo require'a.php'; это нонсенс, require уже предполагает вывод текстовой информации без всяких эхо и такой код наверное на первых 200 стр. в гугле, поэтому то и написал сюда что найти информацию трудно. То что вы предложили это решение верное, проверю позже на запрет прямого доступа к файлу (там админка задействована) и будет совсем красиво
require/include только выполняет PHP код из указанного ему файла. По этому код Код (Text): echo require'a.php'; будет работать если в файле a.php есть возврат информации по return. Это используют обычно чтобы в PHP файла хранить настройки в массиве и потом просто этот массив возвращают, а результат присваивают переменной. Универсальный подход. --- Добавлено --- Ответ получил на свой вопрос?
В этом случае это не отработает: PHP: require'a.php'; Если в файле есть возвращение return, то require ничего не вернет, если мы не поместим ее в вывод или не присвоим в переменную, будет ожидаться void. А так: PHP: echo require'a.php'; Вернет данные соответствующего типа из обвертки по return.
Так вот оно и получается что при таком подходе смысла нет вообще создавать шаблонный файл а засунуть все в тот же метод куда отправить скажем массив с нужными данными. Я конечно потестирую этот код ради интереса но не думаю что это правильный подход, эти функции я обычно использую совсем для других целей и очень редко, автозагрузчик решает частые инклуды.
Не правильный подход - это когда ты делаешь велосипед через file_get_contents и получаешь аналог инклуда. Который в раз 10 работает медленее и менее правильно. Ибо инклуд также может быть динамически обработан и также можно соблюдать структуру возврата по назначению или по надобности, причем не загружать весь код, а только частями.
Решил решил, написал выше об этом, поблагодарил. --- Добавлено --- Мне не надо было частями а нужно все, ну читай же внимательно, почему модератор понял что требуется а ты нет то? Здается мне ты не понял суть проблемы. Опыта у меня более 10 лет, вполне себе разбираюсь в коде и в состоянии создавать крупные проекты но поскольку самоучка не могу знать ответы на некоторые вопросы, да и держать весь пхп в голове тоже невозможно, со временем элементарные вещи даже забываются если их не использовать.
Тогда это что?: Вы уж определитесь, что нужно. Я вам сочувствую, не знать за 10 лет - как работает инклуд и какие есть махинации с буфером - это конечно нонсенс. Ну да ладно, раз задача решена, можно не продолжать тему.
Мне не надо было частями а нужно все, ну читай же внимательно, почему модератор понял что требуется а ты нет то? Здается мне ты не понял суть проблемы. Опыта у меня более 10 лет, вполне себе разбираюсь в коде и в состоянии создавать крупные проекты но поскольку самоучка не могу знать ответы на некоторые вопросы, да и держать весь пхп в голове тоже невозможно, со временем элементарные вещи забываются. Да не надо мне сочувствовать, не нуждаюсь как то но, о ob_get_contents(); я впервые услышал тут о чем благодарен модератору и ни сколько об этом не волнуюсь поскольку в памятке это считай осталось и взято за хорошее решение такой вот задачи. Ну невозможно все знать, если считаешь по другому ну так считай это уже дело твое я думаю
Юзайте ob_get_clean(); Но я вам не просто так сказал про инклуд, так как мы можем хранить в инклуде объект или другой тип данных и становится легче манипулировать файлами и структурами.
@denis01 да не чё не говорю но я отказался весь проект полностью по стандарту psr-4 сделал уже, тогда помнишь про рекурсию разговор был тоже у меня, тоже переделал, аяксом вывел, просто вывожу id и ищу в базе родителя, через аякс так и построил дерево, через аякс работает шустрее чем сразу всё рекурсией долбить --- Добавлено --- @denis01 как бы возможность в двиге есть ob_start заюзать... чтобы не через шаблонизатор липить, а передать тупо код в виде переменно в шаблонизаторе, но в своём проекте чё то обошёлся, наверно в самом твиге юзается ob_start .... ну и в движке в общем тоже есть такая функция без шаблонизатора...