-
Notifications
You must be signed in to change notification settings - Fork 84
Expand file tree
/
Copy pathphp.xml
More file actions
414 lines (397 loc) · 15.5 KB
/
php.xml
File metadata and controls
414 lines (397 loc) · 15.5 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
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
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: f56de7ebe7a1a85ce9e44a2bf6b77b07adfe3ae4 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,mumumu -->
<refentry xml:id="wrappers.php" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" annotations="verify_info:false" role="stream_wrapper">
<refnamediv>
<refname>php://</refname>
<refpurpose>さまざまな入出力ストリームへのアクセス</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<para>
PHP ではさまざまな入出力ストリームを提供しています。
これらを使うと、PHP 自身の入出力ストリームへのアクセスや
標準入出力と標準エラー出力のファイル記述子へのアクセス、
メモリやディスクを使ったテンポラリファイルストリームへのアクセスができ、
フィルタを使って他のファイルリソースの読み書きに手を加えることもできます。
</para>
<refsect2 xml:id="wrappers.php.std">
<title>php://stdin, php://stdout および php://stderr</title>
<simpara>
<filename>php://stdin</filename>、<filename>php://stdout</filename>
および <filename>php://stderr</filename> は、PHP プロセスの
対応する入出力ストリームへの直接アクセスを許可します。
これらのストリームは複製されたファイル記述子を参照します。そのため、
<filename>php://stdin</filename> をオープンしたあとでそれを閉じたとしても、
識別子のコピーが閉じられるだけです。<constant>STDIN</constant>
で参照される実際のストリームは何も影響を受けません。
これらのラッパーを使うのではなく、定数
<constant>STDIN</constant>, <constant>STDOUT</constant>
および <constant>STDERR</constant> を使用することを推奨します。
</simpara>
<simpara>
<filename>php://stdin</filename> は読み込み専用で、
<filename>php://stdout</filename> および <filename>php://stderr</filename>
は書き込み専用です。
</simpara>
</refsect2>
<refsect2 xml:id="wrappers.php.input">
<title>php://input</title>
<simpara>
<filename>php://input</filename> は読み込み専用のストリームで、
リクエストの body 部から生のデータを読み込むことができます。
<link linkend="ini.enable-post-data-reading">enable_post_data_reading</link> オプションが有効になっている場合、
かつ <literal>enctype="multipart/form-data"</literal> を指定した POST リクエストでは、<filename>php://input</filename> は使用できません。
</simpara>
</refsect2>
<refsect2 xml:id="wrappers.php.output">
<title>php://output</title>
<para>
<filename>php://output</filename> は書き込み専用のストリームで、
<function>print</function> および <function>echo</function>
と同じ方法での出力バッファへの書き込みを許可します。
</para>
</refsect2>
<refsect2 xml:id="wrappers.php.fd">
<title>php://fd</title>
<simpara>
<filename>php://fd</filename> は、指定したファイル記述子に直接アクセスすることができます。
たとえば <filename>php://fd/3</filename> は、ファイル記述子 3 を指します。
</simpara>
</refsect2>
<refsect2 xml:id="wrappers.php.memory">
<title>php://memory および php://temp</title>
<simpara>
<filename>php://memory</filename> および <filename>php://temp</filename>
は読み書き可能なストリームで、一時データをファイルのように保存できるラッパーです。
両者の違いは、
<filename>php://memory</filename> が常にデータをメモリに格納するのに対して
<filename>php://temp</filename> は定義済みの上限 (デフォルトは 2 MB)
に達するとテンポラリファイルを使うという点です。
このテンポラリファイルの場所は、
<function>sys_get_temp_dir</function> 関数と同じ方法で決めます。
</simpara>
<simpara>
<filename>php://temp</filename> のメモリ制限を制御するには
<literal>/maxmemory:NN</literal> を追加します。この <literal>NN</literal>
はメモリに保持するデータの最大量で、単位はバイトです。
このサイズを超えるとテンポラリファイルを使います。
</simpara>
<caution>
<simpara>
PHP の拡張モジュールによっては、
標準入出力が必須なものがあるかもしれません。
その場合、指定されたストリームを標準入出力のストリームにキャストしようとするかもしれませんが、メモリに格納するストリームの場合、このキャストは失敗する可能性があります。なぜなら、C言語の <function>fopencookie</function> 関数が使える必要があるからです。この関数は、Windows では <emphasis>利用できません</emphasis>。
</simpara>
</caution>
</refsect2>
<refsect2 xml:id="wrappers.php.filter">
<title>php://filter</title>
<simpara>
<filename>php://filter</filename> は、<link linkend="filters">フィルタ</link>アプリケーションが
ストリームをオープンすることを許可するために設計されたメタラッパーです。
これは、<function>readfile</function>、<function>file</function>
および <function>file_get_contents</function> のようなオールインワンの
ファイル関数とともに使用すると有用です。これらの関数には、コンテンツが
読み込まれる前にストリームにフィルタを適用する手段がありません。
</simpara>
<para>
<filename>php://filter</filename> の対象は、
次のようなパラメータをパスの一部として受け取ります。
ひとつのパスに対して複数のフィルタチェインを指定できます。
これらのパラメータの詳細は、使用例を参照ください。
</para>
<para>
<table>
<title>php://filter のパラメータ</title>
<tgroup cols="2">
<thead>
<row>
<entry>名前</entry>
<entry>説明</entry>
</row>
</thead>
<tbody>
<row>
<entry>
<literal>resource=<フィルタの対象となるストリーム></literal>
</entry>
<entry>
このパラメータは必須です。フィルタリングしたいストリームを指定します。
</entry>
</row>
<row>
<entry>
<literal>read=<読み込みチェーンに適用するフィルタのリスト></literal>
</entry>
<entry>
このパラメータは任意です。ひとつあるいは複数のフィルタ名を、
パイプ文字 (<literal>|</literal>) で区切って指定します。
</entry>
</row>
<row>
<entry>
<literal>write=<書き込みチェーンに適用するフィルタのリスト></literal>
</entry>
<entry>
このパラメータは任意です。ひとつあるいは複数のフィルタ名を、
パイプ文字 (<literal>|</literal>) で区切って指定します。
</entry>
</row>
<row>
<entry>
<literal><両方のチェーンに適用するフィルタのリスト></literal>
</entry>
<entry>
<literal>read=</literal> や <literal>write=</literal>
がついていないすべてのフィルタは、読み込みと書き込みのチェーンの両方に適切に適用されます。
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</refsect2>
</refsect1>
<refsect1 role="options"><!-- {{{ -->
&reftitle.options;
<para>
<table>
<title>
ラッパーの概要(<literal>php://filter</literal> については、
フィルタされる側のラッパーの概要を参照します)
</title>
<tgroup cols="2">
<thead>
<row>
<entry>属性</entry>
<entry>サポートの有無</entry>
</row>
</thead>
<tbody>
<row>
<entry><link linkend="ini.allow-url-fopen">allow_url_fopen</link> で制約される</entry>
<entry>No</entry>
</row>
<row>
<entry><link linkend="ini.allow-url-include">allow_url_include</link> で制約される</entry>
<entry>
<literal>php://input</literal>、
<literal>php://stdin</literal>、
<literal>php://memory</literal> および
<literal>php://temp</literal> のみ。
</entry>
</row>
<row>
<entry>読み込み許可</entry>
<entry>
<literal>php://stdin</literal>、
<literal>php://input</literal>、
<literal>php://fd</literal>、
<literal>php://memory</literal> および
<literal>php://temp</literal> のみ。
</entry>
</row>
<row>
<entry>書き込み許可</entry>
<entry>
<literal>php://stdout</literal>、
<literal>php://stderr</literal>、
<literal>php://output</literal>、
<literal>php://fd</literal>、
<literal>php://memory</literal> および
<literal>php://temp</literal> のみ。
</entry>
</row>
<row>
<entry>追加許可</entry>
<entry>
<literal>php://stdout</literal>、
<literal>php://stderr</literal>、
<literal>php://output</literal>、
<literal>php://fd</literal>、
<literal>php://memory</literal> および
<literal>php://temp</literal> のみ (書き込みと同じ)。
</entry>
</row>
<row>
<entry>同時読み書き許可</entry>
<entry>
<literal>php://fd</literal>、
<literal>php://memory</literal> および
<literal>php://temp</literal> のみ。
</entry>
</row>
<row>
<entry><function>stat</function> のサポート</entry>
<entry>
No.
但し、<literal>php://memory</literal> および
<literal>php://temp</literal> は、<function>fstat</function> をサポートしています。
</entry>
</row>
<row>
<entry><function>unlink</function> のサポート</entry>
<entry>No</entry>
</row>
<row>
<entry><function>rename</function> のサポート</entry>
<entry>No</entry>
</row>
<row>
<entry><function>mkdir</function> のサポート</entry>
<entry>No</entry>
</row>
<row>
<entry><function>rmdir</function> のサポート</entry>
<entry>No</entry>
</row>
<row>
<entry><function>stream_select</function> のサポート</entry>
<entry>
<literal>php://stdin</literal>、
<literal>php://stdout</literal>、
<literal>php://stderr</literal>、
<literal>php://fd</literal>、および
<literal>php://temp</literal> のみ。
</entry>
</row>
</tbody>
</tgroup>
</table>
</para>
</refsect1> <!-- }}} -->
<refsect1 role="examples"><!-- {{{ -->
&reftitle.examples;
<example><!-- {{{ -->
<title>php://temp/maxmemory</title>
<para>
このオプションパラメータは、<filename>php://temp</filename>
がテンポラリファイルを使うようになるまでのメモリの制限を設定します。
</para>
<programlisting role="php">
<![CDATA[
<?php
// 制限を 5 MB にします。
$fiveMBs = 5 * 1024 * 1024;
$fp = fopen("php://temp/maxmemory:$fiveMBs", 'r+');
fputs($fp, "hello\n");
// 書き込んだ内容を読み込みます。
rewind($fp);
echo stream_get_contents($fp);
?>
]]>
</programlisting>
</example><!-- }}} -->
<example><!-- {{{ -->
<title>php://filter/resource=<フィルタの対象となるストリーム></title>
<para>
このパラメータは、
<filename>php://filter</filename> 指定の最後に存在し、フィルタリング
したいストリームを指している必要があります。
</para>
<programlisting role="php">
<![CDATA[
<?php
/* これは単純に以下と同じです。
readfile("http://www.example.com");
なぜなら、実際のところ何のフィルタ処理も行われないからです。 */
readfile("php://filter/resource=http://www.example.com");
?>
]]>
</programlisting>
</example><!-- }}} -->
<example><!-- {{{ -->
<title>php://filter/read=<読み込みチェーンに適用するフィルタのリスト></title>
<para>
このパラメータは 1 つ以上のフィルタ名を
パラメータとしてとり、それらはパイプ文字 <literal>|</literal> で区切られます。
</para>
<programlisting role="php">
<![CDATA[
<?php
/* これは、www.example.com のすべての内容を
大文字に変換して出力します。 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* これは上の例と同じですが、それに加えて
ROT13 エンコード処理を行います。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
]]>
</programlisting>
</example><!-- }}} -->
<example><!-- {{{ -->
<title>php://filter/write=<書き込みチェーンに適用するフィルタのリスト></title>
<para>
このパラメータは 1 つ以上のフィルタ名を
パラメータとしてとり、それらはパイプ文字 <literal>|</literal> で区切られます。
</para>
<programlisting role="php">
<![CDATA[
<?php
/* これは、文字列 "Hello World"
に対して rot13 フィルタを適用し、カレントディレクトリの
example.txt に書き込みます。 */
file_put_contents("php://filter/write=string.rot13/resource=example.txt","Hello World");
?>
]]>
</programlisting>
</example><!-- }}} -->
<example>
<title>php://memory と php://temp は再利用できない</title>
<para>
<filename>php://memory</filename> と <filename>php://temp</filename>
の再利用はできません。つまり、いったんストリームを閉じてしまったら、もうそれを参照できないということです。
</para>
<programlisting role="php">
<![CDATA[
<?php
file_put_contents('php://memory', 'PHP');
echo file_get_contents('php://memory'); // 何も表示されません
]]>
</programlisting>
</example>
<example>
<title>リクエストボディから、JSON データを読み取るために php://input を使う</title>
<para>
この例は、<filename>php://input</filename> を使って POST, PUT,
PATCH リクエスト経由で生の JSON データを読み取る方法を示します。
</para>
<programlisting role="php">
<![CDATA[
<?php
$input = file_get_contents("php://input");
$json_array = json_decode(
json: $input,
associative: true,
flags: JSON_THROW_ON_ERROR
);
echo "Received JSON data: ";
print_r($json_array);
?>
]]>
</programlisting>
</example>
</refsect1><!-- }}} -->
</refentry>
<!-- 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
-->