Доброго времени суток. Подскажите, есть ли способ выполнить "лапшу" из HTML/PHP кода в своем скрипте и сразу же использовать результаты в виде строки далее? Код вида HTML: <b><?php echo foo(); ?></b> Конечно, это только пример, но не в этом суть. Вариант со сбросом кода в файл на винчестере, а потом подгрузкой его оттуда PHP: <?php ob_start(); include 'smth'; ob_get_clean(); ?> ввиду своей низкой скорости рассматриваю как худший вариант. Есть ли способы быстрее? Заранее спасибо.
ob_* работают очень быстро - задержки в подгружаемом коде можно заюзать процесс: PHP: <? $fp = popen('/usr/local/bin/php smth', 'r'); $result = stream_get_contents($fp); pclose($fp);
Нет, про ob_ я ничего против не имею. Мне не нравится сама необходимость работы с файлами. Есть ли способ выполнить данную работу целиком в памяти? P.S. Сейчас покопаю насчет процесса, может можно ему на вход подавать мою лапшу вместо имени файла.
Покопался немного. И вот наброски решения: PHP: <?php $descriptorspec = array ( 0 => array("pipe", "r"), 1 => array("pipe", "w"), 2 => array("file", "error-output.txt", "a+") ); $process = proc_open( 'php', $descriptorspec, $pipes ); if ( is_resource($process) ) { fwrite( $pipes[0], '<html><body><b><?php echo time(); ?></b></body></html>' ); fclose( $pipes[0] ); echo stream_get_contents( $pipes[1] ); fclose( $pipes[1] ); $return_value = proc_close( $process ); if ( !$return_value ) echo '<hr>all ok<hr>'; else echo "<hr>command returned $return_value<hr>"; } else { echo 'Error in process open'; } ?> Все корректно отрабатывает. В случае ошибок в лапше выдает как и следовало ожидать. Лог ошибок, если кому интересно, заполняется: P.S. Остается вопрос в скорости. Не будет ли работа с файлами быстрее, чем запуск нового процесса/нити? О результатах тестирования отпишусь здесь же. Жду дельных советов и предложений.
PHP: <?php $benchmark->mark( 'parse' ); $f = fopen( 'cache.phc', 'w' ); fwrite( $f, $str ); fclose( $f ); ob_start(); include 'cache.phc'; $res = ob_get_clean(); echo 'Через файл: '.$benchmark->elapsed( 'parse', TRUE ).' мсек'; echo '<br>'; $benchmark->mark( 'parse' ); $res = parse_spagetty( $str ); echo 'Через процесс: '.$benchmark->elapsed( 'parse', TRUE ).' мсек'; ?> Собственно, что и ожидалось. Работа с файлами в сотни раз быстрее.