Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
119 changes: 116 additions & 3 deletions appendices/filters.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: 3f1dbc451b313fb1ec8058f24c1beccf55fce316 Maintainer: takagi Status: ready -->
<!-- EN-Revision: 82b5e0afeb38142e91fbba05f06b46c3129420ba Maintainer: takagi Status: ready -->
<!-- Credits: mumumu -->

<appendix xml:id="filters" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
Expand Down Expand Up @@ -290,7 +290,7 @@ fclose($fp);

<section xml:id="filters.compression.zlib">
<title>zlib.deflate と zlib.inflate</title>
<simpara>
<para>
<literal>zlib.deflate</literal> (圧縮) と
<literal>zlib.inflate</literal> (展開) は、
<link xlink:href="&url.rfc;1951">RFC 1951</link> で述べられている圧縮方法を
Expand All @@ -309,10 +309,123 @@ fclose($fp);
効率は落ちますがメモリの消費量を抑えられます。値を指定しなかった際の
<parameter>window</parameter> の初期値は、現在 <literal>15</literal> です。

<literal>zlib.deflate</literal> フィルタは
<literal>DEFLATE</literal>、<literal>ZLIB</literal>、<literal>GZIP</literal>
の 3 つの圧縮方法を実装しており、どれを使うかは
<parameter>window</parameter> パラメータの値で決まります。

window パラメータの下位 4 ビットは、内部で使われる「ヒストリバッファ」の
サイズを、2 を底とする対数で指定するもので、8 から 15 までの
範囲を取ります。それ以外のビットの意味は、
以下のとおりです。

<itemizedlist>
<listitem>
<simpara>
<literal>DEFLATE</literal> (<link xlink:href="&url.rfc;1951">RFC 1951</link>)
は、ヘッダもチェックサムも持たない生の圧縮アルゴリズムです。
window パラメータに -9 から -15 の範囲の値を指定した場合に、この圧縮が行われます。
この圧縮アルゴリズムは、<literal>zlib.deflate</literal> フィルタが生成する
すべてのフォーマットの基礎になっています。
文字列を直接扱う関数としては、<function>gzdeflate</function> と
<function>gzinflate</function> が対応します。
</simpara>
</listitem>

<listitem>
<simpara>
<literal>ZLIB</literal> (<link xlink:href="&url.rfc;1950">RFC 1950</link>)
は、<literal>DEFLATE</literal> アルゴリズムを適用した上で、2 バイトのヘッダと、
圧縮前のデータの Adler32 チェックサムをビッグエンディアンのバイトオーダーで
格納した 4 バイトのトレーラーを追加します:
<literal><![CDATA[ZLIB = ZLIBHEADER(2B) DEFLATE ADLER32(4B)]]></literal>

2 バイトのヘッダをビッグエンディアンの 16 ビット符号なし整数として読んだ値は、
31 の倍数でなければなりません。
window パラメータに 8 から 15 の範囲の値を指定した場合に、
このフォーマットが生成されます。
文字列を直接扱う関数としては、<function>gzcompress</function> と
<function>gzuncompress</function> が対応します。
</simpara>
</listitem>

<listitem>
<simpara>
<literal>GZIP</literal> (<link xlink:href="&url.rfc;1952">RFC 1952</link>)
は、<literal>DEFLATE</literal> アルゴリズムを適用した上で、ヘッダと、
圧縮前のデータの <literal>CRC32</literal> チェックサムおよびその長さを、
どちらもリトルエンディアンのバイトオーダーで格納したトレーラーを追加します:
<literal><![CDATA[GZIP = GZIPHEADER(10B) DEFLATE CRC32(4B) LENGTH(4B)]]></literal>

これが <literal>.gz</literal> ファイルのフォーマットです。
<literal>GZIPHEADER</literal> には、順に
<literal>GZIP</literal> シグネチャ (<literal>\x1f\x8B</literal>)、
圧縮メソッド (<literal>\x08</literal>)、値がゼロのフラグバイト、
値がゼロの 4 バイトの更新時刻、圧縮レベルに応じた extra-flags バイト、
そして現在のオペレーティングシステム
(<literal>\x00</literal> = FAT ファイルシステム、
<literal>\x03</literal> = Unix など) が格納されます。
window パラメータに 9+16=25 から 15+16=31 の範囲の値を指定した場合に、
このフォーマットが生成されます。
圧縮前のデータの長さには 4GB という上限があることに注意してください。
この上限を超えた場合、<literal>LENGTH</literal> の部分には実際の長さを
2^32 で割った余りだけが格納されます。
文字列を直接扱う関数としては、<function>gzencode</function> と
<function>gzdecode</function> が対応します。また
<function>gzopen</function> 関数を使うと、<literal>.gz</literal>
ファイルの読み書きができます。
</simpara>
</listitem>
</itemizedlist>

