За последние 24 часа нас посетили 36689 программистов и 1707 роботов. Сейчас ищут 1065 программистов ...

file_get_contents - Происходит редирект на главную

Тема в разделе "PHP для новичков", создана пользователем Sanchis, 9 июл 2016.

  1. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4
    Проблема такова. Необходимо подгрузить страницу с кодом, некий template для модуля самописной кмс. Подгружаю функцией file_get_contents() через http чтобы код в начале выполнился в шаблоне но по непонятным мне причинам происходит редирект на главную страницу (например читаю file_get_contents('http://сайт/страница.пхп') перехожу на http://сайт) чего по сути быть не должно. На локальной машине где стоит просто Apache все в порядке но на сервере где стоит связка Apache Nginx вот такая штука. С других доменов все хорошо работает.

    1) Сама страница html код с кодом php
    2) Делать все в строку на php не вариант слишком громоздко (большой код с циклами да и страниц таких много)

    Ребят куда копать, где искать от чего такое происходит? Может есть другой вариант как исполнить код страницы шаблона и получить все это дело в строке? инклуд не подходит сразу говорю
     
  2. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Читая ваше описание понимается, что вы два-по-пять. Так зачем тогда говорить, что инклуд не подходит?
    Не понимаю таких, кто пытается через file_get_contents парсить свой же сайт.
    И когда вы наконец поймете, КМС - это Кандидат Мастера Спорта, а CMS - Система управления содержимым
    Заучите это раз и на всегда, дабы не позориться.
     
  3. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4
    Вы меня простите но, ИНКЛУД НЕ ПОДХОДИТ поскольку он выводит сразу весь код а надо встроить в нужное место и передать строку на страницу из класса, именно передать а не инклудить и раз вы этого не поняли вам лично надо разъяснять сто-по-двести. Дальше, оставлять проблему не решенной это плохой тон.

    КМС это CMS и не ваше собачье дело говорить людям о том, как пользоваться жаргонным словарем заучите это раз и навсегда что иногда, за подобные нравоучения взрослых дядей, получают по зубам. Если вы ни фига не осмыслили идите лесом и не отвечайте совсем ибо от вашей помощи ни чего кроме ну нужного поста в ответ
     
  4. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @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:
    1. <?php
    2.  
    3.  
    4. include 'tpl1.php';
    5.  
    6. $out1 = ob_get_contents();
    7.  
    8. include 'tpl2.php';
    9.  
    10. $out2 = ob_get_contents();
    11.  
    12.  
    13. var_dump($out1, $out2);
     
    askanim и Sanchis нравится это.
  5. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4

    Это то что нужно, спасибо! Век живи век учись ) Далее проблему именно с file_get_contents решу позже, все же поведение странное а возможно это и nginx дыры затыкает таким образом
     
  6. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Банальный return решит проблему при подключении и объявлении в переменной.
    a.php:
    PHP:
    1. $a = 20;
    2. $a ^= 5 % 20;
    3. $a = $a ^ ($a * 20);
    4. return $a;
    PHP:
    1. $a = require'a.php';
    2. echo $a;
    или сразу:
    PHP:
    1. echo require'a.php';
     
    #6 rodent90, 10 июл 2016
    Последнее редактирование: 10 июл 2016
  7. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Вариант самый простой. Но тогда придётся всё загнать в переменную, а у автора там шаблон и думаю проще перехватить вывод и засунуть в переменную.
     
  8. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4
    Именно, там КМС на 58 мб. уже, пакеты Packagist много весят а именно они составляют основное ядро, бета версия большая вышла дней через 10 доделаю но думаю как облегчить взяв те наработки что уже есть. Тестировать буду у товарища, это магазин со своими задачами что другие не решают а Битрикс дорогой. Пытаюсь сделать качественно. Опыт штука ценная.

    То что Родент предлагает это странный код

    PHP:
    1. echo require'a.php';
    это нонсенс, require уже предполагает вывод текстовой информации без всяких эхо и такой код наверное на первых 200 стр. в гугле, поэтому то и написал сюда что найти информацию трудно.

    То что вы предложили это решение верное, проверю позже на запрет прямого доступа к файлу (там админка задействована) и будет совсем красиво
     
  9. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    require/include только выполняет PHP код из указанного ему файла.
    По этому код
    Код (Text):
    1. echo require'a.php';
    будет работать если в файле a.php есть возврат информации по return. Это используют обычно чтобы в PHP файла хранить настройки в массиве и потом просто этот массив возвращают, а результат присваивают переменной. Универсальный подход.
    --- Добавлено ---
    Ответ получил на свой вопрос?
     
  10. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    В этом случае это не отработает:
    PHP:
    1. require'a.php';
    Если в файле есть возвращение return, то require ничего не вернет, если мы не поместим ее в вывод или не присвоим в переменную, будет ожидаться void.
    А так:
    PHP:
    1. echo require'a.php';
    Вернет данные соответствующего типа из обвертки по return.
     
  11. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4

    Так вот оно и получается что при таком подходе смысла нет вообще создавать шаблонный файл а засунуть все в тот же метод куда отправить скажем массив с нужными данными. Я конечно потестирую этот код ради интереса но не думаю что это правильный подход, эти функции я обычно использую совсем для других целей и очень редко, автозагрузчик решает частые инклуды.
     
  12. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Не правильный подход - это когда ты делаешь велосипед через file_get_contents и получаешь аналог инклуда. Который в раз 10 работает медленее и менее правильно. :) Ибо инклуд также может быть динамически обработан и также можно соблюдать структуру возврата по назначению или по надобности, причем не загружать весь код, а только частями.
     
  13. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @Sanchis так ob_get_contents не решил твою задачу?
     
  14. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4
    Решил решил, написал выше об этом, поблагодарил.
    --- Добавлено ---
    Мне не надо было частями а нужно все, ну читай же внимательно, почему модератор понял что требуется а ты нет то? Здается мне ты не понял суть проблемы. Опыта у меня более 10 лет, вполне себе разбираюсь в коде и в состоянии создавать крупные проекты но поскольку самоучка не могу знать ответы на некоторые вопросы, да и держать весь пхп в голове тоже невозможно, со временем элементарные вещи даже забываются если их не использовать.
     
  15. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Тогда это что?:
    Вы уж определитесь, что нужно.
    Я вам сочувствую, не знать за 10 лет - как работает инклуд и какие есть махинации с буфером - это конечно нонсенс.
    Ну да ладно, раз задача решена, можно не продолжать тему.
     
  16. Sanchis

    Sanchis Новичок

    С нами с:
    14 мар 2016
    Сообщения:
    38
    Симпатии:
    4
    Мне не надо было частями а нужно все, ну читай же внимательно, почему модератор понял что требуется а ты нет то? Здается мне ты не понял суть проблемы. Опыта у меня более 10 лет, вполне себе разбираюсь в коде и в состоянии создавать крупные проекты но поскольку самоучка не могу знать ответы на некоторые вопросы, да и держать весь пхп в голове тоже невозможно, со временем элементарные вещи забываются.
    Да не надо мне сочувствовать, не нуждаюсь как то но, о ob_get_contents(); я впервые услышал тут о чем благодарен модератору и ни сколько об этом не волнуюсь поскольку в памятке это считай осталось и взято за хорошее решение такой вот задачи. Ну невозможно все знать, если считаешь по другому ну так считай это уже дело твое я думаю
     
  17. rodent90

    rodent90 Новичок

    С нами с:
    26 мар 2015
    Сообщения:
    533
    Симпатии:
    37
    Юзайте ob_get_clean();
    Но я вам не просто так сказал про инклуд, так как мы можем хранить в инклуде объект или другой тип данных и становится легче манипулировать файлами и структурами.
     
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @denis01 эх ты чтоли уже раз эдак 5 ый на моей памяти рассказываешь тоже самое с примерами :D
     
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    @askanim шаблоны c PHP кодом с ним очень удобно делать
     
  20. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    @denis01 да не чё не говорю но я отказался весь проект полностью по стандарту psr-4 сделал уже, тогда помнишь про рекурсию разговор был тоже у меня, тоже переделал, аяксом вывел, просто вывожу id и ищу в базе родителя, через аякс так и построил дерево, через аякс работает шустрее чем сразу всё рекурсией долбить
    --- Добавлено ---
    @denis01 как бы возможность в двиге есть ob_start заюзать... чтобы не через шаблонизатор липить, а передать тупо код в виде переменно в шаблонизаторе, но в своём проекте чё то обошёлся, наверно в самом твиге юзается ob_start .... ну и в движке в общем тоже есть такая функция без шаблонизатора...
     
    denis01 нравится это.
  21. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    обычно кэшируют сформированный html

    как я понял ты используешь twig, там уже есть ob_
     
    askanim нравится это.