Für einen neuen PHP-Programmierer ist der PHP-Puffer nahezu transparent. Ihrer Meinung nach fliegen die Daten mit einer echo print_r-Funktion mit einem „Swoosh“-Geräusch zum Browser und werden dort angezeigt. Ich habe immer so einfach gedacht. Tatsächlich haben sich die Dinge in der Welt der Technologie immer von der Einfachheit zur Komplexität weiterentwickelt. Vielleicht haben diese Technologieentwickler so einfach angefangen wie Sie und ich, aber angesichts der grausamen Realität mussten sie ihre Strategien anpassen, um besser zu werden Schließlich haben sie an die Dinge gedacht, die die Maschine effizienter machen.
Wenn wir von Puffer sprechen, müssen wir ihn mit dem Cache vergleichen. Schauen Sie sich einfach an, was sie bewirken. Caching löst das Problem, Daten schnell zu finden und zu nutzen und CPU-Verbrauch einzusparen, während Pufferung das Problem der Nichtübereinstimmung zwischen Hochgeschwindigkeits-CPU und langsamen E/A-Geräten löst.
Lassen Sie uns über den anderen Protagonisten dieses Artikels sprechen, die ob-Funktion ist die Abkürzung für output_buffering. Da es sich bei der ob-Funktion um eine PHP-Erweiterungsfunktion handelt, ist die Hauptoperation der ob-Funktion PHP-Puffer.
Nachdem wir kurz auf die beiden Protagonisten dieses Artikels eingegangen sind, müssen wir zum Ausgangsthema zurückkehren. Wie gelangen die von der Funktion echo print_r ausgegebenen Daten zum Browser, damit der Benutzer sie sehen kann? Der eigentliche Prozess ist wie folgt:
echo、print_r=>php output_buffering=>webServer buffer=>browser buffer=>browser display
Wir können deutlich sehen, dass von der Funktion echo, print_r bis zum Senden von Informationen an den Client zwei Puffer durchlaufen werden über einen Browserpuffer. Was wir in diesem Artikel hauptsächlich besprechen, ist PHP-Ausgabepufferung.
Nutzung des Puffers, wenn die ob-Funktion nicht verwendet wird
Unsere Codes verwenden die ob-Funktion oft überhaupt nicht. Verwenden sie also den Puffer? Dies hängt von den PHP-Einstellungen ab. Der Puffer wird über die Variable „output_buffering“ in php.ini gesteuert. Der Standardwert ist „off“ und kann auf „on“ gesetzt werden, um den Puffer zu öffnen. Nach dem Aufruf des Puffers verwendet der Code tatsächlich den Puffer, auch wenn die ob-Funktion nicht im Programm verwendet wird. Darüber hinaus ist PHP im CLI-Modus unabhängig von der Einstellung von „output_buffering“ in „php.ini“ standardmäßig immer geschlossen.
Warum ist es ein Puffer? Vereinfacht ausgedrückt hat die Hochgeschwindigkeits-CPU ihre eigenen Daten frühzeitig verarbeitet und möchte sie über die Leitung an den Benutzer übertragen, aber die Leitung ist zu schmal und kann nicht sofort übertragen werden. Wenn ein Puffer eingeführt wird, kann die CPU die generierten Daten schnell in den Puffer legen und sie dann an einem kühlen Ort ruhen lassen. Der Puffer gibt Daten zeitnah gemäß den Anweisungen aus. Dadurch wird der Widerspruch zwischen Hochgeschwindigkeits-CPU und langsamen E/A-Geräten effektiv gelöst.
Wann werden die Pufferdaten ausgegeben? 1. Wenn der Puffer voll ist, verfügt der Puffer über eine Kapazität und der Inhalt wird automatisch ausgegeben, wenn das Limit erreicht ist. 2. Die Skriptausführung ist abgeschlossen. Viele kleine Programme geben nicht so viel Inhalt aus, sodass Sie mit der Ausgabe nicht warten können, bis der Puffer voll ist ~ Das ist natürlich.
Puffernutzung bei Verwendung der ob-Funktion
ob_start()
Ausgabepufferung aktivieren. Diese Funktion ist eine der Funktionen, die wir am häufigsten aufrufen. Wenn „output_buffering“ auf „on“ oder „x k“ gesetzt ist, öffnet diese Funktion den Ausgabepuffer nicht so sehr, sondern erweitert den Ausgabepuffer auf eine große Größe. Unter der Bedingung, dass „output_buffering“ auf „off“ gesetzt ist, übernimmt ob_start natürlich die Rolle des Öffnens des Puffers. ob_start() kann auch einen optionalen Parameter an die Funktion „output_callback“ übergeben, der im offiziellen PHP-Handbuch ausführlich erläutert wird.
ob_get_contents()
Ruft nur den Inhalt des Ausgabepuffers ab, löscht ihn jedoch nicht.
ob_end_clean()与ob_clean()
Der Unterschied zwischen diesen beiden Funktionen ist buchstäblich zu sehen. Ersteres löscht den Pufferinhalt und schließt ihn, während letzteres nur die Löscharbeit übernimmt. Es ist zu beachten, dass nach Verwendung dieser beiden Funktionen die vorherigen Funktionen wie echo und print_r den Inhalt nicht ausgeben.
Der Autor hat einmal versucht, den Inhalt von ob_get_contents() über print_r auszudrucken, und hat dann ob_clean() aufgerufen, um den Puffer zu löschen, damit er nicht beeinträchtigt wird Nachfolgende Operationen am Puffer schlugen wiederholt fehl. Wenn Sie sorgfältig darüber nachdenken, wird der Inhalt von print_r erneut in den Puffer geschrieben und dann die Operation ob_clean() ausgeführt, sodass natürlich keine Ausgabe erfolgt. Durch Aufrufen der Funktion ob_flush() vor der Operation ob_clean kann der gewünschte Effekt erzielt werden.
ob_flush()与flush()
ob_flush() sendet den Inhalt des Puffers und verwirft den Inhalt. Daher ist es am besten, vor dieser Funktion ob_get_contents() zu verwenden, um den Pufferinhalt abzurufen. Flush() leert den serverseitigen Puffer und sendet ihn an den Client. Daher sollte aus Prozesssicht zuerst ob_flush() und dann die Flush-Funktion aufgerufen werden.
另外说明下再Apache buffer flush()的工作原理:在apache module的sapi下,flush会通过调用sapi_module()的flush成员函数指针,间接使用apache的api::ap_rflush刷新apache的输出缓冲区。当然apache其他模块比如mod_gzip可能改变这个动作的结果,可能自己进行输出缓冲区,这将导致flush()函数产生的结果不会立即被送到客户端浏览器。
ob_get_clean()
如果你已经熟练掌握ob_get_contents()和ob_clean(),那这个函数就很简单了。因为它是前两者的结合体。它主要是得到当前缓冲区的内容并删除当前输出缓冲区。
ob函数还有很多,但大部分用法比较简单,理解较为容易。大家可以参照php手册 ,里面会有详细的解释。本文列出了笔者开始并不是很理解的一些函数,当然今后还会有新的问题出现,想到问题并且解决问题,生活的乐趣也许就在此处吧。
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Beispiele für ob-Funktionserweiterungen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!