<literal>zlib.inflate</literal> フィルタで指定できるのは
<parameter>window</parameter> パラメータだけで、それ以外のパラメータ
(<parameter>memory</parameter>、<parameter>level</parameter>) は無視されます。
$W をヒストリバッファのサイズの 2 を底とする対数とすると、展開時には
2^$W バイトが確保されます。ZLIB フォーマットの場合、この値はヘッダに記録された
値以上でなければならず、展開時にチェックされます。それ以外のフォーマットの場合は、
データ中に実際に現れるマッチ距離をまかなえる大きさであれば十分です。
範囲は 9 ≤ $W ≤ 15 です。値がわからない場合は $W=15 にしておくのが安全です。

<itemizedlist>
<listitem>
<simpara>
<literal>DEFLATE</literal> (<link xlink:href="&url.rfc;1951">RFC 1951</link>):
window=-$W を指定します。$W には、圧縮時に使った値以上を指定します。
値がわからない場合は window=-15 を指定してください。
</simpara>
</listitem>

<listitem>
<simpara>
<literal>ZLIB</literal> (<link xlink:href="&url.rfc;1950">RFC 1950</link>):
window=$W を指定します。$W の値は ZLIB ヘッダから取得できます。
値がわからない場合は window=15 を指定してください。
</simpara>
</listitem>

<listitem>
<simpara>
<literal>GZIP</literal> (<link xlink:href="&url.rfc;1952">RFC 1952</link>):
window=$W+16 を指定します。GZIP ヘッダは window サイズを保持していないので、
圧縮時に使った値がわからない場合は window=31 を指定してください。
</simpara>
</listitem>

<listitem>
<simpara>
<literal>ZLIB or GZIP</literal>:
ヘッダを自動で検出させるには window=$W+32 を指定します。こうすると
どちらのフォーマットも認識して展開できます。
window=15+32=47 にしておくのが安全です。
</simpara>
</listitem>
</itemizedlist>

<parameter>memory</parameter> は、作業用の一時メモリをどの程度割り当てるかを
指定します。1 (最小限) から 9 (最大限) の間で指定できます。この値は
圧縮の速度のみに影響し、圧縮後のデータのサイズには影響しません。
</simpara>
</para>

<note>
<simpara>
Expand Down
55 changes: 51 additions & 4 deletions language/context/http.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: c62ef37e0d58067b393a6cf3a14aefed90bc0bff Maintainer: takagi Status: ready -->
<!-- EN-Revision: 313c83d7c99b46b5d05fdf67e7346719412f522a Maintainer: takagi Status: ready -->
<!-- Credits: mumumu -->

<refentry xml:id="context.http" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" annotations="verify_info:false" role="stream_context_option">
Expand Down Expand Up @@ -134,9 +134,15 @@
<literal>Location</literal> のリダイレクトをたどります。
<literal>0</literal> で無効にできます。
</para>
<para>
デフォルトは <literal>1</literal> です。
</para>
<simpara>
このオプションを設定しない場合、リダイレクトをたどるのは
<literal>300</literal>、<literal>301</literal>、<literal>302</literal>、
<literal>303</literal>、<literal>307</literal>、<literal>308</literal>
のレスポンスコードのときだけです。
<literal>1</literal> を設定するのはこれと同等ではなく、
<literal>Location</literal> ヘッダを含むレスポンスであれば、
レスポンスコードが何であってもリダイレクトをたどるようになります。
</simpara>
</listitem>
</varlistentry>
<varlistentry xml:id="context.http.max-redirects">
Expand Down Expand Up @@ -200,11 +206,52 @@
</para>
</listitem>
</varlistentry>
<varlistentry xml:id="context.http.uri-parser-class">
<term>
<parameter>uri_parser_class</parameter>
<type>string</type> あるいは <type>null</type>
</term>
<listitem>
<simpara>
URI のパースに使用するクラス。&null; の場合は、
<function>parse_url</function> に基づく従来の挙動を使用します。
指定できる値は <classname>Uri\Rfc3986\Uri</classname>
(RFC 3986 に準拠したパーサー) と <classname>Uri\WhatWg\Url</classname>
(WHATWG URL Standard のパーサー) です。
ユーザーランドの独自実装はサポートされていません。
</simpara>
<simpara>
デフォルトは &null; です。
</simpara>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>


