Heim >Backend-Entwicklung >PHP-Problem >Wie lösche ich den Puffer in PHP?
So löschen Sie den Puffer in PHP: 1. Verwenden Sie die Funktion „ob_clean()“, um den Inhalt im PHP-Puffer zu löschen. 2. Verwenden Sie die Funktion „ob_end_clean()“, um den Inhalt im PHP-Puffer zu löschen Schließen Sie den Ausgabepuffer.
Empfohlen: „PHP-Video-Tutorial“
php-Methode zum Löschen des Puffers
Methode 1: ob_end_clean
ob_end_clean – Löschen (löschen) des Puffer und schließen Sie den Ausgabepuffer
Syntax:
ob_end_clean ( void ) : bool
Diese Funktion verwirft den Inhalt des obersten Ausgabepuffers und schließt diesen Puffer. Wenn Sie den Inhalt des Puffers weiterverarbeiten möchten, müssen Sie ob_get_contents() vor ob_end_clean() aufrufen, da der Pufferinhalt beim Aufruf von ob_end_clean() verworfen wird.
Rückgabewert
Gibt TRUE bei Erfolg oder FALSE bei Fehler zurück. Der erste Grund für den Fehler ist, dass zum Zeitpunkt des Aufrufs kein aktiver Puffer vorhanden ist oder der Puffer aus irgendeinem Grund nicht gelöscht werden kann (vielleicht für einen speziellen Puffer).
Methode 2: Verwenden Sie ob_clean()
ob_clean – leeren (löschen) Sie den Ausgabepuffer
Beschreibung
ob_clean ( void ) : void
Diese Funktion wird verwendet, um den Inhalt des Ausgabepuffers zu verwerfen.
Diese Funktion zerstört den Ausgabepuffer nicht wie die Funktion ob_end_clean().
Die Ausgabepufferung muss von ob_start() mit dem Flag PHP_OUTPUT_HANDLER_CLEANABLE gestartet worden sein. Andernfalls hat ob_clean() keine Wirkung.
Rückgabewert
Es gibt keinen Rückgabewert.
Wissen erweitern
Was ist ein Puffer?
Einfach ausgedrückt besteht die Funktion eines Puffers darin, den Eingabe- oder Ausgabeinhalt zuerst in den Speicher zu legen, ohne ihn anzuzeigen oder zu lesen. Was ist das? Ein Puffer, das ist eine sehr weit gefasste Frage. Wenn Sie interessiert sind, können Sie Informationen im Internet finden
Tatsächlich besteht die wichtigste Rolle des Puffers darin, Hochgeschwindigkeits-CPUs und relativ langsame E/A-Geräte zu koordinieren. usw.) Die Funktionsweise von
Wo wird der Puffer verwendet?
Wenn Sie den Puffer von PHP verstehen möchten, müssen Sie wissen, wo der Puffer beim Ausführen von PHP festgelegt ist Wenn Sie beim Ausführen von PHP auf Code stoßen, der Daten wie echo print_r ausgibt, legt PHP die auszugebenden Daten in den PHP-eigenen Puffer und wartet auf die Ausgabe.
Wenn der PHP-eigene Puffer die Anweisung empfängt, wird die Anweisung angezeigt ausgegeben werden sollen, werden die Daten im Puffer an Apache ausgegeben. Apache empfängt die von PHP ausgegebenen Daten, speichert die Daten dann im Apache-eigenen Puffer und wartet, bis die Ausgabe ausgegeben wird
Wenn Apache akzeptiert, wenn die Anweisung erreicht wird , nur um den Inhalt des Puffers auszugeben, wird der Inhalt des Puffers ausgegeben und an den Browser zurückgegeben.
Schritte: Führen Sie php----> aus be Die Daten werden im PHP-eigenen Puffer abgelegt und warten auf die Ausgabe ----> (Ausgabepufferinhalt empfangen). Die Daten werden an Apache ausgegeben und im Apache-eigenen Puffer gespeichert ----> (Ausgabespezifikation empfangen) Pufferbereichsinhalt Ausgabe, zurückgegeben an den Browser
echo、print => php output_buffering => webServer buffer => browser buff => browser display
Das heißt: Skriptausgabe => PHP-Puffereinstellungen => Systempuffereinstellungen (Apache, Nginx) => Browser-Puffereinstellungen => für Benutzer angezeigt
Daraus ist ersichtlich, dass bei PHP Möchte Daten ausgeben, durchläuft es zwei Puffer (zuerst seinen eigenen, dann den von Apache) und kehrt dann zum Browser zurück.
Welche Rolle spielt der Puffer in PHP?1 dass einige Daten vor der Verwendung der Header-Funktion ausgegeben wurden, was zu bestimmten Fehlern führt, z. B. Header-Informationen können nicht geändert werden – Header wurden bereits gesendet von;
echo "this is test"; header("LOCATION http://www.baidu.com");
Der Grund für diesen Fehler Ja, einige Daten wurden vor dem Header ausgegeben, und Während diese Daten ausgegeben werden, sendet Apache gleichzeitig einen Antwortstatus an den Browser (da eine Ausgabe erfolgt, ist die Anforderung gültig), und dann versuchen Sie es erneut. Wenn Sie die Header-Funktion
verwenden, um den HTTP-Header zu senden, ist dies der Fall Es wird ein Fehler zurückgegeben. Der Fehler bedeutet: Der HTTP-Header wurde gesendet und Sie können ihn nicht ändern.
Warum kann dieser Fehler durch die Verwendung eines Puffers vermieden werden?Weil die Header-Funktion nicht vom Puffer beeinflusst wird Funktion: PHP führt den Apache sofort aus, um diesen HTTP-Header an den Browser zu senden.
Die Ausgabedaten werden im Puffer gespeichert. Dadurch können die zuvor aufgetretenen Fehler vermieden werden 2. Beim Schreiben eines Datei-Download-Programms über PHP ((Beispiel) Das Prinzip der PHP-Methode zur Implementierung der HTTP-Haltepunkt-Wiederaufnahme)
Um das Herunterladen von Dateien sicherer zu machen und die Kontrollierbarkeit zu verbessern, verwenden viele Freunde gerne PHP zum Schreiben von Datei-Downloads Das Prinzip ist sehr einfach: Lesen und zeigen Sie den Dateiinhalt über fwrite an und senden Sie dann den HTTP-Header über den Header. Teilen Sie dem Browser mit, dass es sich um einen Anhang handelt, damit er den Download-Effekt bereitstellen kann.
如果用上面的办法提供下载页面,会碰到一个效率问题,如果一个文件很大,假设为100M,那么在不开启缓冲区输出的情况下,必须要把100M数据全部读出,然后一次返回到页面上,如果这样做,用户将会在所有数据读完之后才会得到响应,降低了用户体验感.
如果开启了输出缓冲区,当PHP程序读完文件的某一段,然后马上输出到apache,然后让apache马上返回到浏览器,这样就可以减少用户等待时间.那后面的数据怎么办呢?我们可以写一个while循环,一直一段一段地读取文件每读一段,就马上输出,直到把文件全部输出为止,这样浏览器就可以持续地接受到数据,而不必等到所有文件读取完毕. 另外,该做法还解决了另外一个很严重的问题.例如一个文件是100M,如果不开启缓冲区的情况下,则需要把100M文件全部读入内存,然后再输出.但是,如果PHP程序做了内存限制呢?为了保证服务器的稳定,管理员通常会把PHP的执行
内存设一个限制(通过php.ini总的memory_limit, 其默认值是8M), 也就是每个PHP程序使用的内存不能使用超过这个值的内存. 假设该值为8M,而要读入的文件是100M,根本就没有足够的内存来读入该文件.这个时候,我们就需要用到上面的
办法来解决这个问题,每次只读某一段,这样就可以避免了内存的限制
3、静态文件缓存
现在很多公司有这么一个需求, 就是某一个页面在第一次访问的时候,会执行PHP,然后把显示的内容返回到浏览器,同时需要把这次显示的内容保存到服务器上,这样下次访问的时候,就直接把保存在服务器上的文件直接显示,而不需要通过PHP来做操作这就是所谓的”静态页面缓存”.那怎么样才能做到把内容返回到浏览器的同时把数据保存到服务器上呢?这就要用到输出缓冲区了.
ob_start(); echo 'aaa'; $string = ob_get_contents(); file_put_contents('a.html', $string); ob_flush(); flush();
与输出缓冲区有关的配置
在PHP.INI中,有两个跟缓冲区紧密相关的配置项
1.output_buffering
该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);
on - 开启缓冲区
off - 关闭缓冲区
256k - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);
2.implicit_flush
该配置直接影响apache的缓冲区,有2种配置参数. on/off
on - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器
off - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令
与缓冲区有关的函数
1.ob_implicit_flush
作用和implicit_flush一样,是否自动刷新apache的缓冲区
2.flush
作用是发送指令到apache,让apache刷新自身的输出缓冲区.
3.ob_start
打开输出缓冲区,无论php.ini的文件如何配置,如果使用该函数,即使output_buffering设置成off,也会打开输出缓冲区
ob_start函数还接受一个参数,该参数是一个函数的回调,意思是,在输入缓冲区内容之前,需要使用调用传递进来的参数把缓冲区的内容处理一次,再放入缓冲区内
4.ob_flush
指示php本身刷新自身的缓冲区,把数据发送到apache
5.ob_clean
清除php缓冲区里面的内容
6.ob_end_clean
清除php缓冲区内的内容,并且关闭输出缓冲区
7.ob_end_flush
把php自身的缓冲区里的内容发送到apache,并把清除自身缓冲区内的内容
8.ob_get_clean
获取缓冲区的内容之后,清除缓冲区.
9.ob_get_contents
获取输出缓冲区里的内容
10.ob_get_flush
获取缓冲区里的内容,并且把这些内容发送到apache
11.ob_get_length
获取缓冲区里内容的长度
12.ob_list_handlers
获取运行ob_start时,所回调的函数名称, 例如:
ob_start(‘ob_gzhandler’);
print_r(ob_list_handlers);
将打印出ob_gzhandler;
13.ob_gzhandler
该函数的作用是作为ob_start的回调参数, 在缓冲区刷新之前,会调用该函数对数据进行到底gzip或者deflate压缩.这个函数需要zlib扩展的支持.
Das obige ist der detaillierte Inhalt vonWie lösche ich den Puffer in PHP?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!