オフィシャルドキュメント: PHP: PHP マニュアル - Manual

php4

Table of Contents

コンパイルとインストール

インストールの方針:

ソースからコンパイルする場合のconfigureオプション

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" すべし。

configureオプション例

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 の場合は apxs2xxxapxs (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*関係
日本語を扱うために必要

既存ライブラリのインストールベースdirについて

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)

ソースに付属していて上記で /etc/php.ini としてコピーした php.ini-dist は、その冒頭のコメントで断り書きがしてある通り、サーバとスクリプトのデバグ用の設定になっている。つまり、なんでもクライアントに見せてしまう、セキュリティ上好ましくない設定であり、実際の運用では絶対にデフォルトのまま使ってはいけない。もうひとつのファイル、php.ini-recommended は開発者が推奨している設定内容になっているが、それとて各自の要求や環境にぴったりというわけではないし、実際使ってみて「これはいかがなものか」的な設定も含まれていた。それでも php.ini-distphp.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_globalsoff にしたいので 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_runtimeOn の時、これも On だとバックスラッシュでなくシングルクォートでエスケープされる
default_mimetype = "text/html" コンテンツのパース時に HTTP の Content-Type ヘッダにデフォルトで付加する MIME タイプ。あくまでもデフォルトであり、個々のスクリプトで header() 関数によって Content-Type を記述していれば、常にそちらが勝る
default_charset = "EUC-JP" コンテンツのパース時に HTTP の Content-Type ヘッダの charset 要素にデフォルトで設定する文字セット。右辺をカラにすれば charset 要素は付加しないので、WEB サーバが面倒を見ることになる (Apache の場合、httpd 設定ファイルの AddDefaultCharsetOff 以外の時)。これも各スクリプトでの 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 と解釈される
mbstring.substitute_character = none 変換できないエンコーディングの場合に出力に使用する代替えエンコーディング。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() 関数は機能しない。

おまけ: 秀丸用 php強調表示ファイル

筆者の場合、Windows 上の秀丸でスクリプトを書き、SSH でサーバに送るのが好み。コードが見やすいように、秀丸には、自分なりにカスタマイズした php ハイライト設定を使っている。php 組み込みの変数はほとんどハイライトされるが、php ビルトイン関数に関しては、ハイライトを最低限に絞ってある。好みに合えば、お使い下さい。コメントのハイライトの絡みで 「ファイルタイプ別の設定」 >> 「モード」 は 「C言語/Java」 にすると相性が良い。
ハイライト設定ファイルはこちら