[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
PHP の調べ物
前のブログ(PHPのインストール関連のURL と 疑問 (5/6) ~php.ini の設定をもう一度、集めてみる~)より~
とりあえず今回、色々、とてつもなく色々考えた、
やはり面倒だがサイトの比較から始めよた、その結果沢山ある設定オプションから、
確実に設定すべきか、もしくは触れないといけないであろう物を見つけて、
以下の表 を作ってみた・・・・ だた、できるだけ残したいことを重視したので、表のわりに説明が多く見にくいです。
分類 | 注意 | オプション名(公式マニュアル) | 他サイト | 概要(注意:初心者の考えたメモ書きです) |
---|---|---|---|---|
処理文字形式 | 廃止決定 | magic_quotes_gpc | イ,ロ1,ハ1,ル |
クライアントから送られたGet,POST,Cookieなどで得られた情報の中で、特定の機能を持つ制御文字に対して、その機能をさせない様にする制御文字(エスケープ文字)を付加する。この機能は PHP 5.3.0 で 非推奨となり、PHP 6.0.0 で削除される項目だそうです。 使う場合は<On> とするとエスケープ文字が付加されます、使わない習慣を付けた方がよさそうですし、セキュリティーを保とうとして出来たはずの設定項目ですが、ある事によってセキュリティーが逆に保てなくなる様です。 つまり初心者であるなし関係が無く、設定を<Off>にしてこの自動エスケープ文字の付加を使わない方法を用いる事を覚えるのが良いと思われます。 簡単に言うと、クライアントから送られたgpc(GET、POSTそしてCookie)情報で、マジッククオートをされると困る情報を自動でエスケープ文字を付加されると困るので、PHP 6.0.0 以降では無くすと解釈した方が良さそうで、現状でも使わない方が無難という事だと思います。 しかしいずれにせよ、この機能の実態である関数(addslashes() )は存在したままになると思います。 初心者であってもいつかはクロスサイトスクリプティング対策 は必要であり、Web上で実際に公開する場合には、その対策として自身が作ったスクリプトの中でaddslashes() 関数を使うか、自前の特殊文字を置き換える処理などが必要になるのは決して忘れてはいけない事だと思います。 |
処理文字形式 | 廃止決定 | magic_quotes_runtime | ロ1 | データベースおよびテクストファイルを含む外部ソースから データを返す全ての関数のクオートは、バックスラッシュで エスケープされる様になる様です、magic_quotes_gpc と同様、この機能は PHP 5.3.0 で 非推奨となり、PHP 6.0.0 で削除される項目だそうです。 |
処理文字形式 | 廃止決定 | magic_quotes_sybase | ロ1 | magic_quotes_runtime が有効なときに、この項目も on の場合、シングルクオートは、バックスラッシュの代わりに シングルクオートでエスケープされるそうです。magic_quotes_gpc , magic_quotes_runtime と同様、この機能は PHP 5.3.0 で 非推奨となり、PHP 6.0.0 で削除される項目だそうです。 |
処理文字形式 |
1 2 |
default_charset (値:文字コード種別1つ) |
ハ1,ハ2 |
ブラウザで表示する時にContent-type で文字コードを指定するかどうかの項目です。PHP がたとえブラウザで表示する為の情報を送ったとしても、厳密にソースの文字コードを設定しなければ、文字化けを起こす可能性があるので、その為のソースの文字コードを指定する項目だと思われます。勿論指定しても指定した形式で書いたソースと一致している事が重要だと思います。 そしてまた、この設定は出力に対しての設定であるので、mbstring.http_output と同じ文字コードを選ぶべきだと思います。 |
処理文字形式 | 〇 | output_handler | ハ2 |
出力する文字列の文字コードを入力とは違う文字コードにエンコードする必要がある場合に用います。具体的には、スクリプト処理の出力を、文字コードの変換に用いる関数に出力(渡す)するかどうかを定義します。 きっと内部文字エンコーディング(mbstring.internal_encoding)と、HTTP出力文字エンコーディング変換(mbstring.http_output)が違う時には確実に設定が必要です。 変換関数はバッファー内部で処理する物が多い?らしいので、出力バッファリング(output_buffering)も設定が必要になる雰囲気に、私的は感じました。 |
パス | 廃止 | output_buffering(PHP 4.3.5 以降設定が無い様です) | ロ2,ハ1 | このディレクティブを 'On' と設定することにより、全てのファイルに 関して出力バッファリングを有効にすることができたそうです、現在は文献だけが公式に残り、php.ini の中では言葉すら存在しない様です。 |
パス | include_path | ロ2,ハ1 |
PHP のファイル操作に関わる幾種かの関数は、このパスを基点に相対的に行なわれます。複数選択する場合には、;(セミコロン)で区切ります、pearやSmartyなどを使う場合には複数選択したりパスを変更する必要があると思います。 基本的にPHPのインストールパスにある、includes フォルダを選ぶ様ですが、PHP をインストールしたフォルダには見つからないと思いました、つまり任意で自身がインクルードするファイルが置いてあるフォルダを示せば良いので、名前も任意で構わない様です。 ですが、まぁしかし、そのフォルダを使う事を想定して、自身がPHP をインストールしたパスにincludes を足した物が多くの書籍やWeb上で見受けられました、初心者が思いつかないならば名前はとりあえずincludes で良いのではないでしょうか。また公式ページにはインクルードのたびに毎回 PHP にカレントディレクトリをチェックさせるよりは、 明示的に include './file' を指定したほうが効率的だとも書いてあります、しかしセキュリティーを考えるとある程度以上に柔軟に指定できるのもまずい気がすると思いました。要するにPHPの一部関数が使える場所を定義する為の設定です。 |
|
パス | △ | doc_root | 公式1,ハ1 |
Apache などのWebサーバのモジュールとして動作させる場合、なんらかのエラーや不都合でPHP スクリプトが処理されず、PHP ソースや機密な情報などをそのまま表示される状況を好まない場合には、この設定が必要です。つまりそのままWeb公開可能なドキュメントと切り分けて情報の漏洩などを防ぐ方法の一つだと思います。 単純にApache と一緒に使う場合に、Apache の公開ディレクトリである、DocumentRoot を設定する場合も見受けられますが、Apache を動かす為ではなく、phpのスクリプトが動く為や、機密情報漏洩を防ぐ事を重視して、一般論よりも自身の使い易さやルールに則って設定するべき項目だと思いました。ただし、初心者が外部に公開しない勉強用ならばDocumentRoot を指定していても良い気がしました。 この値は空で無 い場合のみ使用されます。要するにphp のスクリプトを覗かれて困る場合に、公開できるドキュメントとは別に、この設定が必要だと思います。 |
パス | extension_dir | 公式2,イ,ロ3,ハ1 |
動的にロード可能な拡張モジュールを置くディレクトリを 指定します。PHP は組み込まれた状態でコンパイルによって無効に出来ない「組み込みモジュール」と、指定して実行時に読み込み可能な「動的モジュール」がある様です。この設定はその動的モジュールを置くディレクトリを設定します。 厳密にここで言う拡張モジュールとは、PHP では3種類の拡張方法、バンドルされているDLLと、バンドルされていないDLLのPECL 、DLLではなくて、phpスクリプトで書かれているライブラリのPEARがあり、この設定は、バンドルされているDLLとバンドルされていないDLLについての読み込み設定です。補足として言い換えるならば、DLLによって読み込む、コンパイルによって埋め込まれていないこの2種は、動的にロード可能な「動的モジュール」です。 |
|
パス | extension | 公式3,(イ),ロ4,ハ1 |
動的にロード可能な拡張モジュールを起動時に読み込む為の設定です。スクリプト の中でdll() 関数を用いて読み込む事も可能な様です。PHP4にはextensions フォルダ、PHP5 にはext が読み込むバンドルされているモジュールが入っているフォルダになると思います。 ●PHP を学習する上で、マルチバイトを用いると思うので、初心者の私は、[ extension=php_mbstring.dll ]を有効にし、マルチバイトを使える様にします。多分ですが日本人でS-JIS(シフトーJIS)を使うならば有効にしないといけない気がします、なぜならmbstring.language の説明に、日本語の文字は、マルチバイトエンコーディングを使用しないと表せませんとあり、またインストール手順 にも同様な言い回しがあるからです。また、php.ini 内の設定項目のmbstring.xxxxx はマルチバイト文字列 関数 についての設定で、この[ extension=php_mbstring.dll ] をインストールした時に必要な物がほとんどです。 ●私はWAMP 環境を作り、PHP からMySQL を操作することを覚えるつもりなので、MySQL を有効にする為に、[ extension=php_mysql.dll ]を有効ににし、MySQL を使える様にします。 |
|
処理文字形式 | △ | mbstring.language | ロ4,ハ1,ハ2 |
公式ページに日本語の文字は、マルチバイトエンコーディングを使用しないと表せません とある事や、 カナを("全角かな"、"半角かな"等に)変換 することに特化した関数も日本語やマルチバイトを意識したものが多く感じられました。詳細を調べると、mbstring 拡張モジュールは 日本語のほかに中国語 (簡体字)・中国語 (繁体字)・ 韓国語・ロシア語 もサポートするみたいです。mbstring.xxxxx とある設定は1つだけが正確であっても、他が環境にあっていない場合は何処かで文字化けを起こしたり、正常に処理されない可能性があります。エディタで書いたスクリプトを保存する時の文字コードや、ブラウザが解釈する文字コード、php 内部や出力時でのエンコードなどを、自分の環境や、結果をブラウザで見る場合の環境まで考慮に入れる必要があるのだと思います。また、余談ですが、ブラウザがファイルが拡張子をどう判断し処理するかのContent-type (default_charset)も結局考慮に入れることになると思います。 UNICODE の様な、多国の言語を1つの文字エンコーディングで表現しようとした文字コードを用いない場合には、特に重要な設定となり、間違うと文字化けやエラーの原因となる予想がつきます。 |
処理文字形式 | 〇 | mbstring.internal_encoding | ロ4,ハ1,ハ2,(ニ),(ホ),ヌ |
内部エンコードの文字エンコーディングの種類を選びます。正常にphpスクリプト を動かすには、文字コード種類 の解釈は厳密に関わってます、内部エンコーディングに変換されるのは、クリエの入力(mbstring.http_input で変換するかどうか決まります)、内部処理(この設定mbstring.internal_encoding でエンコーディングを指定し、mbstring.encoding_translation で使う使わないを決めます)、出力(mbstring.http_output で出力時に変換する文字エンコーディングを指定できます) 、この3つの文字エンコーディングが存在していて、一部でも間違った文字コードを使った処理をすると文字化けが発生するのだと想定します。 厳密には、auto 設定であると、入力のソースの文字エンコーディング と、解釈する文字エンコーディング の違いでエスケープコード なども出来てしまう事も考えられ、auto 設定はソースの保存形式が一緒であっても、確実に毎回同じ文字コード と認識しない場合もある考えすら予想できます。但しやはり、入力先が限定できない場合などは、話しが変わってくると思いますし、判定する為の関数が、出力ではなく入力に対して変換する関数があるのかは判りませんし、何度も文字コードを変換する事への弊害も考えられます、初心者なので、まず動かす為の設定を考えると単純にソースのスクリプトの文字エンコーディングであるmbstring.http_input に合わせ、同じにしておけば良いとおもいます。 ちょっと難しい余談ですが入力、内部、出力などという表現がマルチバイト(mbstring) の説明に見受けられると思います、これはPHP が処理するときに、バイト列やバイト配列をどのエンコードを使用して文字として認識しているかのことで重要になると思います、想像がつかないかもしれませんが、文字列はエンコードをしなければ、元はただのバイト列やバイト配列なのです。 PHP を使ってスクリプト を書いている私たちユーザー側 には、どんな規定で日本語や、中国語や韓国語などの他の国との違いを認識しているのかなどは設定以上には知る余地がなく、また知る余地がなくとも使えることが便利であるから、こういった設計になっていて、私たちユーザーにはたまに出てくる作り手側の表現、この場合は内部、外部などという事は、エンコードをして単なるバイトである数値を文字に見える状態にしている仕組みを伝えているに過ぎないことに注意する必要があると思います。 入力されたある文字コードで書かれたただのバイトの塊を、どんな意味の文字なのか判ることなく処理することは不可能です、それを手動で指定したり、場合によってはエンコード種別を自動で見分けられたりする場合もあるでしょうし、エンコードして文字エンコードを変えるべき所をあえて変えたくない場合などもユーザーから見た場合には存在するでしょうから、PHP の文字エンコード の仕組みを作った人も、その仕組みの中で設定できる部分と出来ない部分を考えた上で、このmbstring.xxxxx の設定を設けたのだと思います。 こういった文字エンコードについては、他の言語でもほぼ一緒の仕組みであり、もしそこまで厳密な解釈や、厳密な文字の解釈をしたいのならば、自身でエンコーダーを作ることになるのだと思います。 そのうち自身の能力が向上してきたころに、部分的に既存な文字エンコード処理を用いていて、仕様では不満な部分は、どうかして乗り越えたくなるのは、多くの人が思うことなのかもしれません。 ですが、一見このわかり難いほどの細やかな設定は、わかり易さはさておき、なんらかの融通や、なんらかの困りごとに手が届くことに考慮して、on、off、auto、pass、文字列で指定、などと選べるのでしょうし、その個々の組み合わせでだいたい何かが解決することが伺わせられる気がします。 |
処理文字形式 | mbstring.http_input | ロ4,ハ1,ハ2 |
HTTP入力文字エンコーディングを内部エンコーディングに自動で変換するかを設定します。スクリプトではhttp_inputの設定は変更できない様です。 ここで間違えやすいのは、mbstring.internal_encoding はPHPスクリプト を解釈するときの文字エンコーディング を指し示し、このmbstring.http_input は、クライアントから送られたGet,POST,Cookieなどで得られたクリエ情報ではないことです、クリエ情報に対しての設定は、mbstring.encoding_translation で行うことに注意が必要です。 |
|
処理文字形式 | mbstring.http_output | ロ4,ハ1,ハ2,(ヘ) | 最終的に処理結果を何かに出力する訳ですが、その出力を保存する時の文字コードの種別を指定します。但し保存した形式を開く場合に、やはり違う形式を指定すると文字化けになると思います、例えばブラウザで見た場合にHTML が文字化けする様に、保存形式以外にブラウザがそのファイルの文字コードをどの種類で解釈するかなどや、Content-type (default_charset)などの設定も必要になるのかもしれませんが、とりあえず初心者なのでこの辺が関係するかもしれないので覚えとして記述しておきました。 | |
処理文字形式 | mbstring.encoding_translation | ロ4,ハ1,ハ2,(ト) |
この設定は、mbstring.internal_encoding の文字コードに変換するときに文字エンコーディングへの変換を有効にするかの設定です。 クリエの要求ではなく、スクリプト自体の設定は、mbstring.http_input が受け持っている様なので注意が必要です。 mbstring.http_input と、このmbstring.encoding_translation の違いを理解していないと、色々な面で文字化けの原因です。 初心者は、とにかく自身の書いたスクリプトを動かす為の設定を必要とするので、この設定をon にしておき、mbstring.internal_encoding の設定が内部エンコーディングになることを意識しておけば問題がない気がします。 公式サイトには「入力される HTTP クエリに関して、 文字エンコーディング検出および内部文字エンコーディングへの変換を行う 透過的な文字エンコーディングフィルタを有効にします。」とあり、抽象的で曖昧なのですが、検出とある訳なので、mbstring.internal_encoding に従って文字エンコードを行うことが出来ることを指していて、mbstring.internal_encoding に間違った物を指定すると検出も間違い変換も失敗するのだと思います。 |
|
処理文字形式 | mbstring.detect_order | ロ4,ハ1,ハ2 |
文字コードを判定する時に、どの順番で文字コードであるか調べる為の設定です。文字コードを判定するときに、auto を指定するとどの順番で検査しているか判らず、コードによっては一部が同じであったりして間違う場合があるでしょうから、クセを把握して、順番を指定しておいた方が良い様です。 私が考える分に、文字エンコードするときに文字を判断するとしても、文字コードは規格ごとにまったく違う場合と重なる場合があるので、できたら重なる場合でありえない順番を知っているなら、そのありえない順番から調べる方が良いですが、それが判らないならば、入力されるスクリプトソースや、入力されるクリエの文字エンコード形式、内部処理形式、その次に1バイトでない、比較的に長い形式の文字コード、最後に短いバイト数の文字コードといった順番で設定することが浮かびました。 |
|
処理文字形式 | mbstring.substitute_character | (ロ4),ハ1,ハ2,(チ) |
無効な文字を出力するかどうかの設定です。 入力文字エンコーディングが無効、 または出力文字エンコーディングに文字コードが存在しない場合の代替文字を指定できます、例えばnone; とすると出力しない事を選択できます、他の関数にも影響するので公式ページ をチェックすると良いかもしれません。 マルチバイト文字列 関数のmb_ substitute_ character と同じ設定内容かもしれません。 |
|
エラー表示 | docref_root | リ |
エラーが発生したときに、エラーやエラーの原因となった関数に関するマニュアル のページの情報をエラー情報に載せる。 はじめ初心者の私はPHP がインストールされているディレクトリ かと一瞬考えましたがやはり違う様です、つまりこの場合にはWeb サーバーが動いているディレクトリ、私の場合はApache であったので、Apache の設定ファイルhttpd.conf 内の[DocumentRoot] が指し示す場所にマニュアルがある事を意味しています。 |
|
エラー表示 | docref_ext | リ | docref_root のマニュアルの拡張子を表します。docref_extの値はドット "." で始まる必要があります。 | |
エラー表示 | 〇 | allow_call_time_pass_reference | 関数の引数に値渡しではなく参照渡しをした場合に警告を出すかの設定です。この設定がONであると、関数がONであると関数の引数に参照渡しを用いると警告が表示されます。今後のバージョンではこの設定はなくなり、OFFで固定される様です、コードの明解さを損なうためとあります。初心者は書籍などのサンプルコードを実行中に何か警告が出る場合があり、「you can set allow_call_time_pass_reference to true in your INI file in ... 」などと出た場合はこの設定がONであるからです。 |
コメント一覧