忍者ブログ

カウンター

プロモーション

カレンダー

03 2024/04 05
S M T W T F S
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

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/04/26 20:42

PHPのインストール関連のURL と 疑問 (5/6) ~php.ini の設定をもう一度、集めてみる~

PHP の調べ物

 前のブログ(PHPのインストール関連のURL と 疑問 (5/6) ~php.ini の設定をもう一度、集めてみる~)より~
 とりあえず今回、色々、とてつもなく色々考えた、
やはり面倒だがサイトの比較から始めよた、その結果沢山ある設定オプションから、
確実に設定すべきか、もしくは触れないといけないであろう物を見つけて、
以下の表 を作ってみた・・・・ だた、できるだけ残したいことを重視したので、表のわりに説明が多く見にくいです。
 

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 で削除される項目だそうです。
処理文字形式
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であるからです。
 ※()で書かれている他サイトは、一般的でない例であったり参考にならない場合がありますが、PHP を学ぶ上で参考になったり、セオリーではないかもしれないですが、
 自身で解決策を考えている点で載せていたりします。


<表作成後談> (何時まで経っても途中だけど)
 表を作っている最中にあまりにも深く知らないと行けないもし、
実際にプログラミングをしないと始まらない部分を多く感じました。
とりあえず作ってみて、PHP は環境設定が段取り8部だ!と思えています。
 もちろんプログラミングは必要ですし、プログラミングがしたいが為にPHP をしようと思ったのですが、
文字コードについては疎い言語ではなくて、文字コードについて出来るだけ緻密に取り扱える様にしているが為に、
文字コードについて正確に知らないといけないと強く伝わってきました。
 
 具体的には、全般的に言えることは、設定項目はお互いに干渉しあったり、順番があったりするので、
一つを設定するだけで良い訳ではなく、他の部分も変更する必要がある。
 また、自動の設定や、無しの設定、書かない場合の設定やデフォルトの設定、
使用で実際はなんらかの挙動を見せるケースなど、色々なケースが存在する様です。
 特に文字コードについてはとてつもなく注意と文字コードの理解が必要だと思いました。

 それよりもPHP 公式に設定オプションの種類が書いてないのが難点で、PHP公式は役に立たない?のか、
それとも私が調べそこねているのかちょっと不思議なところです。
例えば、値が空なのか、none という意思表示した値のみなのか、他の文字列が入るのかとか、
off,on,auto,他に指定があるのかとか、そういった例を含むことが全通り把握出来る様に書かれていない気がします。
 また、関数としてPHP.ini の項目に良く似ていたり、同等と予想される設定はある様なので、
その辺の関係を纏めた表を別に作るべきかとも考えてしまいます。



追加メモ1
 Apache をWeb サーバとしているときに、Apache の設定ファイル、.htaccessファイルにPHP の設定を書く事も可能みたいなので、自身で全てを把握できないレンタルサーバなどは、
.htaccessファイルに記述して設定を変える方法などがあるんだろうと思った。

 サイトが無くなるとどう設定して良いのか判らなくなるので例を載せてみる。

●php.ini の設定をON やOFF で表す場合に.htaccess 内でそれを書く場合は、
  php.ini の
   mbstring.encoding_translation off
            は
  .htaccess で書くと
   php_flag mbstring.encoding_translation off

  の様に「php_flag」と書く様だ。
●php.ini の設定を文字列で表す場合に.htaccess 内でそれを書く場合は、
  php.ini の
   mbstring.http_input "pass"
            は
  .htaccess で書くと
   php_value mbstring.http_input "pass"
         
  の様に「php_value」と書く様だ。

一応忘れる前にメモしたが、厳密に調べることはまたにします。
とりあえず判ったことは、.htaccess 内で
ON やOFF などは「php_flag」と書き、
文字列などは「php_value」と書くみたいです。

また、同様にmbstring.encoding_translationは PHPのスクリプト内でセットできない さんのサイトでは、.htaccess 内でPHP スクリプトに関する設定の前後に

<IfModule mod_php5.c>
<Location "/url_path">
 ・・・・・・・・・・ 設定内容 ・・・・・・・・・・・
</Location>
</IfModule>

の様に開始や指定をしている事を伝えている様な記述もあったので、一応メモしておきます。
また、PHP5.0/3.php.iniの編集 の .htaccessによるディレクティブの設定 にも説明がありました。



追加メモ2
 PHP やブラウザの機能でも文字コードを自動で判断するという設定があると思うのですが、
これは果たして万能なのかどうかを考えましたが、やはり時と場合により万能ではないと思います。
mbstring.encoding_translation の設定においてもその例外ではないと思います。

>関連して述べているサイトをメモしておこうと思います。
  ・mbstring.encoding_translationはOnにしていいことあるのか(google キャッシュ)
     このブログは、各設定がどう干渉しているかについて多少述べているので参考になりました。

>文字化けについて、簡単に述べているサイトもメモしておきます。
  ・日本語の文字コードは3種類以上
     日本語に使われている文字コードはJIS、シフトJIS、EUC、unicodeのUTF-8 について多少書かれています。

  ・文字化けメールはなぜ起こる?
     このサイトのページはメールで文字化けする原因について書いてあります。
    得に、普段多く使っているエディタや、メールソフトが扱う文字がシフトJIS (8bit)であり、
    メールで使うJIS(7bit) の変換する際に起こる事が簡単に書かれていました。

  ・ホームページの文字化けは?
     ブラウザでの文字化けは、EUCとシフトJISは一部コードが重なっているので、たまにブラウザも文字コードを判定ミスをするや、
    
  ・文字化けしないようにするには
     ここのサイトは結構有名だと思います。一応メモです。

  ・漢字コードについて
     ここも上記サイトの別ページです。漢字コードについて纏められていてとても良いと思ったのでメモしました。


追加メモ3
 ApacheからPHPを使う場合の設定
 
 自宅サーバー(Windows+Apache)へのPHPインストール

 PHP のインストール(Apache2.0 Windows編)

 さて! なんだかだんだんphp.ini にこだわっていたけど、php.ini の設定値は、phpの関数の一部がphp.ini で設定できるに過ぎなくて、
結局レンタルサーバーなどで制限がついている場合などはphp.ini や.htaccess などで設定しなければいけないが、
そうでなければ、元々の関数の取り扱いが判れば、こんな所でひっかかっている必要がないじゃないかという結論に達しました!(やっとかwwwwwww)


なので次回(PHPのインストール関連のURL と 疑問 (6/6) ~php.ini と対応する関数の設定のまとめ~)は
本当に関数とphp.ini の設定値のまとめで終わりたいかなと思います。

それからはMySQL のインストールと、Apache の設定かなと思います。

拍手[0回]

PR


  • 2009/07/31 12:41

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]