<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
<row>
<entry>8.5.0</entry>
<entry>
<parameter>uri_parser_class</parameter> オプションが追加されました。
</entry>
</row>
</tbody>
</tgroup>
</informaltable>
</refsect1>

<refsect1 role="examples">
&reftitle.examples;
<para>
Expand Down
117 changes: 39 additions & 78 deletions language/control-structures/for.xml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: e674990649cd2b111b8dd1175a7a1befcc621635 Maintainer: takagi Status: ready -->
<!-- EN-Revision: 8c273ad6577a6b4d6d3adea73502a4516ca2fe0c Maintainer: takagi Status: ready -->

<sect1 xml:id="control-structures.for" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>for</title>
Expand Down Expand Up @@ -134,97 +134,58 @@ endfor;
</informalexample>
</para>
<simpara>
多くのユーザーにとって、次の例のように配列をループ処理することはよくあるでしょう。
<varname>式2</varname> と <varname>式3</varname> は、繰り返しのたびに評価されます。
パフォーマンス上の問題を避けるため、ここには単純な式を使うことをお勧めします。
たとえば、繰り返しの回数があらかじめわかっている場合は、
<varname>式2</varname> で関数をコールするのではなく変数を使うほうがよいでしょう。
</simpara>
<para>
<informalexample>
<programlisting role="php">
<programlisting role="php" annotations="non-interactive">
<![CDATA[
<?php
/*
* データが入った配列で、ループ処理中に
* その中身を書き換えたいと考えています
*/
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0; $i < count($people); ++$i) {
$people[$i]['salt'] = random_int(100000, 999999);
$people = ['Kalle', 'Pierre'];

// 悪い例: 繰り返しのたびに関数をコールしている
for($i = 0; $i < getIterationCount($people); ++$i) {
$people[$i] .= ' is cool';
}
var_dump($people);
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
[0]=>
array(2) {
["name"]=>
string(5) "Kalle"
["salt"]=>
int(454478)
}
[1]=>
array(2) {
["name"]=>
string(6) "Pierre"
["salt"]=>
int(776978)
}

// よい例: 繰り返しの回数を変数に格納している
for($i = 0, $peopleCount = getIterationCount($people); $i < $peopleCount; ++$i) {
$people[$i] .= ' is cool';
}

]]>
</screen>
</programlisting>
</informalexample>
</para>
<simpara>
このコードは実行速度が遅くなることでしょう。
というのも、配列のサイズを毎回取得しているからです
サイズが変わることはありえないのだから、これは簡単に最適化することができます
配列のサイズを変数に格納して使うようにすれば、
何度も <function>count</function> を呼ばずに済むのです
上の例の最初のループでは、関数が常に同じ値を返すにもかかわらず、
繰り返しのたびにその関数をコールしています
2番目のループのようにその値を変数に格納しておけば、関数のコールは一度で済みます
ただし、繰り返しの回数が固定されることには注意してください。
ループの中で配列を変更した場合、格納した値は配列の新しいサイズを反映しなくなります
</simpara>
<para>
<informalexample>
<programlisting role="php">
<![CDATA[
<?php
$people = array(
array('name' => 'Kalle', 'salt' => 856412),
array('name' => 'Pierre', 'salt' => 215863)
);

for($i = 0, $size = count($people); $i < $size; ++$i) {
$people[$i]['salt'] = random_int(100000, 999999);
}
var_dump($people);
]]>
</programlisting>
&example.outputs.similar;
<screen>
<![CDATA[
array(2) {
[0]=>
array(2) {
["name"]=>
string(5) "Kalle"
["salt"]=>
int(454478)
}
[1]=>
array(2) {
["name"]=>
string(6) "Pierre"
["salt"]=>
int(776978)
}
}
]]>
</screen>
</informalexample>
</para>
<note>
<simpara>
配列のサイズは配列自身が保持しています。
つまり、ビルトイン関数 <function>count</function> をコールしても要素を数え上げる必要はなく、
パフォーマンス上の問題は発生しません。
ただし、配列全体をたどる <constant>COUNT_RECURSIVE</constant> を指定した場合は当てはまりません。
また、<interfacename>Countable</interfacename> を実装したオブジェクトに
<function>count</function> を使う場合は、そのコールのコストが高くなる可能性があるため注意が必要です。
</simpara>
</note>

<note>
<simpara>
配列を反復処理する方法として、<literal>for</literal> ループは推奨されません。
&foreach; ループはこの用途のために設計されており、たいていの場合はより便利です。
</simpara>
</note>
</sect1>

<!-- Keep this comment at the end of the file
Expand Down
Loading
Loading