Em PHP, existe uma maneira de capturar a saída de um arquivo PHP em uma variável sem usar o buffer de saída?

StackOverflow https://stackoverflow.com/questions/222925

  •  03-07-2019
  •  | 
  •  

Pergunta

No PHP, eu quero ler um arquivo em uma variável e processar o PHP no arquivo ao mesmo tempo sem usar o buffer de saída. Isso é possível?

Essencialmente eu quero ser capaz de fazer isso sem usar ob_start():

<?php
ob_start();
include 'myfile.php';
$xhtml = ob_get_clean();
?>

Isso é possível em PHP?

Update: Eu quero fazer algumas coisas mais complexas dentro de um retorno de chamada de saída (onde o buffer de saída não é permitido)

.
Foi útil?

Solução

Um recurso pouco conhecido do PHP é ser capaz de tratar um / arquivo incluído necessário, como uma chamada de função, com um valor de retorno.

Por exemplo:

// myinclude.php
$value = 'foo';
$otherValue = 'bar';
return $value . $otherValue;


// index.php
$output = include './myinclude.php';
echo $output;
// Will echo foobar

Outras dicas

De que eu posso dizer na documentação do PHP, não. Por que você quer evitar o buffer de saída?

A única maneira de contornar isso seria métodos hacky envolvendo quer invocando o cliente de linha de comando php ou fazer um pedido de onda com base no que está disponível e quais os requisitos específicos são.

Depois de ler sugestões de todos, lendo um monte de documentação, e brincar com algumas coisas, eu vim com isso:

<?php
$file = file_get_contents('/path/to/file.php');
$xhtml = eval("?>$file");
?>

É o mais perto que eu poderia conseguir, mas, infelizmente, não funciona. A chave para isso é incluir o fechamento PHP mordeu (?>) antes de o conteúdo do arquivo. Isso levará a eval() do modo PHP-avaliação e irá tratar o conteúdo do arquivo começando como código não-PHP. Então, se há blocos de código PHP dentro do arquivo, estes serão avaliadas como PHP. A chatice é que ele não salva o conteúdo eval'd na variável, apenas saídas lo para a página.

Obrigado pela ajuda todos!

Joeri Sebrechts está correto. Um método equivalente e um pouco mais fácil está disponível se o script PHP é HTTP acessível:

$data = file_get_contents('http://google.com/');

Note-se que o uso de buffer de saída seria mais fácil sobre os recursos.

Faça um pedido de onda para a página php, essencialmente, fingindo ser o browser.

O que você poderia fazer, se o arquivo é local, é carregar o script em uma variável como uma string, eval em seguida, executar na corda. Depois, você pode fazer todas as suas outras coisas depois. Caso contrário, você tem que usar o buffer de saída.

$fileData = file_get_contents('fileOnDisk.php');
$results = eval($fileData);

Mas verifique a documentação sobre eval, porque você realmente tem que ter o arquivo que você está chamando de retorno seus resultados em vez de apenas eco-los:

http://us2.php.net/eval

Alerta hack! Você poderia fazer a avaliação do PHP-se com um pouco de hackery usando preg_replace_callback para procurar e substituir os blocos PHP.

function evalCallback($matches)
{
    // [0] = <?php return returnOrEcho("hi1");?>
    // [1] = <?php
    // [2] = return returnOrEcho("hi1");
    // [3] = ?>
    return eval($matches[2]);
}

function evalPhp($file)
{
    // Load contents
    $contents = file_get_contents($file);
    // Add returns
    $content_with_returns = str_replace(
                               "returnOrEcho"
                              ,"return returnOrEcho"
                              ,$contents);
    // eval
    $modified_content = preg_replace_callback(
                              array("|(\<\?php)(.*)(\?\>)|"
                             ,"evalCallback"
                             ,$content_with_returns);
    return $modified_content;
}

Você teria que modificar o arquivo PHP você está incluindo usar uma função returnOrEcho para que ele possa ser sobrecarregado para este caso eo caso normal. Neste caso, você quer return para que ele vai ser pego pela eval da maneira que você quer, mas o caso normal é echo sem retorno.

Portanto, para este caso, você definiria:

function returnOrEcho($str)
{
    return $str;
}

e para o caso normal você definiria:

function returnOrEcho($str)
{
    echo $str;
}

Em seu arquivo incluído PHP (ou arquivo de visão) você teria algo como isto:

<?php returnOrEcho("hi1");?>
<?php returnOrEcho("hi3"."oo");?>
<?php returnOrEcho(6*7);?>

Eu não poderia começar preg_replace_callback linha de retorno trabalhando, então eu usei uma função separada, mas não é um exemplo de como fazê-lo: preg_replace_callback () -. Calback dentro atual objeto de instância

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top