Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung der Ausgabepuffersteuerung (Output Control) in PHP
In diesem Artikel erfahren Sie mehr über die Ausgabepuffersteuerung (Output Control) in PHP. Es hat einen gewissen Referenzwert. Freunde in Not können sich darauf beziehen. Ich hoffe, es wird für alle hilfreich sein.
Wenn wir in PHP echo oder print_r direkt ausführen, wird der Ausgabeinhalt direkt gedruckt. In einigen Fällen möchten wir jedoch nicht direkt drucken. Zu diesem Zeitpunkt können wir die Ausgabepuffersteuerung verwenden, um den Ausgabedruck zu steuern. Natürlich ist dieser Funktionsumfang nicht auf das Drucken von Inhalten beschränkt, wir können auch andere Vorgänge ausführen, die wir am Ende besprechen werden.
Lassen Sie uns zunächst einen Blick darauf werfen, wie Dinge wie Echo nicht für die Druckausgabe zugelassen werden.
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; ob_end_clean();
Ich glaube, viele Freunde haben die Funktion ob_start() gesehen. Ihre Funktion besteht darin, eine Phase der Ausgabepuffersteuerung zu starten. Die Ausgabeanweisungen im Code nach ob_start() werden in den Ausgabepuffer eingegeben. Wenn wir zu diesem Zeitpunkt ob_end_clean(), ob_clean() oder ob_get_clean() aufrufen, erfolgt keine Ausgabe. Die Funktion aller drei besteht darin, den Inhalt des Ausgabepuffers zu löschen. Spezifische Unterschiede können Sie der Funktionsbeschreibung oder der offiziellen Dokumentation am Ende des Artikels entnehmen.
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; $v = ob_get_contents(); ob_end_clean(); echo $v;
Wie oben erwähnt, löscht die Verwendung von ob_end_clean() den Inhalt des Ausgabepuffers, aber in diesem Code verwenden wir die Funktion ob_get_contents(), um den Inhalt direkt zu löschen Puffer Der Inhalt wird der Variablen v enthält den Inhalt der beiden vorherigen Absätze von Echo. Mit anderen Worten, mit dieser Reihe von Operationen erhalten wir den Inhalt, den wir ausgeben sollen, und zwar wird in einer Variablen gespeichert. Was nützt das? Wir können den Inhalt direkter Ausgabefunktionen wie phpinfo() und var_dump() abrufen und diese werden nicht auf dem Client-Bildschirm gedruckt. Zum Beispiel: ob_start();
php_info();
$v = ob_get_contents();
ob_end_clean();
echo $v;
Der Inhalt in $v ist der Inhalt von php_info(). Dies ist die zweite Fähigkeit der Ausgabepuffersteuerung.
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; flush(); ob_flush();Wenn wir den Inhalt ebenfalls direkt im Puffer ausgeben möchten, können wir tatsächlich „flush()“, „ob_flush()“, „ob_end_flush()“ und „ob_get_flush()“ verwenden Dies entspricht der erneuten Validierung und normalen Ausgabe der Echo-Ausgabeanweisungen nach ob_start().
Darüber hinaus können wir auch eine Funktion zur automatischen Aktualisierung nutzen.
ob_implicit_flush(); ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL;
Nach der Verwendung von ob_implicit_flush() müssen wir Funktionen wie ob_flush() nicht mehr manuell aufrufen, um den Pufferinhalt zu aktualisieren.
Einige Erkennungsfunktionenob_start(); ob_start(); echo 123, PHP_EOL; echo ob_get_length(), PHP_EOL; // 3 echo ob_get_level(), PHP_EOL; // 2 print_r(ob_get_status(true)); // Array // ( // [0] => Array // ( // [name] => default output handler // [type] => 0 // [flags] => 112 // [level] => 0 // [chunk_size] => 0 // [buffer_size] => 16384 // [buffer_used] => 0 // ) // [1] => Array // ( // [name] => default output handler // [type] => 0 // [flags] => 112 // [level] => 1 // [chunk_size] => 0 // [buffer_size] => 16384 // [buffer_used] => 17 // ) // ) ob_get_flush();ob_get_length() gibt die Länge des Inhalts im aktuellen Puffer zurück. Hier drucken wir nur 123 und speichern 3 Zeichen im Puffer, sodass die Ausgabe genau 3 ist. ob_get_level() gibt die Ebene des aktuellen Puffers zurück. Bitte beachten Sie, dass wir oben zweimal aufgerufen haben, was bedeutet, dass es zwei Ebenen von Puffern gibt. Die Funktion ob_get_status() ist die Statusinformation des Puffers. Eine Beschreibung der Felder finden Sie in der offiziellen Dokumentation. Hier wird nicht näher darauf eingegangen.
ob_start(function($text){ return (str_replace("apples", "oranges", $text)); }); echo "It's like comparing apples to oranges", PHP_EOL; ob_get_flush(); // It's like comparing oranges to oranges
Das endgültige Ausgabeergebnis besteht darin, den Apfelinhalt durch den Orangeninhalt zu ersetzen.
URL-Rewriter hinzufügenoutput_add_rewrite_var('var', 'value'); // some links echo '<a href="file.php">link</a> <a href="http://example.com">link2</a>'; // <a href="file.php?var=value">link</a> // <a href="http://example.com">link2</a> // a form echo '<form action="script.php" method="post"> <input type="text" name="var2" /> </form>'; // <form action="script.php" method="post"> // <input type="hidden" name="var" value="value" /> // <input type="text" name="var2" /> // </form>Sehen Sie irgendwelche Hinweise im obigen Code? Richtig, mit der Funktion „output_add_rewrite_var()“ können wir bei der PHP-Ausgabe einen Parameter zum HTML-Link oder Formularcode hinzufügen. Haben Sie irgendwelche Einsatzszenarien im Sinn? Verhinderung von CSRF-Angriffen auf POST-Formulare.
Diese Funktion wird gemäß dem Konfigurationselement url_rewriter.tags in der Datei php.ini hinzugefügt. Standardmäßig unterstützt dieses Konfigurationselement nur das from-Formular. Gleichzeitig kann es auch das href des a-Tags unterstützen. die href des Bereichs-Tags und der Frame. Die Quelle des Tags, die Quelle des Eingabe-Tags usw. Das heißt, den Eigenschaften, die diesen Tags entsprechen, werden automatisch Felder hinzugefügt. Natürlich gibt es auch eine Umkehrfunktion „output_reset_rewrite_vars()“ zum Löschen des zuvor hinzugefügten Parameters.
关于输出缓冲控制这块还有很多好玩的东西,不过限于篇幅我们先介绍到这里,将来踫到什么好的功能的应用我们再单独讲解。现在基于 Swoole 的应用越来越多,当我们需要将 TP 、 Laravel 这类传统框架转换成支持 Swoole 的时候,往往就需要在入口文件使用输出缓冲控制来进行修改。因为传统框架基本都是直接进行 echo 之类的输出的,而在 Swoole 中,echo 这类的内容是直接打印在控制台的,这就需要我们通过 ob_get_contents() 能力获得全部的输出再通过 response->end() 来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:
最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E8%BF%98%E6%90%9E%E4%B8%8D%E6%87%82PHP%E4%B8%AD%E7%9A%84%E8%BE%93%E5%87%BA%E7%BC%93%E5%86%B2%E6%8E%A7%E5%88%B6%EF%BC%9F.php
推荐学习:《PHP视频教程》
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Ausgabepuffersteuerung (Output Control) in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!