Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Включение и обработка...


Автор: Kirill Baranov 22.5.2006, 19:38
Доброго времени суток  smile 

Есть у меня вот обработчик текст "Пагинация", который берет переменную, в которой текст содержится и начинает её обрабатывать.
Так вот...а если я хочу обратать не переменную, а файл?! Как быть так? Include не катит, ибо там инклюдится файл и его в переменную не затащишь. file_get_contents не катит аналогично, но в данном случае из-за того, что в файле может быть PHP код и тогда будет полная жопа)

Как быть? 

Автор: madFobos 22.5.2006, 21:19
А в чем проблема с PHP кодом и file_get_contents? Содержимое-то ты получишь, а дальше уже работа твоего "пагинатора" искать и пропускать код или еще что. 

Автор: Kirill Baranov 22.5.2006, 21:29
madFobos,
Да дело в том что при file_get_contents PHP код не обрабатывается. Его кусок показывается на экране, но не исполняется. 

Автор: Mal Hack 22.5.2006, 23:03
Kirill Baranov, ты объясни что тебе надо сделать по человечески.
 

Автор: Kirill Baranov 22.5.2006, 23:17
main.php
Код

Текст текст текст
<?
echo "text";
?>


Есть файл index.php, содержимое которого описано тут http://forum.vingrad.ru/index.php?showtopic=95490 (разбивка на страницы)
Так этот скрипт разбивки на страницы. Если бы был обычный файл, то мона было бы использовать ф-цию file_get_contents, чтобы занести все его содержимое в переменную, которую скрипт и обработал бы...а у меня есть файл со скриптом PHP внутри. Как тогда сделать обработку этого файла через этот скрипт пагинатора? 

Автор: Mal Hack 22.5.2006, 23:25
Еще раз прошу объяснить что ты ХОЧЕШЬ СДЕЛАТЬ, а не то, КАК ТЫ ЭТО ВИДЕШЬ. ТО, ЧТО ТЫ ВИДЕШЬ НЕ ПРАВИЛЬНУЮ РЕАЛТЗАЦИЮ Я И ТАК УЖЕ ПОНЯЛ.
Что значит "обработать"? 

Автор: Kirill Baranov 22.5.2006, 23:27
Mal Hack, обработать, значит сделать разбивку данных на страницы с выводом оглавления. Сам скрипт есть, ссылку я дал. 

Автор: Mal Hack 23.5.2006, 00:01
Разбить его как текстовый на страницы? Это file_get_contents
Разбить используя его код, - include. 

Автор: vasac 23.5.2006, 09:07
Kirill Baranov, если считывать файл через file_get_content() напрямую с локального диска, то PHP-код не обработается. 
Если же через запрос к серверу, т.е. вроде 
Код

file_get_content( "http://mysite.ru/file.php" );

то обработается и вернется его результат. 

Автор: Mal Hack 23.5.2006, 09:44
vasac, это вообще глупость. 

Автор: vasac 23.5.2006, 09:55
Mal Hack, конкретно. Что глупость?
Вообще то, что я написал. Или применительно к исходной задаче? 

Автор: Kirill Baranov 23.5.2006, 11:11
Mal Hack, глупость глупостью, а вот это:
Код

Текст текст текст
<?
$a="1";
$b="2";
$c=$a+$b;
echo $c;
?>


легко обработалось с помощью file_get_contents 

Автор: vasac 23.5.2006, 11:21
Kirill Baranov, file_get_contents() при удаленном чтении на длинных файлах может обрываться.
Лучше открывать fopen()-ом и читать через fread() небольшими порциями кила по 2, пока не будет конца файла. 

Автор: R.M. 23.5.2006, 12:34
Kirill Baranov, кавычки там надо убрать для ускорения парса smile  

Автор: Kirill Baranov 23.5.2006, 18:33
Блин, срываются все настройки и передать переменные невозможно почему-то. Сразу перестало работать соединение с БД... У вас есть вариант как вообще такую штуку реализовать? Или надо всё-таки как-то разделять статические страницы и динамические? 

Автор: Mal Hack 23.5.2006, 18:59
Цитата(vasac @  23.5.2006,  09:55 Найти цитируемый пост)
Mal Hack, конкретно. Что глупость?

Глупость открывать соединение с удаленным сервером через fopen и file_get_contents. Для этого fsockopen существует.

