Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der Ausgabepuffersteuerung (Output Control) in PHP

Detaillierte Erläuterung der Ausgabepuffersteuerung (Output Control) in PHP

青灯夜游
青灯夜游nach vorne
2021-06-21 18:23:183668Durchsuche

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.

Detaillierte Erläuterung der Ausgabepuffersteuerung (Output Control) in PHP

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.

Ausgabe löschen

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.

Den Inhalt des Ausgabepuffers abrufen

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 zugewiesen. Zu diesem Zeitpunkt, v. Zu diesem Zeitpunkt, 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.

Den Pufferinhalt aktualisieren (ausgeben)

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 Erkennungsfunktionen

ob_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.

Verwenden Sie die Rückruffunktion von ob_start(), um den Inhalt des Ausgabepuffers zu ersetzen.

Dies ist ein Beispiel, aber es kann auf andere Funktionen erweitert werden, z. B. können wir es für globale Ausgabefilterung, CSS oder JS verwenden Optimierung der Dateikomprimierung und mehr.

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ügen

output_add_rewrite_var('var', 'value');
// some links
echo &#39;<a href="file.php">link</a>
<a href="http://example.com">link2</a>&#39;;

// <a href="file.php?var=value">link</a>
// <a href="http://example.com">link2</a>

// a form
echo &#39;<form action="script.php" method="post">
<input type="text" name="var2" />
</form>&#39;;

// <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() 来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:

  • 1.在PHP中,像header(), session_start(), setcookie() 等这样的发送头文件的函数前,不能有任何的输出,而利用输出缓冲控制函数可以在这些函数前进行输出而不报错
  • 2.对输出的内容进行处理,例如生成静态缓存文件、进行gzip压缩输出,这算是较常用的功能了
  • 3.捕获一些不可获取的函数输出,例如phpinfo(), var_dump() 等等,这些函数都会将运算结果显示在浏览器中,而如果我们想对这些结果进行处理,则用输出缓冲控制函数是个不错的方法。说的通俗点,就是这类函数都不会有返回值,而要获取这些函数的输出数据,就要用到输出缓冲控制函数
  • 4.对一些数据进行实时的输出

最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。

  • flush — 刷新输出缓冲
  • ob_clean — 清空(擦掉)输出缓冲区
  • ob_end_clean — 清空(擦除)缓冲区并关闭输出缓冲
  • ob_end_flush — 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_flush — 冲刷出(送出)输出缓冲区中的内容
  • ob_get_clean — 得到当前缓冲区的内容并删除当前输出缓。
  • ob_get_contents — 返回输出缓冲区的内容
  • ob_get_flush — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
  • ob_get_length — 返回输出缓冲区内容的长度
  • ob_get_level — 返回输出缓冲机制的嵌套级别
  • ob_get_status — 得到所有输出缓冲区的状态
  • ob_gzhandler — 在ob_start中使用的用来压缩输出缓冲区中内容的回调函数。ob_start callback function to gzip output buffer
  • ob_implicit_flush — 打开/关闭绝对刷送
  • ob_list_handlers — 列出所有使用中的输出处理程序。
  • ob_start — 打开输出控制缓冲
  • output_add_rewrite_var — 添加URL重写器的值(Add URL rewriter values)
  • output_reset_rewrite_vars — 重设URL重写器的值(Reset URL rewriter values)
测试代码:
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen