php4 | ||
---|---|---|
HOME |
php ソースdir にて:
root# ./configure options
で sourcedir/Makifile などを準備するが、オプションが長いのであらかじめ php_config_opt.in テキストに書いておき:
root# ./configure `cat php_config_opt.in`
とするほうがやり直しが楽。以下、php-4.3.5 + RedHat7.2 にて動作実証済みのオプション。4.3.0 以上ならば同様のはず。4.3.0 より古い php4 の場合は、一部オプションが異なるので、ソースdir にて "./configure --help" すべし。
apache2.0/phpバンドル版GD使用:
--with-layout=GNU --prefix=/usr --sysconfdir=/etc --localstatedir=/var --infodir=/usr/share/info --mandir=/usr/share/man --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-pear=/usr/share/pear --with-apxs2=/usr/sbin/apxs --with-exec-dir=/usr/bin --disable-cgi --enable-sigchild --enable-memory-limit --with-openssl --with-pgsql=shared,/usr --without-mysql --with-gd --with-png-dir=/usr --with-jpeg-dir=/usr --enable-gd-native-ttf --with-freetype-dir=/usr --with-zlib --enable-zend-multibyte --enable-bcmath --enable-mbstring --enable-mbregex |
apache2.0/GDなし:
--with-layout=GNU --prefix=/usr --sysconfdir=/etc --localstatedir=/var --infodir=/usr/share/info --mandir=/usr/share/man --with-config-file-path=/etc --with-config-file-scan-dir=/etc/php.d --with-pear=/usr/share/pear --with-apxs2=/usr/sbin/apxs --with-exec-dir=/usr/bin --disable-cgi --enable-sigchild --enable-memory-limit --with-openssl --with-pgsql=shared,/usr --without-mysql --enable-zend-multibyte --enable-bcmath --enable-mbstring --enable-mbregex |
--with-layout=GNU | ディレクトリ構造の指定。GUN と php (デフォルト) から選択 |
--with-config-file-path=xxx | php.ini を置くdir。RedHat 式なら /etc |
--with-config-file-scan-dir=xxx | pgsql.ini など、追加の設定ファイルの dir。RedHat 式なら/etc/php.d。当オプション省略時は追加設定ファイルdir は設定されない |
--with-pear=xxx | PEAR (Php Extension and Application Repository) コンポーネントをインストールするdir。RedHat 式なら /usr/share/pear |
--with-apxs(2)=xxx | php4 を apache のモジュールとして組む。apache 2.0 の場合は apxs2。xxx は apxs (APache EXtenSion tool) へのパス |
--with-exec-dir=xxx | PHP の実行バイナリを置く場所ではない。safemode を有効にした場合に実行を許可する実行ファイルの場所を指定。RedHat に倣えば /usr/bin |
--disable-cgi | デフォルトでは /usr/bin/php は CGI 版のバイナリだが、php を apache の DSO としてインストールするので、重ねて GCI バイナリをインストールするのは無意味に思われる。こう指定すれば、 /usr/bin/php には CLI バイナリがインストールされる |
--enable-memory-limit | メモリ制限ができるようにする |
--with-pgsql=xxx | postgresql サポート有効。xxx には、インストール済みの postgreSQL のベースインストールdir を指定。 "shared,dir" とすると、postgreSQL 拡張を有効にするためのエクステンションを php のローダブルモジュールとしてインストールできる。コンパイルするには postgresql-devel-x.x.x.rpm が必要 |
--without-mysql | mysql は使わないので、拡張させない。デフォルトではインストールしようとするのでこうして阻止する |
--with-gd[=xxx] | GD エクステンションを組み込むか。GD は jpg, png の生成、変換、サイズ変更などができ、イメージファイルのアップロード php でのサムネイル自動生成ルーティンでも役立つ。詳細については phpマニュアル。"=GDベースインストールパス" を指定すると既にインストールしてある GD を組み込めるが、php マニュアルによると、php にバンドルされた版を推奨、とされている。 |
--with-png-dir=xxx | インストール済みの libpng を利用する。jpeg も同様 |
--enable-gd-native-ttf | GD 組込みの TrueTypeFont 機能を有効に |
--with-freetype-dir=xxx | インストール済みの freetype フォントライブラリを利用 |
--with-zlib | GD で jpeg や png など圧縮フォーマットを扱う場合は必須。zlib はコンプレッションライブラリ |
zend-multibyte mbstr*関係 |
日本語を扱うために必要 |
UNIX 一般では、ライブラリは /usr 配下の個別の dir にインストールされているのが普通だ。しかし、RedHat の場合、rpm によるインストールを単純化するために、下記のようなディレクトリ構造になっている。
GDの例:
UNIX一般 | RedHat系 |
---|---|
/usr ┗gd ┗include ┗ヘッダファイル lib ┗libxxx.so |
/usr ┗include ┗gd ┗ヘッダファイル lib ┗gd ┗libxxx.so |
そのため、自前ライブラリの利用を指定する場合、RedHat ではほとんど "=/usr" となる。
root# make root# make install
コンパイルオプションが前述の通りなら、Apache 用ローダブルモジュールは Apache のモジュールパス (通常は /usr/lib/httpd/modules あるいは /etc/httpd/modules ) に、実行バイナリは /usr/bin にインストールされる。 configure の結果が記録されている config.status
ファイル (ソースディレクトリにできる) は保存しておくと後々の管理が楽。
システムに初めて PHP をインストールしたときやメジャーバージョンを上げた場合には、サンプルとして付属しているメイン設定ファイルを下記のようにコピー:
root# cp -p ./php.ini-dist /etc/php.ini
いつからか PHP4 のロードする ZEND 拡張モジュール (PostgreSQL拡張やマルチバイト文字拡張モジュールなど) が変なディレクトリにインストールされる仕様になってしまったので、PHP のバージョンアップやモジュール追加時にいちいち PHP設定ファイルを書き換えずに済むよう、シンボリックリンクでディレクトリ構成を整えよう。拡張モジュールのインストールされたディレクトリを知るために config.status ファイルから以下のような行を探す:
s%@EXPANDED_EXTENSION_DIR@%/usr/lib/php/ZEND_MODULE_API_NUM%g
知りたいのは ZEND_MODULE_API_NUM の部分にあたる数字。これは 20020429 などの日付数字。コンパイルオプションが前記の通りだったとすれば、拡張モジュール類は /usr/lib/php/20020429/ 下にインストールされたはずだ (php/extensions/NUM となっている場合もある)。 php4 ディレクトリを作って必要なモジュールだけを個別にリンクするか、ディレクトリへのシンボリックリンクを張る (イタリック部分をその数字に置き換えて):
root# cd /usr/lib root# ln -s ./php/ZEND_MODULE_API_NUM php4
ソースに付属していて上記で /etc/php.ini としてコピーした php.ini-dist は、その冒頭のコメントで断り書きがしてある通り、サーバとスクリプトのデバグ用の設定になっている。つまり、なんでもクライアントに見せてしまう、セキュリティ上好ましくない設定であり、実際の運用では絶対にデフォルトのまま使ってはいけない。もうひとつのファイル、php.ini-recommended は開発者が推奨している設定内容になっているが、それとて各自の要求や環境にぴったりというわけではないし、実際使ってみて「これはいかがなものか」的な設定も含まれていた。それでも php.ini-dist と php.ini-recommended を見比べてみることは、設定を煮詰める上で多少は役に立つ。
Language Options | |
short_open_tag = Off | "<?" タグによる php の開始を許すか。off 時は "<?php" のみで、このほうが厳格・安全 |
output_buffering = 8192 | 遅延書き出しのバッファサイズ。この例では 8KB |
open_basedir = dir:another_dir | php がアクセスできるディレクトリを制限。 "/dir/abc" とすると /dir/abcdefg/ へのアクセスも許可される。特定の dir にしぼるつもりなら、最後にスラッシュを付けて "/dir/abc/" とすること。 "." は 「その時実行しているスクリプトのあるディレクトリ」 の意。レンタルサーバでも開業するのでない限り、 safe_mode は使用せず、代わりにこの設定を使ってスクリプトの実行できるディレクトリを事細かに指定した方がよい |
expose_php = Off | WEBサーバに PHP モジュールの存在やそのバージョンを伝えるか。 Apache の場合、この設定が影響するのは、 httpd 設定ファイルの ServerTokens ディレクティブを Full に設定した時だけで、その際には HTTP ヘッダの Server 要素に PHP のバージョンなどが追加される (Apache - ServerTokensとServerSignature 参照)。無効にしても支障がないので切る |
Resource Limits | |
max_execution_time = 30 | ひとつのスクリプトが実行に費やせる最長時間 (秒)。この時間に達すると、実行中でもパーサが強制的にスクリプトを殺すので、結果、fatal エラーとなる。テスト中のスクリプトが無限ループに入ってしまった時などの防御策。大きなファイルを扱う場合には、クライアントの帯域幅も考慮して調整すべきだが、ここでは短めにしておいて、必要なスクリプト中で set_time_limit() (※コラム参照) 関数で制限時間を延ばしてやるほうが安全 |
max_input_time = 60 | スクリプトが POST, GET, ファイルアップロードなどでデータを受け取るのに費やせる最長時間 (秒)。少なくとも php 4.3.4 時点では、ファイルアップロードに関しては max_execution_time (または set_time_limit() による指定) さえ充分長くしてやれば、アップロードに支障はない。つまりあまり意味を成さない項目? |
memory_limit = 8M | ひとつのスクリプトが消費できる最大メモリ。通常ならデフォルトの 8M のままでよいが、ファイルアップロードを使う場合には、少なくとも post_max_size より大きくしなければならない。さらに、画像アップロード + サムネイル作成つまり imagecreate() などの関数を使用する場合には、かなりのメモリが必要。サムネイル作成を伴うスクリプトでの経験では、元画像サイズ規制=1.8M として、メモリは 16MB 程必要だった | Error handling and Logging |
error_reporting = E_ALL | info, error, warning メッセージすべてを発行。これでもエラーや info が出ないスクリプトを書くべき |
display_errors = Off | エラーをクライアントの WEB ページに出力するか。カッコ悪いし、安全上知られるべきでない秘密もさらけ出してしまうので off に |
log_errors = On | エラーをログするか |
;error_log = syslog | コメントアウトのまま。この設定で、エラーはすべて apache のエラーログ (通常は /var/log/httpd/error_log) に送られる |
track_errors = Off | 直前のエラーを変数 $php_errormsg に格納するか。スクリプトでのエラーハンドリングに使うには、あまり信頼できる情報ではないので、メモリ節約のためにも切る |
Data handling | |
variables_order = "GPCS" | register_globals を off にしたいので E (Environment) は要らない。つまり優先順位は Get, Post, Cookie, php-built-in の順となる |
register_globals = Off | 外部から来た変数をグローバル変数として格納するか。On にすることは 絶対避けるべき。投稿された変数にはスーパーグローバル配列 ($_GET['hoge'] など) によるアクセスを心掛けよう |
post_max_size = 4M | POST およびファイルアップロードで許可される最大サイズ。ファイルのアップロード時に送信されるデータは、ファイルサイズ + フォームのフィールド値 + MIMEヘッダなどの合計となるので、この設定値は upload_max_filesize より大きい必要がある |
magic_quotes_gpc = Off | GET, POST, COOKIE で受け取るデータに含まれる ', ", \, NULL値 をバックスラッシュ (\) で自動エスケープするか |
magic_quotes_runtime = Off | 同上。データベース、テキストファイルからの値について |
magic_quotes_sybase = Off | magic_quotes_gpc または magic_quotes_runtime が On の時、これも On だとバックスラッシュでなくシングルクォートでエスケープされる |
default_mimetype = "text/html" | コンテンツのパース時に HTTP の Content-Type ヘッダにデフォルトで付加する MIME タイプ。あくまでもデフォルトであり、個々のスクリプトで header() 関数によって Content-Type を記述していれば、常にそちらが勝る |
default_charset = "EUC-JP" | コンテンツのパース時に HTTP の Content-Type ヘッダの charset 要素にデフォルトで設定する文字セット。右辺をカラにすれば charset 要素は付加しないので、WEB サーバが面倒を見ることになる (Apache の場合、httpd 設定ファイルの AddDefaultCharset が Off 以外の時)。これも各スクリプトでの header() 関数による指定が優先される |
Paths and directories | |
enable_dl = Off | スクリプト内での dl() によるローダブルモジュールの動的組込みを可能にするか。open_basedir による拘束を無視できてしまうため off を推奨。 php.ini での extension ディレクティブには影響なし |
File uploads | |
file_uploads = On | ファイルアップロード機能を有効にするか。クライアントからアップロードされたファイルをテンポラリフォルダに一時格納し、それを move_uploaded_file() 関数で安全に処理することが可能となる |
upload_max_filesize = 2M | アップロードを許すファイルの最大サイズ |
Dynamic extensions | |
extension_dir = /usr/lib/php4 | ローダブル拡張モジュールの検索場所 |
extension = pgsql.so | postgresql 拡張モジュールをロードする。RedHat系OSでは /etc/php.d/pgsql.ini (/etc/php.d ディレクトリにありさえすればファイル名は自由) に記述してもよい |
postgreSQL | |
pgsql.allow_persistent = On | 持続的データベース接続を可能にするか。ただし、使ってみて、持続的データベース接続はかなり不安定な機能であることが分かったので、使用は推奨しない |
pgsql.auto_reset_persistent = Off | 新たな pg_connect() が行われるたびに、無効となった (broken な) 持続的接続を検出するか |
pgsql.max_persistent = 3 | 持続的接続が同時に存在できる最大数。 -1 は無限の意。運用に応じて適宜調節 |
pgsql.max_links = 20 | 持続的接続と通常の接続を合計した同時存在可能最大数。-1 は無限の意。運用に応じて適宜調節 |
Session | |
session.save_handler = file | セッションデータをファイルとして書き込む |
session.save_path = /tmp | セッションデータファイルの保存及び検索 dir。 /tmp/sess_SESSION_ID という名前のファイルとして記録される。 dir は、 open_basedir の外、 apache の "alias" や "document root" で定義した dir からは外さないと、覗き見や改ざんの可能性があり危険 |
session.use_cookies = 0 | php のセッション機能が自動的に cookie をクライアントに発行するか。コードを書くときに処理が見えにくいので、使わない。発行は setcookie() 関数で明示的に行うほうが確実 |
session.gc_probability = 1 session.gc_divisor = 5 |
セッションが gc_diviser 回開始される毎に gc_probability 回、ゴミ収集 (Garbage Collection) プロセスを起動し、無効化したセッションデータを破棄する。適宜調節 |
session.gc_maxlifetime = 900 | セッションデータが発行、更新されてから、ゴミと見なされるまでの秒数。適宜調節。例えば、ログイン情報をセッション情報としてサーバに蓄えるようなスクリプトを組み、この設定を 900 (15分) としておいた場合、クライアントがその php ページに一度認証してから、何も行わずに 15 分経過すると、もう一度ログインしなくてはならない、というような環境を作ることができる |
session.entropy_file = /dev/urandom | セッションID に使用する乱数の取得元 |
session.entropy_length = 27 | entropy_file から取得する文字数。27 という値は、postgreSQL で使えるテーブル名、カラム名の最大長が 31 バイトであることから編み出した数字。セッション名を利用してテンポラリテーブルを作る際に困った経験から。少し余裕を持って短めにしているのは、tmp**** といった名前がつけられるように |
session.cache_limiter = nocache | セッションを使用したページをクライアントやプロキシがキャッシュするのを規制するためのHTTPヘッダ |
mbstring | |
mbstring.language = Japanese | mbstring (マルチバイト処理) でデフォルトとする言語 |
mbstring.internal_encoding = EUC-JP | 内部文字エンコーディングのデフォルト値 |
mbstring.http_input = auto | HTTP入力のデフォルトエンコーディング。"ASCII,EUC-JP,SJIS,UTF-8" のように優先順位の記述も可能だが、auto で充分。auto は ASCII,JIS,UTF-8,EUC-JP,SJIS と解釈される |
mbstring.http_output = EUC-JP | HTTP出力のデフォルトエンコーディングを指定する。それでもクライアントのブラウザでエンコーディングが正しく判断されない場合は Apache の設定が悪い (Languageオプションとコンテントネゴシエーション参照) |
mbstring.encoding_translation = Off | HTTPで入力された文字コードが mbstring.internal_encoding と (?) 異なる場合、自動変換を行うか |
mbstring.detect_order = auto | 文字エンコーディング検出の順番。auto は ASCII, JIS,UTF-8,EUC-JP,SJIS と解釈される |
変換できないエンコーディングの場合に出力に使用する代替えエンコーディング。none は「無効な文字は出力しない」、pass は「変換せずにそのまま出力」の意 |
max_execution_time 設定 と set_time_limit() 関数PHPマニュアルの set_time_limit() 関数の日本語訳には誤りがある。常に php.ini の max_execution_time が優先されるように読めるが、実際には、スクリプト中で set_time_limit() で定義した実行時間は max_execution_time より優先される。ただし、これをやった場合には、時間延長の必要なセクションが終わったところで、再度 set_time_limit() を呼び、 set_time_limit(30) のように php.ini での設定値へ戻したほうがよい。PHPマニュアルへの投稿で、実行時間を無制限 ( set_time_limit(0) ) にしたプロセスが「ルーティンが終了しても生きたまま放置されることがある」 との報告を見た覚えがあるため。なお、 php.ini で safe_mode をオンにしている場合は set_time_limit() 関数は機能しない。 |
筆者の場合、Windows 上の秀丸でスクリプトを書き、SSH でサーバに送るのが好み。コードが見やすいように、秀丸には、自分なりにカスタマイズした php ハイライト設定を使っている。php 組み込みの変数はほとんどハイライトされるが、php ビルトイン関数に関しては、ハイライトを最低限に絞ってある。好みに合えば、お使い下さい。コメントのハイライトの絡みで 「ファイルタイプ別の設定」 >> 「モード」 は 「C言語/Java」 にすると相性が良い。
ハイライト設定ファイルはこちら。