En PHP, existe-t-il un moyen de capturer la sortie d'un fichier PHP dans une variable sans utiliser la mise en tampon de sortie?

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

  •  03-07-2019
  •  | 
  •  

Question

En PHP, je veux lire un fichier dans une variable et traiter le PHP dans le fichier en même temps sans utiliser la mise en tampon de sortie. Est-ce possible?

En gros, je veux pouvoir accomplir cela sans utiliser ob_start () :

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

Est-ce possible en PHP?

Mise à jour: je souhaite effectuer des tâches plus complexes dans un rappel de sortie (où la mise en mémoire tampon de sortie n'est pas autorisée).

Était-ce utile?

La solution

Une fonctionnalité peu connue de PHP est de pouvoir traiter un fichier inclus / requis comme un appel de fonction, avec une valeur de retour.

Par exemple:

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


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

Autres conseils

D'après ce que je peux dire dans la documentation PHP, non. Pourquoi voulez-vous éviter la mise en mémoire tampon de sortie?

Le seul moyen de contourner ce problème serait d'utiliser des méthodes simples, appelant le client php en ligne de commande ou faisant une requête curl en fonction des disponibilités et des exigences particulières.

Après avoir lu les suggestions de tout le monde, lu un tas de documentation et joué avec certaines choses, j'ai trouvé ceci:

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

C’est aussi proche que possible mais cela ne fonctionne malheureusement pas. La clé consiste à inclure le bit de fermeture PHP (? & Gt; ) avant le contenu du fichier. Cela retirera eval () du mode d'évaluation PHP et traitera le contenu du fichier à partir de code non-PHP. Ensuite, s'il y a des blocs de code PHP dans le fichier, ceux-ci seront évalués en tant que PHP. Le problème, c’est que cela n’enregistre pas le contenu évalué dans la variable, il le sort simplement dans la page.

Merci à tous pour votre aide!

Joeri Sebrechts a raison. Une méthode équivalente et légèrement plus simple est disponible si le script PHP est accessible via HTTP:

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

Il convient de noter que l’utilisation de la mise en mémoire tampon de sortie serait plus simple pour les ressources.

Faites une requête curl à la page php, en prétendant être le navigateur.

Ce que vous pourriez faire, si le fichier est local, est de charger le script dans une variable sous forme de chaîne, puis d’exécuter eval sur la chaîne. Ensuite, vous pourrez faire toutes vos tâches par la suite. Sinon, vous devez utiliser la mise en mémoire tampon de sortie.

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

Mais consultez la documentation sur eval, car vous devez réellement demander au fichier que vous appelez de renvoyer ses résultats plutôt que de simplement les renvoyer en écho:

http://us2.php.net/eval

Alerte de piratage! Vous pouvez faire l'évaluation du PHP vous-même avec un peu de hackery en utilisant preg_replace_callback pour rechercher et remplacer les blocs 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;
}

Il vous faudrait modifier le fichier PHP que vous incluez pour utiliser une fonction returnOrEcho afin qu'il puisse être surchargé dans ce cas et dans le cas normal. Dans ce cas, vous voulez renvoyer pour qu'il soit repris par eval comme vous le souhaitez, mais le cas normal est de echo sans retour.

Donc, dans ce cas, vous définiriez:

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

et pour le cas normal, vous définiriez:

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

Dans votre fichier PHP (ou votre fichier de vue) inclus, vous devriez avoir quelque chose comme ceci:

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

Je ne pouvais pas obtenir le rappel en ligne preg_replace_callback , j'ai donc utilisé une fonction distincte, mais voici un exemple de procédure: preg_replace_callback () - Retourne à l'intérieur de l'instance d'objet en cours .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top