Kirill Baranov, еще раз, прошу объяснить суть задачи. Тебе надо выполнить код или вывести его или что. Если ответа я не получу, тему закрою. Ну невозможно, блин на самом деле уже. 

Автор: Kirill Baranov 23.5.2006, 19:05
Да ёлки палки... 
Есть у меня PHP файл, в котором есть и PHP-код и обычный текст, не РНР. Так вот! Скрипт Надо чтобы брался этот файл и производилось его разделение на страницы с выводом оглавления. Всё...


Mal Hack, мне кажется что тока ты не понял в чём фишка  smile  

Автор: Mal Hack 23.5.2006, 19:12
Наконец-то. С 5 раза...
file_get_contents - твое решение. 

Автор: Kirill Baranov 23.5.2006, 19:15
Вот даже код:

Код

<?
if (file_exists("$file")) {
 
// == НАЧАЛО ПАГИНАЦИИ
$text_do=file_get_contents("http://site.ru/".$file."");

//$regex = '/{(pagebreak)\s*(.*?)}/i';
$regex = '/{(pagebreak)(\s*title=([^}]+))*}/i';

// найти все образцы разрыва страницы и вставить в $matches
$matches = array();
preg_match_all( $regex, $text_do, $matches);
$titles = $matches[3];

// место разрыва текста
$text = preg_split( $regex, $text_do );

// подсчет числа страниц
$n = count( $text );
$n=$n-1;
if (!$page) $page="0";

if ($n!='0') {
echo '<table width="20%" border="0" align="right" cellspacing="3" cellpadding="5" style="border:1px solid #cccccc; margin:10px;" bgcolor="#FFE9BF">
<tr>
<td><strong>Содержание</strong></td>
</tr>';

$pagenextext=$text[$n];

$i=$n-$n;
while ($i<$n) {
    if ($titles[$i]!="") {
        $pagetitle=$titles[$i];
    } else {
        $pagetitle='Страница '.($i+1).'';
    }
    if ($page==$i) { $bgolor='bgcolor="#FFDB97" style="border:2px dotted #333333"'; } else { $bgolor='style="border:1px solid #FFE9BF"'; }
    echo '<tr><td '.$bgolor.' valign="middle"><a href="'.$arr[1].'/'.$arr[2].'/?page='.$i.'">'.$pagetitle.'</a></td></tr>';
    $i++;
    $pagetitle="";
}
echo '</table>';

}
// == КОНЕЦ ПАГИНАЦИИ
            
echo "<div style=\"padding-left:15px;padding-right:15px;\" align=\"justify\"><font size=2 color=#333333 face=Verdana>$text[$page]</font></span>";

 
 
} else {
?><br><br><br>
<table width="70%" border="0" align="center" cellpadding="2" cellspacing="2" style="border:1px dashed" bgcolor="#F9F9F9">
  <tr>
    <td align="center" valign="middle"><p><br />
          <strong>Уважаемые посетители!<br>
                <br>
            </strong>Информация для этой страницы сайта<br>
            в настоящее время готовится к публикации.<br>
            Приносим свои извинения за причиненные неудобства.</p>
      <p align="right">Администрация сайта. <br />
          <br />
        </p></td>
  </tr>
</table>
<?
}
?>


Это был пагинатор собсно.


А вот файл который надо обработать:

Код

