За последние 24 часа нас посетили 33949 программистов и 1757 роботов. Сейчас ищет 1341 программист ...

Выполнение PHP скрипта в другом скрипте

Тема в разделе "Прочие вопросы по PHP", создана пользователем AterCattus, 7 июл 2008.

  1. AterCattus

    AterCattus Активный пользователь

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Доброго времени суток.
    Подскажите, есть ли способ выполнить "лапшу" из HTML/PHP кода в своем скрипте и сразу же использовать результаты в виде строки далее?

    Код вида
    HTML:
    1. <b><?php echo foo(); ?></b>
    Конечно, это только пример, но не в этом суть.

    Вариант со сбросом кода в файл на винчестере, а потом подгрузкой его оттуда
    PHP:
    1. <?php ob_start(); include 'smth'; ob_get_clean(); ?>
    ввиду своей низкой скорости рассматриваю как худший вариант.

    Есть ли способы быстрее?
    Заранее спасибо.
     
  2. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    ob_* работают очень быстро - задержки в подгружаемом коде

    можно заюзать процесс:
    PHP:
    1. <?
    2. $fp = popen('/usr/local/bin/php smth', 'r');
    3. $result = stream_get_contents($fp);
    4. pclose($fp);
     
  3. AterCattus

    AterCattus Активный пользователь

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Нет, про ob_ я ничего против не имею. Мне не нравится сама необходимость работы с файлами.
    Есть ли способ выполнить данную работу целиком в памяти?

    P.S. Сейчас покопаю насчет процесса, может можно ему на вход подавать мою лапшу вместо имени файла.
     
  4. Ti

    Ti Активный пользователь

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    можно
    Код (Text):
    1. % echo '<? echo "waka waka";' | php
     
  5. AterCattus

    AterCattus Активный пользователь

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Покопался немного. И вот наброски решения:
    PHP:
    1. <?php   $descriptorspec = array (
    2.         0 => array("pipe", "r"),
    3.         1 => array("pipe", "w"),
    4.         2 => array("file", "error-output.txt", "a+")
    5.     );
    6.    
    7.     $process = proc_open( 'php', $descriptorspec, $pipes );
    8.     if ( is_resource($process) ) {
    9.        
    10.         fwrite( $pipes[0], '<html><body><b><?php echo time(); ?></b></body></html>' );
    11.         fclose( $pipes[0] );
    12.        
    13.         echo stream_get_contents( $pipes[1] );
    14.         fclose( $pipes[1] );
    15.        
    16.         $return_value = proc_close( $process );
    17.         if ( !$return_value ) echo '<hr>all ok<hr>';
    18.         else
    19.             echo "<hr>command returned $return_value<hr>";
    20.     }
    21.     else {
    22.         echo 'Error in process open';
    23.     } ?>
    Все корректно отрабатывает. В случае ошибок в лапше выдает как и следовало ожидать.

    Лог ошибок, если кому интересно, заполняется:
    P.S. Остается вопрос в скорости. Не будет ли работа с файлами быстрее, чем запуск нового процесса/нити? О результатах тестирования отпишусь здесь же.

    Жду дельных советов и предложений.
     
  6. AterCattus

    AterCattus Активный пользователь

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    PHP:
    1. <?php   $benchmark->mark( 'parse' );
    2.         $f = fopen( 'cache.phc', 'w' );
    3.         fwrite( $f, $str );
    4.         fclose( $f );
    5.         ob_start();
    6.         include 'cache.phc';
    7.         $res = ob_get_clean();
    8.     echo 'Через файл: '.$benchmark->elapsed( 'parse', TRUE ).' мсек';
    9.    
    10.     echo '<br>';
    11.    
    12.     $benchmark->mark( 'parse' );
    13.         $res = parse_spagetty( $str );
    14.     echo 'Через процесс: '.$benchmark->elapsed( 'parse', TRUE ).' мсек'; ?>
    Собственно, что и ожидалось. Работа с файлами в сотни раз быстрее.