-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathuser-level-output-buffers.xml
653 lines (637 loc) · 29.1 KB
/
user-level-output-buffers.xml
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 2a8768782512db2b95e5da2f032dd0347806d203 Maintainer: mumumu Status: ready -->
<chapter xml:id="outcontrol.user-level-output-buffers" xmlns="http://docbook.org/ns/docbook" xmlns:xi="http://www.w3.org/2001/XInclude">
<title>ユーザーレベルの出力バッファ</title>
<para>
ユーザレベルの出力バッファは、
PHP コードから開始、操作、終了することができます。
バッファは、出力バッファと関連する出力ハンドラ関数を含みます。
</para>
<section xml:id="outcontrol.what-output-is-buffered">
<title>どの出力をバッファするのか?</title>
<para>
PHP のユーザレベル出力バッファは、
起動した後から、バッファリングをオフにするか、
スクリプトが終わるまでのすべての出力をバッファリングします。
PHP のユーザーレベル出力バッファにおける出力とは、
PHP が表示したりブラウザに送り返したりするすべてのものを指します。
実用的な用語で説明すると、出力とは以下に示す、
長さがゼロでないデータのことです:
<itemizedlist>
<xi:include xpointer="xmlns(db=http://docbook.org/ns/docbook) xpointer(id('outputcontrol.what-is-output')/*)"><xi:fallback/></xi:include>
</itemizedlist>
</para>
<note>
<simpara>
<literal>stdout</literal> に直接書き込まれたり、
同様の機能を持つ SAPI 関数に渡されたデータは、
ユーザレベルの出力バッファには取り込まれません。
これに該当するのは、
<function>fwrite</function> を使って <literal>stdout</literal>
にデータを書き込む場合や、<function>header</function> や
<function>setcookie</function> を使ってヘッダを送信する場合です。
</simpara>
</note>
</section>
<section>
<title>出力バッファをオンにする</title>
<para>
出力バッファリングは、&php.ini; 設定
<link linkend="ini.output-buffering">output_buffering</link>
と <link linkend="ini.output-handler">output_handler</link>
を設定するか、<function>ob_start</function> 関数を使うことでオンにできます。
これらは両方、出力バッファを生成できますが、
<function>ob_start</function> の方がより柔軟です。
なぜなら、出力ハンドラをユーザー定義関数として受け入れますし、
(フラッシュ、クリーン、削除 のような)
バッファに対する操作もできるからです。
<function>ob_start</function> で開始したバッファは、
それをコールした行からアクティブになりますが、
<link linkend="ini.output-buffering">output_buffering</link>
を使って開始したバッファは、スクリプトの最初の行から、出力をバッファします。
</para>
<para>
PHP は組み込みの
<literal>"URL-Rewriter"</literal>
出力ハンドラをバンドルしています。
このハンドラは、自分の出力バッファを開始します。
同時に実行できるのはふたつです(1つはユーザレベルのURL書き換えと、
透過的なセッションIDサポートのためのもの) 。
これらのバッファは、<function>output_add_rewrite_var</function>
関数をコールするか、&php.ini; 設定
<link linkend="ini.session.use-trans-sid">session.use_trans_sid</link>
を有効にすることで開始できます。
</para>
<para>
バンドルされている <literal>zlib</literal> 拡張モジュールは、
独自の出力バッファを持っています。
この出力バッファは、&php.ini; 設定
<link linkend="ini.zlib.output-compression">zlib.output_compression</link>
を使うことで有効にできます。
</para>
<note>
<simpara>
一度に二つまでしか実行できないという意味で、
<literal>"URL-Rewriter"</literal> は特別です。
しかし、すべてのユーザレベルの出力バッファは、
カスタムの出力ハンドラ関数を指定して <function>ob_start</function>
をコールすることで開始した既存のバッファと同じものを使います。
そのため、すべての機能はユーザランドのコードでエミュレートすることができます。
</simpara>
</note>
</section>
<section xml:id="outcontrol.nesting-output-buffers">
<title>出力バッファをネストさせる</title>
<para>
新しいバッファが開始されたときに、既にアクティブな出力バッファがある場合、
新しいバッファは、以前にアクティブだったバッファの内部にネストされます。
ネストされたバッファは、ネストされているかどうかに関係なく同じ動作をしますが、
ネストされたバッファによってバッファリングされた出力は、
以前にアクティブだった外側のバッファにはバッファリングされません。
ネストされたバッファからフラッシュされた出力のみが、
外側のバッファによってバッファリングされます。
</para>
<para>
ほとんどの <literal>ob_<replaceable>*</replaceable></literal>
関数は、アクティブな出力バッファ(最後に開始されたもの)に対してのみ動作するため、
アクティブなバッファのみをフラッシュ、クリーン、オフにすることができます。
それ以外のバッファに対して動作する関数は、
使用中のすべての出力ハンドラのリストを返す
<function>ob_list_handlers</function> や、
アクティブなバッファや使用中のすべてのバッファに関する情報を返すことができる
<function>ob_get_status</function> があります。
</para>
<para>
<function>ob_get_level</function>
や <function>ob_get_status</function>
をコールすると、アクティブな出力バッファのネストレベルを返します。
</para>
<caution>
<simpara>
<function>ob_get_level</function>
と <function>ob_get_status</function>
が指す、同じレベルの値は1つずれています。
<function>ob_get_level</function> では最初のレベルは
<literal>1</literal> であるのに対し、
<function>ob_get_status</function> の最初のレベルは
<literal>0</literal> になります。
</simpara>
</caution>
</section>
<section xml:id="outcontrol.buffer-size">
<title>バッファサイズ</title>
<para>
バッファサイズは整数で表され、
バッファがフラッシュせずに格納できるバイト数を表します。
バッファ内の出力サイズがバッファサイズを超えると、
バッファの内容が出力ハンドラに送られ、
その戻り値がフラッシュされ、バッファがクリアされます。
</para>
<para>
<literal>"URL-Rewriter"</literal> を除いて、
出力バッファのサイズはバッファの開始時に設定することができます。
<literal>0</literal> に設定すると、
出力バッファのサイズは PHP が使用可能なメモリの量に制限されます。
<literal>1</literal> に設定すると、
0 より大きい長さの出力を生成するコードブロックの後にバッファがフラッシュされます。
</para>
<para>
出力バッファのサイズは、
<function>ob_get_status</function> をコールすることで取得できます。
</para>
<para>
<function>ob_start</function> で開始された出力バッファのバッファサイズは、
2番目のパラメータ <parameter>chunk_size</parameter>
に渡された整数値に設定されます。省略された場合、
<literal>0</literal> が設定されます。
</para>
<para>
ini 設定 <link linkend="ini.output-buffering">output_buffering</link>
が <literal>"On"</literal> に設定されている場合、
開始された出力バッファのバッファサイズは 0 に設定されます。
バッファサイズより大きな整数を設定した場合、バッファサイズはその値になります。
</para>
<para>
<literal>"URL-Rewriter"</literal> のバッファサイズは
<literal>0</literal> に設定されているため、
PHP が使用可能なメモリの量に制限されます。
</para>
<para>
<literal>zlib</literal> の出力バッファのサイズは、
&php.ini; の
<link linkend="ini.zlib.output-compression">zlib.output_compression</link>
で設定します。
<literal>"On"</literal>
に設定すると、バッファサイズは <literal>"16K"</literal>/<literal>16384</literal>
になります。
バッファサイズより大きな整数を設定した場合、
バッファサイズはそのバイト数になります。
</para>
</section>
<section xml:id="outcontrol.operations-on-buffers">
<title>バッファに対して可能な操作</title>
<para>
バッファに対して可能な操作は、
<link linkend="outcontrol.constants.buffer-control-flags">出力バッファの制御フラグ</link>
のいずれかを <function>ob_start</function> の3番めの
<parameter>flags</parameter> パラメータに渡すことで制御できます。
省略した場合、すべての操作がデフォルトで許可されます。
<literal>0</literal> を指定すると、
バッファのフラッシュ、クリーン、削除はできませんが、
その内容を取得することはできます。
</para>
<para>
<constant>PHP_OUTPUT_HANDLER_CLEANABLE</constant> を指定すると、
<function>ob_clean</function> によってバッファの内容を削除できるようになります。
</para>
<warning>
<simpara>
<constant>PHP_OUTPUT_HANDLER_CLEANABLE</constant> フラグ
を指定していなくても、
<function>ob_end_clean</function> や <function>ob_get_clean</function>
がバッファの内容を削除できなくなるわけではありません。
</simpara>
</warning>
<para>
<constant>PHP_OUTPUT_HANDLER_FLUSHABLE</constant> を指定すると、
<function>ob_flush</function> を使ってバッファの内容をフラッシュできるようになります。
</para>
<warning>
<simpara>
<constant>PHP_OUTPUT_HANDLER_FLUSHABLE</constant> フラグ
を指定していなくても、
<function>ob_end_flush</function> や <function>ob_get_flush</function>
がバッファの内容をフラッシュできなくなるわけではありません。
</simpara>
</warning>
<para>
<constant>PHP_OUTPUT_HANDLER_REMOVABLE</constant> を指定すると、
<function>ob_end_clean</function>, <function>ob_end_flush</function>,
<function>ob_get_clean</function>, <function>ob_get_flush</function>
を使ってバッファをオフにすることができるようになります。
</para>
<para>
<constant>PHP_OUTPUT_HANDLER_STDFLAGS</constant>
は、既に述べた3つのフラグの組み合わせで、
指定するとバッファに対する3つの操作を実行できます。
</para>
</section>
<section>
<title>バッファの内容をフラッシュ/アクセス/削除する</title>
<para>
フラッシュは、アクティブなバッファの内容を送信し、破棄します。
出力バッファは、出力のサイズがバッファのサイズを超えたときか、
スクリプトが終了するか、
<function>ob_flush</function>, <function>ob_end_flush</function>,
<function>ob_get_flush</function>
のいずれかがコールされたときにフラッシュされます。
</para>
<caution>
<simpara>
<function>ob_end_flush</function> や <function>ob_get_flush</function>
をコールすると、アクティブなバッファがオフになります。
</simpara>
</caution>
<caution>
<simpara>
バッファをフラッシュすると、
出力バッファの戻り値がフラッシュされますが、
この値はバッファの内容と異なる場合があります。
例えば、<function>ob_gzhandler</function>
を使うと、出力が圧縮され、圧縮された出力がフラッシュされます。
</simpara>
</caution>
<para>
アクティブなバッファの内容は
<function>ob_get_contents</function>, <function>ob_get_clean</function>,
<function>ob_get_flush</function> をコールすると取得できます。
</para>
<para>
バッファの中身の長さだけが必要な場合、
<function>ob_get_length</function> や <function>ob_get_status</function>
を使えばバッファの中身の長さをバイト単位で取得できます。
</para>
<caution>
<simpara>
<function>ob_get_clean</function> や <function>ob_get_flush</function>
をコールすると、アクティブなバッファの中身を返した後、
そのバッファをオフにします。
</simpara>
</caution>
<para>
アクティブなバッファの中身は、
<function>ob_clean</function>, <function>ob_end_clean</function>,
<function>ob_get_clean</function> を使って削除できます。
</para>
<caution>
<simpara>
<function>ob_end_clean</function> や <function>ob_get_clean</function>
を使うと、アクティブなバッファがオフになります。
</simpara>
</caution>
</section>
<section>
<title>出力バッファをオフにする</title>
<para>
<function>ob_end_clean</function>, <function>ob_end_flush</function>,
<function>ob_get_flush</function>, <function>ob_get_clean</function>
をコールすると、出力バッファをオフにできます。
</para>
<warning>
<simpara>
<constant>PHP_OUTPUT_HANDLER_REMOVABLE</constant>
を指定せずに起動した出力バッファはオフにできず、
<constant>E_NOTICE</constant> が発生します。
</simpara>
</warning>
<para>
スクリプトの終了時、または <function>exit</function>
がコールされるまでに閉じられていないすべての出力バッファは、
PHP のシャットダウン処理によってフラッシュされ、オフになります。
バッファは、起動した順序と逆の順序でフラッシュされ、オフになります。
最後にバッファリングが開始されたものが最初になり、
最初にバッファリングが開始されたものが最後にフラッシュされ、オフになります。
</para>
<caution>
<simpara>
バッファの内容をフラッシュしたくない場合は、
カスタムの出力ハンドラを使い、シャットダウン中のフラッシュを防ぐべきです。
</simpara>
</caution>
</section>
<section xml:id="outcontrol.output-handlers">
<title>出力ハンドラ</title>
<para>
出力ハンドラは、出力バッファに関連付けられた <type>callable</type> です。
<function>ob_clean</function>,
<function>ob_flush</function>, <function>ob_end_flush</function>,
<function>ob_get_flush</function>, <function>ob_end_clean</function>,
<function>ob_get_clean</function> をコールすると呼び出されます。
また、PHP のシャットダウン処理中にも呼び出されます。
</para>
<note>
<simpara>
シャットダウン処理は、ハンドラの戻り値をフラッシュします。
</simpara>
</note>
<para>
出力バッファを開始するときに、ハンドラを省略したり &null; を指定した場合、
内部的な <literal>"default output handler"</literal>
が使われます。このハンドラは、呼び出された際にバッファの内容を変更せずに返します。
出力ハンドラは、バッファの内容を変更 かつ/または 副作用(例:ヘッダの送信)
をもたせるために使うことができます。
</para>
<para>
PHP には、内部的な出力ハンドラをふたつ持っています:
<literal>"default output handler"</literal>
と <literal>"URL-Rewriter"</literal>
(これは独自の出力バッファに統合されており、2つまでしか起動できません)
がそうです。
</para>
<para>
PHP 本体にバンドルされている拡張モジュールには、
追加の出力ハンドラが4つあります:
<function>mb_output_handler</function>, <function>ob_gzhandler</function>,
<function>ob_iconv_handler</function>, <function>ob_tidyhandler</function> です。
</para>
</section>
<section xml:id="outcontrol.working-with-output-handlers">
<title>出力ハンドラを扱う</title>
<para>
出力ハンドラが呼び出されると、
バッファの内容と、出力バッファリングの状態を示すビットマスクが渡されます。
</para>
<para>
<methodsynopsis>
<type>string</type>
<methodname>
<replaceable>handler</replaceable>
</methodname>
<methodparam>
<type>string</type>
<parameter>buffer</parameter>
</methodparam>
<methodparam choice="opt">
<type>int</type>
<parameter>phase</parameter>
</methodparam>
</methodsynopsis>
<variablelist>
<varlistentry>
<term><parameter>buffer</parameter></term>
<listitem>
<simpara>
出力バッファの内容
</simpara>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>phase</parameter></term>
<listitem>
<simpara>
<link linkend="constant.php-output-handler-start">
<constant>PHP_OUTPUT_HANDLER_<replaceable>*</replaceable></constant>
定数
</link> のビットマスク
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
<warning>
<simpara>
出力ハンドラの内部で以下の関数をコールすると、致命的なエラーが発生します:
<function>ob_clean</function>, <function>ob_end_clean</function>,
<function>ob_end_flush</function>, <function>ob_flush</function>,
<function>ob_get_clean</function>, <function>ob_get_flush</function>,
<function>ob_start</function>
</simpara>
</warning>
<note>
<simpara>
ハンドラの <constant>PHP_OUTPUT_HANDLER_DISABLED</constant>
が設定されている場合、
<function>ob_end_clean</function>, <function>ob_end_flush</function>,
<function>ob_get_clean</function>, <function>ob_get_flush</function>
<function>ob_clean</function>, <function>ob_flush</function>
をコールしてもハンドラは呼び出されません。
PHP のシャットダウン処理中でも同様です。
PHP 8.4.0 より前のバージョンでは、
<function>ob_clean</function>
をコールしてもこのフラグは何の効果もありませんでした。
</simpara>
</note>
<note>
<simpara>
一部のウェブサーバー、例えば Apache やビルトイン・ウェブサーバーでは、
作業ディレクトリがシャットダウン中に変更される場合があります。
</simpara>
</note>
</section>
<section xml:id="outcontrol.flags-passed-to-output-handlers">
<title>出力ハンドラに渡されるフラグ</title>
<para>
出力ハンドラの2つめの <parameter>phase</parameter>
パラメータに渡されるビットマスクは、
ハンドラの起動に関する情報を提供します。
</para>
<note>
<simpara>
ビットマスクは複数のフラグを含むことができるので、
フラグがセットされているかどうかをチェックするには、
ビット演算子 <literal>&</literal> を使う必要があります。
</simpara>
</note>
<warning>
<simpara>
<constant>PHP_OUTPUT_HANDLER_WRITE</constant> と、そのエイリアス
<constant>PHP_OUTPUT_HANDLER_CONT</constant>
の値は <literal>0</literal> です。
よって、これらの値が設定されているかを調べられるのは
<link linkend="language.operators.comparison">比較演算子</link>
(<literal>==</literal> or <literal>===</literal>) だけです。
</simpara>
</warning>
<para>
ハンドラのライフサイクルの特定のフェーズで、以下のフラグが設定されます:
<constant>PHP_OUTPUT_HANDLER_START</constant>
は、ハンドラが初めて起動されたときに設定されます。
<constant>PHP_OUTPUT_HANDLER_FINAL</constant>
やそのエイリアス <constant>PHP_OUTPUT_HANDLER_END</constant>
はハンドラが最後に起動されるとき、
つまりハンドラがオフになるときに設定されます。
PHP のシャットダウン処理によってバッファがオフにする際にも設定されます。
</para>
<para>
ハンドラの特定の呼び出しに応じて、以下のフラグが設定されます:
<constant>PHP_OUTPUT_HANDLER_FLUSH</constant> は、
<function>ob_flush</function> をコールしてハンドラが呼び出された際に設定されます。
<constant>PHP_OUTPUT_HANDLER_WRITE</constant>
やそのエイリアス <constant>PHP_OUTPUT_HANDLER_CONT</constant>
は、バッファの内容の長さがバッファのサイズ以上かつ、
バッファが自動的にフラッシュされている間にハンドラを起動したときに設定されます。
<constant>PHP_OUTPUT_HANDLER_FLUSH</constant> は、
<function>ob_clean</function>,
<function>ob_end_clean</function> や <function>ob_get_clean</function>
をコールしてハンドラが呼び出された場合に設定されます。
<function>ob_end_clean</function> や <function>ob_get_clean</function>
がコールされた場合は、<constant>PHP_OUTPUT_HANDLER_FINAL</constant>
も同時に設定されます。
</para>
<note>
<simpara>
<function>ob_end_flush</function> や <function>ob_get_flush</function>
がコールされると、<constant>PHP_OUTPUT_HANDLER_FINAL</constant>
が設定されますが、<constant>PHP_OUTPUT_HANDLER_FLUSH</constant>
は設定されません。
</simpara>
</note>
</section>
<section xml:id="outcontrol.output-handler-return-values">
<title>出力ハンドラの戻り値</title>
<para>
出力ハンドラの戻り値は、
以下に示す PHP の標準的な型のセマンティクスに従って文字列に自動変換されますが、
ふたつだけ例外があります: <type>array</type> と <type>bool</type> です。
</para>
<para>
配列は文字列 <literal>"Array"</literal>
に変換されますが、警告 <literal>Array to string conversion</literal>
は発生しません。
</para>
<para>
ハンドラが &false; を返した場合、
バッファの内容が返されます。
ハンドラが &true; を返した場合、
空文字列が返されます。
</para>
<note>
<simpara>
ハンドラが &false; を返したり、ハンドラで例外が発生した場合、
<constant>PHP_OUTPUT_HANDLER_DISABLED</constant> フラグが設定されます。
</simpara>
</note>
</section>
<section>
<title>出力ハンドラでスローされる例外</title>
<para>
捕捉されない例外が出力ハンドラでスローされた場合、
プログラムは終了し、<literal>"Uncaught Exception"</literal>
エラーメッセージがフラッシュされた後に、
シャットダウン処理によってハンドラが呼び出されます。
</para>
<para>
<function>ob_flush</function>,
<function>ob_end_flush</function>, <function>ob_get_flush</function>
が呼び出したハンドラが、捕捉されない例外をスローした場合、
エラーメッセージがフラッシュされる前にバッファの内容がフラッシュされます。
</para>
<para>
シャットダウン処理中に出力ハンドラが捕捉されない例外をスローした場合、
ハンドラは終了し、バッファの内容もエラーメッセージもフラッシュされません。
</para>
<note>
<simpara>
ハンドラが例外をスローした場合、
<constant>PHP_OUTPUT_HANDLER_DISABLED</constant>
フラグが設定されます。
</simpara>
</note>
</section>
<section>
<title>出力ハンドラで発生したエラー</title>
<para>
出力ハンドラで致命的でないエラーが発生した場合、
プログラムの実行は継続されます。
</para>
<para>
<function>ob_flush</function>, <function>ob_end_flush</function>,
<function>ob_get_flush</function>
が呼び出したハンドラで致命的でないエラーが発生した場合、
ハンドラの戻り値に応じて、バッファは一定のデータをフラッシュします。
ハンドラが &false; を返す場合、
バッファの中身とエラーメッセージがフラッシュされます。
それ以外の値をハンドラが返す場合、
ハンドラの戻り値はフラッシュされますが、エラーメッセージはフラッシュされません。
</para>
<note>
<simpara>
ハンドラが &false; を返す場合、
<constant>PHP_OUTPUT_HANDLER_DISABLED</constant> フラグが設定されます。
</simpara>
</note>
<para>
出力ハンドラ中で致命的なエラーが発生した場合、
プログラムは終了し、
エラーメッセージがフラッシュされた後に、
シャットダウン処理によってハンドラが呼び出されます。
</para>
<para>
<function>ob_flush</function>,
<function>ob_end_flush</function>, <function>ob_get_flush</function>
が呼び出したハンドラで、致命的なエラーが発生した場合、
エラーメッセージがフラッシュされる前にバッファの内容がフラッシュされます。
</para>
<para>
シャットダウン処理中に出力ハンドラで致命的なエラーが発生した場合、
プログラムは終了し、バッファの内容もエラーメッセージもフラッシュされません。
</para>
</section>
<section>
<title>出力ハンドラで行われた出力</title>
<para>
特定の状況下では、
ハンドラ内で生成された出力はバッファの内容と共にフラッシュされます。
この出力はバッファに追加されず、
<function>ob_get_flush</function> が返す文字列の一部にもなりません。
</para>
<para>
フラッシュの操作中
(<function>ob_flush</function>,
<function>ob_end_flush</function>, <function>ob_get_flush</function>
のコール中、またはシャットダウン処理中)に、
ハンドラが &false; を返した場合、
バッファの内容がフラッシュされ、その後に出力が行われます。
シャットダウン処理中にハンドラが呼び出されなかった場合、
ハンドラが例外をスローするか、<function>exit</function> が呼び出されると、
同じ動作になります。
</para>
<note>
<simpara>
ハンドラが &false; を返した場合、
<constant>PHP_OUTPUT_HANDLER_DISABLED</constant> が設定されます。
</simpara>
</note>
</section>
<section>
<title>出力ハンドラのステータスフラグ</title>
<para>
バッファが持つ <literal>flags</literal> ビットマスクの
<link linkend="outcontrol.constants.flags-returned-by-handler">出力ハンドラのステータスフラグ</link> は、
出力ハンドラが起動されるたびに設定され、
<function>ob_get_status</function> が返す <literal>flags</literal>
の一部になります。
ハンドラが正常に実行され、&false; を返さなかった場合、
<constant>PHP_OUTPUT_HANDLER_STARTED</constant> と
<constant>PHP_OUTPUT_HANDLER_PROCESSED</constant> が設定されます。
ハンドラが &false; を返すか、実行中に例外がスローされた場合は、
<constant>PHP_OUTPUT_HANDLER_STARTED</constant> と
<constant>PHP_OUTPUT_HANDLER_DISABLED</constant> が設定されます。
</para>
<note>
<simpara>
ハンドラの <constant>PHP_OUTPUT_HANDLER_DISABLED</constant>
が設定されている場合、
<function>ob_end_clean</function>, <function>ob_end_flush</function>,
<function>ob_get_clean</function>, <function>ob_get_flush</function>
<function>ob_clean</function>, <function>ob_flush</function>
経由でハンドラは呼び出されません。
PHP のシャットダウン処理中でも同様です。
PHP 8.4.0 より前のバージョンでは、
<function>ob_clean</function> や <function>ob_flush</function>
をコールしてもこのフラグはなんの意味もありませんでした。
</simpara>
</note>
</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
-->