-
Notifications
You must be signed in to change notification settings - Fork 50
Expand file tree
/
Copy pathflushing-system-buffers.xml
More file actions
161 lines (157 loc) · 6.02 KB
/
flushing-system-buffers.xml
File metadata and controls
161 lines (157 loc) · 6.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
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
-->