-
Notifications
You must be signed in to change notification settings - Fork 43
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
937 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<!-- EN-Revision: 7ad99aeafea66a1562f668aa3cb11dcc9d9cb951 Maintainer: samesch Status: ready --> | ||
<!-- Reviewed: no --> | ||
<chapter xml:id="outcontrol.flushing-system-buffers" xmlns="http://docbook.org/ns/docbook"> | ||
<title>Leeren (senden) der Systempuffer</title> | ||
<para> | ||
PHP bietet zwei Möglichkeiten, die Systempuffer zu leeren (den Inhalt zu | ||
senden und zu löschen): | ||
Durch den Aufruf von <function>flush</function> und durch die Aktivierung des | ||
impliziten Leerens mittels <function>ob_implicit_flush</function> oder der | ||
&php.ini;-Direktive <link linkend="ini.implicit-flush">implicit_flush</link>. | ||
</para> | ||
|
||
<section> | ||
<title>Verhalten beim Leeren des Ausgabepuffers</title> | ||
<para> | ||
Wenn das implizite Leeren des Ausgabepuffers deaktiviert ist, leert ihn PHP | ||
nur dann, wenn <function>flush</function> aufgerufen wird oder wenn das | ||
Skript endet. | ||
</para> | ||
<para> | ||
Wenn das implizite Leeren des Ausgabepuffers aktiviert ist, versucht PHP ihn | ||
nach jedem Codeblock, der zu einer Ausgabe führt, zu leeren. | ||
Ausgabe sind in diesem Zusammenhang Daten mit einer Länge ungleich Null: | ||
<itemizedlist xml:id="outputcontrol.what-is-output"> | ||
<listitem> | ||
<simpara> | ||
außerhalb der Tags <literal><?php ?></literal> | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
die von Sprachkonstrukten und Funktionen ausgegeben werden, deren | ||
ausdrücklicher Zweck es ist, vom Benutzer bereitgestellte Variablen oder | ||
Zeichenketten auszugeben, &zb; <function>echo</function>, | ||
<function>print</function>, <function>printf</function>, | ||
<function>var_dump</function>, <function>var_export</function>, | ||
<function>vprintf</function> | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
die von Funktionen ausgegeben werden, deren Zweck es ist, | ||
Daten/Informationen über das laufende Skript oder PHP zu sammeln und | ||
auszugeben, &zb; <function>debug_print_backtrace</function>, | ||
<function>phpcredits</function>, <function>phpinfo</function>, | ||
<methodname>ReflectionExtension::info</methodname> | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
die von PHP bei einer nicht abgefangenen Exception oder einem nicht | ||
behandelten Fehler ausgegeben werden (abhängig von den Einstellungen von | ||
<link linkend="ini.display-errors">display_errors</link> und | ||
<link linkend="ini.error-reporting">error_reporting</link>) | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
alles, was auf <literal>php://output</literal> geschrieben wird | ||
</simpara> | ||
</listitem> | ||
</itemizedlist> | ||
</para> | ||
<note> | ||
<simpara> | ||
Die Ausgabe leerer Zeichenketten und das Senden von Headern werden nicht | ||
als Ausgabe betrachtet und führt nicht zu einem Leeren des Puffers. | ||
</simpara> | ||
</note> | ||
<warning> | ||
<simpara> | ||
Wenn das implizite Leeren aktiviert ist, führen auch Steuerzeichen (&zb; | ||
<literal>"\n"</literal>, <literal>"\r"</literal>, <literal>"\0"</literal>) | ||
zum Leeren. | ||
</simpara> | ||
</warning> | ||
</section> | ||
|
||
<section> | ||
<title>Einschränkungen</title> | ||
<para> | ||
Mit dieser Funktionalität können die Ausgabepuffer der Benutzerebene nicht | ||
geleert werden. Um diese zusammen mit den Systempuffern zu verwenden, müssen | ||
die Ausgabepuffer der Benutzerebene vor den Systempuffern geleert werden, | ||
damit PHP überhaupt eine Ausgabe erzeugen kann. | ||
</para> | ||
<warning> | ||
<simpara> | ||
Wenn die Funktion <function>flush</function> aufgerufen wird oder | ||
implizites Leeren aktiviert ist, besteht die Gefahr, dass die | ||
Ausgabehandler von Ausgabepuffern auf Benutzerebene, die Header in einem | ||
Web-Kontext setzen und senden (&zb; <function>ob_gzhandler</function>), | ||
gestört werden, indem die Header gesendet werden, bevor diese Handler dies | ||
tun können. | ||
</simpara> | ||
</warning> | ||
<para> | ||
Die von der zugrundeliegenden Software/Hardware implementierte Pufferung | ||
kann von PHP nicht außer Kraft gesetzt werden und sollte bei der Arbeit mit | ||
den PHP-Funktionen zur Pufferungssteuerung berücksichtigt werden. | ||
Die Überprüfung der Pufferungseinstellungen des Webservers, des Browsers und | ||
der Konsole und die Beschäftigung damit kann mögliche Probleme verringern. | ||
Bei der Arbeit in einem Web-Kontext können entweder die | ||
Pufferungseinstellungen des Webservers oder die Pufferung des Skripts so | ||
angepasst werden, dass sie zusammenarbeiten, während die | ||
Pufferungsstrategien der verschiedenen Browser umgangen werden können, indem | ||
die Pufferung im PHP-Skript angepasst wird. | ||
Auf Konsolen, die eine Zeilenpufferung implementieren, könnten vor dem | ||
Leeren der Ausgabe an den entsprechenden Stellen Zeilenumbrüche eingefügt | ||
werden. | ||
</para> | ||
</section> | ||
|
||
<section> | ||
<title>Unterschiede zwischen den <acronym>SAPI</acronym>s beim Leeren</title> | ||
<para> | ||
Obwohl das Leeren der Puffer von jeder <acronym>SAPI</acronym> auf eine | ||
etwas andere Weise implementiert wird, fallen diese Implementierungen in | ||
eine von zwei Kategorien: | ||
<itemizedlist> | ||
<listitem> | ||
<simpara> | ||
<acronym>SAPI</acronym>s, die in einem Web-Kontext verwendet werden, | ||
leeren zuerst die Header und dann die Ausgabe; | ||
<literal>Apache2Handler</literal>, <literal>CGI</literal> | ||
<literal>FastCGI</literal> und <literal>FPM</literal> sind solche | ||
<acronym>SAPI</acronym>s. | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
andere <acronym>SAPI</acronym>s wie <literal>CLI</literal> und | ||
<literal>embed</literal> leeren nur die Ausgabe | ||
</simpara> | ||
</listitem> | ||
</itemizedlist> | ||
</para> | ||
</section> | ||
|
||
</chapter> | ||
<!-- Keep this comment at the end of the file | ||
Local variables: | ||
mode: sgml | ||
sgml-omittag:t | ||
sgml-shorttag:t | ||
sgml-minimize-attributes:nil | ||
sgml-always-quote-attributes:t | ||
sgml-indent-step:1 | ||
sgml-indent-data:t | ||
indent-tabs-mode:nil | ||
sgml-parent-document:nil | ||
sgml-default-dtd-file:"~/.phpdoc/manual.ced" | ||
sgml-exposed-tags:nil | ||
sgml-local-catalogs:nil | ||
sgml-local-ecat-files:nil | ||
End: | ||
vim600: syn=xml fen fdm=syntax fdl=2 si | ||
vim: et tw=78 syn=sgml | ||
vi: ts=1 sw=1 | ||
--> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,120 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<!-- EN-Revision: 7ad99aeafea66a1562f668aa3cb11dcc9d9cb951 Maintainer: samesch Status: ready --> | ||
<!-- Reviewed: no --> | ||
<chapter xml:id="outcontrol.output-buffering" xmlns="http://docbook.org/ns/docbook"> | ||
<title>Ausgabepufferung</title> | ||
<para> | ||
Bei der Ausgabepufferung wird die Ausgabe gepuffert (vorübergehend | ||
gespeichert), bevor sie an den Browser (in einem Web-Kontext) oder an die | ||
Shell (in der Befehlszeile) gesendet und dann verworfen wird. | ||
Während die Ausgabepufferung aktiv ist, wird keine Ausgabe vom Skript | ||
gesendet und die Ausgabe wird stattdessen in einem internen Puffer | ||
gespeichert. | ||
</para> | ||
|
||
<section> | ||
<title>Pufferung, die sich auf PHP auswirkt</title> | ||
<para> | ||
|
||
PHP ist auf die zugrunde liegende Hardware- und Software-Infrastruktur angewiesen, um die Ausgabe zurückzusetzen. Die Pufferung, die von Konsolen auf der Kommandozeile (z.B. mit Zeilenpufferung) oder von Webservern und dem Browser in einem Webkontext (z.B. mit vollständiger Pufferung) implementiert wird, wirkt sich darauf aus, wann die Ausgabe dem Endbenutzer angezeigt wird. Einige dieser Effekte lassen sich durch eine Feinabstimmung der Servereinstellungen und/oder eine Angleichung der Puffergrößen auf verschiedenen Ebenen beseitigen. | ||
|
||
|
||
PHP relies on the underlying software/hardware infrastructure | ||
when flushing output. | ||
Buffering implemented by consoles on the command line (e.g. line buffered) | ||
or web servers and browser in a web context (e.g. fully buffered) | ||
do affect when output is displayed to the end-user. | ||
Some of these effects can be eliminated by fine-tuning server settings | ||
and/or aligning buffer sizes of the various layers. | ||
</para> | ||
</section> | ||
|
||
<section> | ||
<title>Output Buffering Control In PHP</title> | ||
<para> | ||
PHP provides a fully buffered user-level output buffer | ||
with functions to start, manipulate and turn off the buffer | ||
(most <link linkend="ref.outcontrol">ob_<replaceable>*</replaceable></link> functions), | ||
and two functions to flush the underlying system buffers | ||
(<function>flush</function> and <function>ob_implicit_flush</function>). | ||
Some of this functionality can be set and/or configured | ||
using the appropriate &php.ini; settings as well. | ||
</para> | ||
</section> | ||
|
||
<section> | ||
<title>Use Cases</title> | ||
<para> | ||
Output buffering is generally useful in situations when the buffered output | ||
is modified or inspected, or it is used more than once in a request; | ||
or when the controlled flushing of output is desired. | ||
Specific use cases include: | ||
<itemizedlist> | ||
<listitem> | ||
<simpara> | ||
caching the result of compute/time intensive scripts | ||
for example by generating static <literal>HTML</literal> pages | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
re-using the generated output by displaying it, saving it to a file | ||
and/or sending it by email | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
flushing the <literal>head</literal> of an <literal>HTML</literal> page | ||
separate from the <literal>body</literal> allows browsers | ||
to load external resources while the script executes | ||
potentially more time consuming processes | ||
(e.g. database/file access, external network connection). | ||
This is only useful if the <literal>HTTP</literal> status code | ||
cannot change after the headers are sent | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
extracting information from functions that would otherwise produce output | ||
(e.g. <function>phpinfo</function>) | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
controlling the output of third-party code by modifying/using parts | ||
(e.g. extracting data, replacing words/phrases, | ||
adding missing <literal>HTML</literal> tags), | ||
or discarding it entirely under certain conditions (e.g. errors) | ||
</simpara> | ||
</listitem> | ||
<listitem> | ||
<simpara> | ||
polyfilling certain unavailable web server functionality | ||
(e.g. compressing or encoding output) | ||
</simpara> | ||
</listitem> | ||
</itemizedlist> | ||
</para> | ||
</section> | ||
|
||
</chapter> | ||
<!-- Keep this comment at the end of the file | ||
Local variables: | ||
mode: sgml | ||
sgml-omittag:t | ||
sgml-shorttag:t | ||
sgml-minimize-attributes:nil | ||
sgml-always-quote-attributes:t | ||
sgml-indent-step:1 | ||
sgml-indent-data:t | ||
indent-tabs-mode:nil | ||
sgml-parent-document:nil | ||
sgml-default-dtd-file:"~/.phpdoc/manual.ced" | ||
sgml-exposed-tags:nil | ||
sgml-local-catalogs:nil | ||
sgml-local-ecat-files:nil | ||
End: | ||
vim600: syn=xml fen fdm=syntax fdl=2 si | ||
vim: et tw=78 syn=sgml | ||
vi: ts=1 sw=1 | ||
--> |
Oops, something went wrong.