<?
$sql=mysql_query("SELECT * FROM companies WHERE company LIKE '$alp%' ORDER BY company ASC");
?>
Тра ля ля ля ля
{pagebreak title=Начало}
Тря ля ля ля еще разок
{pagebreak title=Конец


Добавлено @ 19:17 
Mal Hack, так при file_get_contents (сам до него допёр) переводит файл в переменную. Таким макаром в PHP код файла не передаются данные (например, данные по подключению к MySQL). И получается фигня какая-то... 

Автор: Mal Hack 23.5.2006, 19:18
Цитата(Kirill Baranov @  23.5.2006,  19:15 Найти цитируемый пост)
$text_do=file_get_contents("http://site.ru/".$file."");

Господи... Ну сколько можно. Вашу, Машу, прошу прощения. Ну сколько раз учить можно. Для открытия удаленных файлов используем fsockopen хотя бы...
Да и еще и ман читаем.

Цитата(Kirill Baranov @  23.5.2006,  19:15 Найти цитируемый пост)
if (file_exists("$file")) {

Вообще бред и работать не будет.

Добавлено @ 19:19 
Цитата(Kirill Baranov @  23.5.2006,  19:15 Найти цитируемый пост)
Mal Hack, так при file_get_contents (сам до него допёр) переводит файл в переменную. Таким макаром в PHP код файла не передаются данные (например, данные по подключению к MySQL). И получается фигня какая-то...  

КОД УДАЛЕННОГО ФАЙЛА ТЫ ВООБЩЕ ПОЛУЧИТЬ НЕ МОЖЕШЬ НЕ ИМЕЯ ДОСТУПА К СЕРВЕРУ ПО FTP протоколу. Или, если админ идиот полный. 

Автор: madFobos 24.5.2006, 21:01
Mal Hack, я одного не понял, почуму я не могу удаленный файл с помощью file_get_contents получить? Об этом даже в мануале написано... А че надо Киррилу я так и не смог понять. Блин, учите сначала PHP, а потом "пагинаторы" пишите  smile 

Собственно из того, что я понял, надо сначало пагинтаор в функцию (или класс запихать), затем написать функцию которая вытаскивает текст из PHP (например убирает все между <? и ?>) и все. Но удаленно файл реально никак не получить, только локально... 

Автор: Mal Hack 24.5.2006, 21:05
Цитата(madFobos @  24.5.2006,  21:01 Найти цитируемый пост)
Mal Hack, я одного не понял, почуму я не могу удаленный файл с помощью file_get_contents получить? О

Потому, что это зависит от настроек ПХП, и потому что нет указания таймаута, т.е. скрипт легко подвесить. 

Автор: madFobos 24.5.2006, 21:09
Цитата(Mal Hack @  24.5.2006,  21:05 Найти цитируемый пост)
Потому, что это зависит от настроек ПХП, и потому что нет указания таймаута, т.е. скрипт легко подвесить.  


Ну настройки зачастую через .htaccess можно подправить, а таймаут скрипта все равно обычно 30 сек... Да и не думаю, что соединение по HTTP займет много времени у нормального сервера (при условии, что адрес существует конечно)
 

Автор: Mal Hack 24.5.2006, 21:12
Цитата(madFobos @  24.5.2006,  21:09 Найти цитируемый пост)
а таймаут скрипта все равно обычно 30 сек...

А ты уверен что скрипт "умрет" после этих 30 сек? А ты зхнаешь что лишнее сокетное соединение это нагрузка на сервер?
Цитата

If PHP has decided that filename specifies a registered protocol, and that protocol is registered as a network URL, PHP will check to make sure that allow_url_fopen is enabled. If it is switched off, PHP will emit a warning and the fopen call will fail.

Цитата(madFobos @  24.5.2006,  21:09 Найти цитируемый пост)
Ну настройки зачастую через .htaccess можно подправить

Цитата

allow_url_fopen  boolean

    This option enables the URL-aware fopen wrappers that enable accessing URL object like files. Default wrappers are provided for the access of remote files using the ftp or http protocol, some extensions like zlib may register additional wrappers.

        Note: This setting can only be set in php.ini due to security reasons. 

        Note: This option was introduced immediately after the release of version 4.0.3. For versions up to and including 4.0.3 you can only disable this feature at compile time by using the configuration switch --disable-url-fopen-wrapper. 


Читай-те мануал внимательнее.  

Автор: Kirill Baranov 24.5.2006, 21:17
да нужен мне пагинатор блин который пагинирует все файлы... 

Автор: madFobos 24.5.2006, 21:43
Цитата(Mal Hack @  24.5.2006,  21:12 Найти цитируемый пост)
А ты уверен что скрипт "умрет" после этих 30 сек? А ты зхнаешь что лишнее сокетное соединение это нагрузка на сервер?


Т.е. ты хочешь сказать, что скрипт завершится, а соединение останется? Или он вобще не завершится при наличии соединения?

Цитата(Mal Hack @  24.5.2006,  21:12 Найти цитируемый пост)
Читай-те мануал внимательнее.  


М-да. Погорячился я тут с .htaccess  smile 
 

Автор: Mal Hack 24.5.2006, 21:51
Цитата(madFobos @  24.5.2006,  21:43 Найти цитируемый пост)
Т.е. ты хочешь сказать, что скрипт завершится, а соединение останется? Или он вобще не завершится при наличии соединения?

Вот это, как раз и спорный вопрос. Как на никсах не знаю, но в винде, провернено, что скрипт вполне может продолжать работать долгое время.
Это просто не надежно и лишняя нагрузка на сервер. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)