Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод PHP в переменную, Как достичь аналогии SMARTY echo => str 
V
    Опции темы
Dima50
Дата 11.7.2009, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.10.2007

Репутация: 1
Всего: 2



Доброго дня.

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

Надо вывод каждого такого файла перенести в строку, дабы внутри скрипта была возможность ими манипулировать.

Подобная возможность есть у шаблонов SMARTY (метод fetch) не визуализирвоать шаблон, а перенаправлять его вывод в переменную.

Но у меня не шаблоны, а обыкновенные скрипты.
PM MAIL   Вверх
bars80080
Дата 11.7.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



пишешь в начале каждого файла $html = '';
затем каждый echo заменяешь на $html .=  /средствами быстрой замены/
всё.
PM MAIL WWW   Вверх
skyboy
Дата 11.7.2009, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



метод, предложенный bars80080 будет намного быстрее единственной альтернативы - буфферизации вывода(функции ob_*: ob_start, ob_end_flush etc)

PM MAIL   Вверх
Dima50
Дата 11.7.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.10.2007

Репутация: 1
Всего: 2



Цитата(bars80080 @  11.7.2009,  17:31 Найти цитируемый пост)
пишешь в начале каждого файла $html = '';
затем каждый echo заменяешь на $html .=  /средствами быстрой замены/
всё. 


Это самый очевидный способ. Но думаю должны быть более изящные способы решения данной проблемы. Не изменяя файлы содержащие алгоритм.
1) Перенаправить вывод файла программно при помощи установки каких то параметров (каких незнаю)
2) Сервер сам у себя запрашивает файл, и ответ записывает как строку. (как реализовать тоже теряюсь)

я еще года 3 назад слышал что кто-то написал FTP сервер на PHP. Значит есть возможности.

Добавлено через 6 минут и 37 секунд
Цитата(skyboy @ 11.7.2009,  18:07)
метод, предложенный bars80080 будет намного быстрее единственной альтернативы - буфферизации вывода(функции ob_*: ob_start, ob_end_flush etc)


Пока писал прошлый ответ этого не увидел. 


А у сервер сам у себя файл запросить не может? (это уже в качестве образования, и полного развития темы)
PM MAIL   Вверх
ksnk
Дата 11.7.2009, 18:45 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Цитата(skyboy @  11.7.2009,  18:07 Найти цитируемый пост)
метод, предложенный bars80080 будет намного быстрее единственной альтернативы - буфферизации вывода

Не соглашусь насчет "намного быстрее" smile Вот примерчик - 2 функции выдают строковое значение из 4 полученных параметров. Одна делает это при помощи echo и ob-оберток, а другая складывая эти значения в строку и выдавая ее наружу.
Код

function mkt(){
    static $tm ;  
    $ttm = $tm ; $tm = microtime(1) ;
    return $tm-$ttm ;
};
// первая
function inp($a1,$a2,$a3,$a4){
   ob_start();
   echo($a1);
   echo($a2);
   echo($a3);
   echo($a4);
   return ob_get_clean ();
}
// вторая
function just($a1,$a2,$a3,$a4){
   $html='';
   $html.=$a1;
   $html.=$a2;
   $html.=$a3;
   $html.=$a4;
   return $html;
};

mkt();

for($i=0;$i<100000;$i++){
   $s=inp('Hello! world;Hello! world;Hello! world;Hello! world;',
'Hello! world;Hello! world;Hello! world;Hello! world;',
'Hello! world;Hello! world;Hello! world;Hello! world;',
'Hello! world;Hello! world;Hello! world;Hello! world;'); 
}
echo(mkt().' ');

for($i=0;$i<100000;$i++){
   $s=just('Hello! world;Hello! world;Hello! world;Hello! world;',
'Hello! world;Hello! world;Hello! world;Hello! world;',
'Hello! world;Hello! world;Hello! world;Hello! world;',
'Hello! world;Hello! world;Hello! world;Hello! world;'); 
}
echo(mkt().' ');

У меня на машине примерный результат 
0.486759185791 0.394455909729, тоесть разница, по сравнению с "эффективным методом" менее, чем 0.01 секунды на 100000 повторений. Такие цифры для меня , как правило, ознаяают экономию на спичках...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
bars80080
Дата 11.7.2009, 22:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(Dima50 @  11.7.2009,  18:16 Найти цитируемый пост)
Не изменяя файлы содержащие алгоритм.

воображение сразу рисует здорую стереосистему со 100-ваттными колонками 7.1, полноцветным жк-дисплеем и многичисленными хромовыми ручками переключателей. одна беда - лоток под CD слишком большой. почему? дык, для граммпластинок



Цитата(ksnk @  11.7.2009,  18:45 Найти цитируемый пост)
У меня на машине примерный результат 
0.486759185791 0.394455909729

а ежели не бессмысленный прогон одного и того же текста, а реальная сборка страницы объёмом хотя бы до 200 кБ с подключением многочисленных классов, операций, выборками из БД и т.д.? т.е. реальная ситуация
PM MAIL WWW   Вверх
nerezus
Дата 11.7.2009, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Полноценный аналог смарти в несколько строк с этой штукой.
Реализация в неООП-стиле:

Код

function php_template($filename, $values=array()) {
    extract($values);
    ob_start();
    include $filename;
    $result = ob_get_contents();
    ob_end_clean();
    return $result;
}



--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
ksnk
Дата 11.7.2009, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



bars80080, В реальности я такое пока еще не использовал ;-) Тоже думал, что ob - это тормоза. Но вот приспичило переписать шаблонизатор и компилировать некоторые конструкции показалось удобнее с применением echo. Пришлось иследовать...

Ситуация примерно как с двойными и одинарными кавычками. Все догадываются, что одинарные быстрее, но только опыт покажет - насколько  smile 

Кстати, если увеличить объем строк-параметров, то разница становится все более заметна.

вот разница выполнения 100000 циклов
Код

0.0879821777344
0.120550870895
0.134602069855
0.113843917847
0.185922145844
0.211082935333
0.211273193359
0.163462877274
0.220993041992
0.381760120392

для такой конструкции 
Код

...
$et='Hello, world! '; // 14 символов
for($j=0;$j<10;$j++){
echo '<br>';
$par=str_repeat($et,30*$j);
mkt();
for($i=0;$i<100000;$i++){
   $s=inp($par,$par,$par,$par); 
}
$dt=mkt();
for($i=0;$i<100000;$i++){
   $s=just($par,$par,$par,$par); 
}
echo($dt-mkt());
}

То-есть первое измерение для длины 14, последнее для 14*30*10=4200 байт... То есть чем больше объем выдаваемый ob, тем менее эффективно оно формируется. Хотя, если учесть, что эффект накапливается для статыщ повторений - на него можно и наплевать...


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 12.7.2009, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



ksnk, спасибо за проделанный опыт. на самом деле, я действительно полагался "на общественное время" smile
PM MAIL   Вверх
nerezus
Дата 12.7.2009, 12:08 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 12
Всего: 43



Цитата

Все догадываются, что одинарные быстрее,
 Нисколько. Они одинаковы.


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Dima50
Дата 16.7.2009, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 78
Регистрация: 20.10.2007

Репутация: 1
Всего: 2



Спасибо всем, особенно skyboy и ksnk. Сильно помогли, тема закрыта
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0580 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.