PHPによるプログラミングに関する世界観(1.言語)です。
パーフェクトPHP (PERFECT SERIES 3)を参考にしています。
PHPを使うことで、HTMLファイルの中にPHPのコードを埋め込み、PHPの文法と機能を使ってHTMLデータを自動作成できます。
ですが、どのような時に、PHPによる自動作成を行うべきなのでしょうか。静的なHTMLと動的なPHPをどのように使い分ければ良いのでしょうか。
ひとつの目安として言えるのは、「頻繁に更新されるコンテンツ」の自動作成や加工のために、PHPを使う、という方法です。
たとえば、Web掲示板、チャット、Wiki、あるいはECサイトなどは、不特定多数によって更新される、頻繁に最新の情報を自動作成する必要のあるサイトの例です。また、天気予報やニュースのようなページも、いちいちHTMLファイルを書き換えるのではなく、PHPで自動更新されるようにした方が楽に管理できます。
不特定多数によって投稿が更新される以外にも、WebページとしてのPHPファイルの構成は変えないでおいて、「データだけを更新したい」といった場合にもPHPは使われます。これはブログサイトなどが言えるでしょう。
また、入力フォームを受け取ったり、ログイン認証を行ったり、ユーザーに専用の管理画面を表示したり、などといった使い方もあります。また、Web画像加工ツールのように、PHPの関数を使いたいから使う、といった利用も可能です。
ファイルの構成を変えずにデータだけを蓄積する上で、素のPHPを使うよりも、HTMLテンプレートを「ビュー」、データベースを「モデル」、処理や操作を「コントローラ」として、ルーティングの結果望みのページが自動作成されるようにする、「Webフレームワーク」という機能を使うこともできます。PHPならLaravel、PythonならDjango、RubyならRuby on Railsなどがこれに当たります。
PHPの利用が必要ない場合として、一度書いたらそのままで残るような普通のWebページが挙げられます。ですが、最近のWebページは高度に進化しており、WordPressのようなCMSエンジンを使うことで、ブログライクなさまざまな機能(コメント投稿機能など)をWebページに持たせることができます。
PHPのプログラムコードは、HTMLのソースファイルの中に「<?php ~ ?>」のコードを埋め込むことで行われます。出力するための関数で表示するPerl/CGIなどと違い、簡素な記述が可能となります。(echo()関数を用いて表示することも可能。)
PHPはPerlを参考に作られているため、変数名に$を付けるなど、良く似た点があります。
HTMLに埋め込む形ではなく、PHPのコードだけを記載する場合は、文の最初から「<?php ~」と始めれば良い。この時、空白の内容が出力されないように、「?>」を付けないことが推奨されている。注意しておこう。
後日注記:PHPの基本は<?php ~ ?>の中でecho()を使ってテキストやHTML要素を表示すること。早い話それさえできればPHPで基本的なことはできます。
2024.10.29編集
$_POSTはあらかじめ定義された変数(スーパーグローバル変数)で、PHPがPOSTメソッドで受け渡されたデータが格納されている。
ページの中で
<form method="post" action="comment_receive.php">
と指定したフォームの変数が格納されている。「method="post"」という記述がそれを意味している。「action="comment_receive.php"」はPOSTを使ってフォームの値を受け渡すページ名を指定する。
$_POSTの中に配列として全てのデータが入っているが、その中の一部を取り出す時は、キーによって配列内部のデータを参照する。
たとえば、
<textarea name="comment_text" cols="50" rows="5" maxlength="150"></textarea>
なら、
$_POST['comment_text']
という風にすると、このテキストエリアに入力された値を取り出せる。
実際にはnl2br()関数を用いて改行を<br>タグに変える必要や、htmlspecialchars()関数を用いてHTMLの特殊文字を普通の文字に変換して<script>タグなどを無効化する必要がある。
HTMLも参照のこと。
URLに含まれる文字を得たい場合は$_GETを使うこともできる。
たとえば、
http://hogeblog.com/blog.php?username=hoge
とアクセスした場合、
$_GET['username']
にはhogeが格納される。
getとpostはどちらもサーバーに変数を送ることができるが、一般的にgetはサーバーからデータを「取得する」場合、postはサーバーにデータを「投稿する場合」に使うことが推奨される。
ファイルのアップロードがPOSTから行われた時、この変数にファイルの情報が格納される。
セッションはサーバーに一時的に保持されるデータで、ページをまたいでユーザーの情報を保持しておくことができる。ユーザーのログイン情報などを保持するために使われることが多い。
Cookie(クッキー)はブラウザ側に保持されるが、セッションはサーバー側に保持される。
たとえば、
session_start();
としてセッションを開始し、
$_SESSION['username']
のように変数として、セッションの間に保管されるデータにアクセスできる。
詳しくは以下を参照のこと。
HTTP Cookieの情報が格納される。セッションはWebサーバに保存されるが、クッキーはWebブラウザに保存される。
Cookieも参照のこと。
Webサーバーの情報が格納されており、Webサーバのホスト名、IPアドレス、リクエストのプロトコル、リクエスト元のIPアドレス、リクエストのHTTPメソッド名などが含まれる。
後日注記:$_SERVERはとてもよく使うグローバル変数であるため、中にある要素をよく確認しておこう。
パーフェクトPHP (PERFECT SERIES 3)を参考に執筆しました。
PHPは「PerlライクにHTMLにコードを埋め込むことのできる言語」として使われることが多かったため、変数名には必ず$をつけるなど、Perlからの影響が見られます。
しかしながら、Perlのように使うのは$だけで、@や%は基本的に使いません。配列やハッシュであっても$をつけます。オブジェクトのインスタンスであっても同様に$をつけます。
むしろ、Perlからの影響よりも、C++やJavaに合わせた点もあわせもっています。たとえばforeach文はデフォルトではPerlのように配列の中身を操作することができません。&をつけて参照を用いて操作する必要があります。
(パーフェクトPHP (PERFECT SERIES 3)を参考に執筆しました。)
PHPでは、グローバルスコープとローカルスコープが存在する。PHPブロックの中に直接記述した変数はグローバルスコープとなる。関数やクラスのメソッドを定義するとその中はローカルスコープとなる。ローカルスコープに宣言すると、別の場所からその変数にはアクセスできない。逆にグローバルスコープに宣言した変数は、ほかの場所(別のPHPブロックや別のファイルなど)からもアクセスできる。globalキーワードを使うことで、ローカルスコープの中からグローバルスコープの変数を操作できる。
型は、(float)'102.034'のようにC言語風のキャストが行えるほか、変換関数としてintval(), floatval(), strval()などがある。
型も参照のこと。
代入演算子=や、代数演算子+, -, *, /, %などが使える。++や--も可能。
比較演算子は、==の場合型がキャストされて比較される。キャストしたくない場合は===を使用する。
また、.は文字列の連結に使う。このため、オブジェクトに対するメソッドの呼び出しには.ではなく->を使う。
PHPで文字列を表現するためには、ダブルクォーテーション("~"と文字列を囲む方法)とシングルクォーテーション('~'と文字列を囲む方法)がある。
二つの違いは、変数名を記述した場合に値を展開するかどうか、制御文字(エスケープシーケンス)を理解するかどうかなど。
"~"で文字列を囲んだ場合、その中に変数名(たとえば$age)が含まれていると、echo()などで文字列を出力した時に、その変数が展開されて変数の値を表示できる。
また、\nのような制御文字(エスケープシーケンス)を理解し、たとえば\nの場合は改行を表示する。
そのため、以下のようなコードが記述できる。
<?php $age = 18; echo "I'm $age years old.\n";
上のコードを実行すると、
I'm 18 years old.
と表示され、最後に改行される。
これに対して、'~'で文字列を囲んだ場合、変数の展開はされず、制御文字も理解されない。書いたそのままの文字列が表示される。
また、'~'で文字列を囲む場合、中に"の文字をそのまま入れることができる。逆に"~"で囲んだ場合は、中に'の文字をそのまま入れられる。'~'の中に'を入れたい場合は、\'のようにエスケープしなければならない。
それから、'~'は"~"よりも、変数展開などのチェックが必要ないため処理速度が速い。そのため、変数展開などが必要ない場合は、原則'~'を使うようにしよう。
配列の例:
<?php $names = array('assy', 'schwarz', 'zaidou',); echo $names[0], PHP_EOL; // assy
以下のように[]で書くこともできます。(短縮構文)
$numbers = [1, 2, 3, 4, 5];
後日注記:PHPでは配列の要素に種類の異なる型の要素を混ぜることができる。そのため、数値や文字列など異なる型の要素を同じ配列の中に詰め込むことができる。
連想配列の例:
<?php $people_types = array( 'assy' => 'human', 'schwarz' => 'robot', 'zaidou' => 'saint', ); echo $people_types['schwarz'], PHP_EOL; // robot
短縮構文で描くとこうなります。
$people_types = [ 'assy' => 'human', 'schwarz' => 'robot', 'zaidou' => 'saint', ];
後日注記:PHPでは、添字配列と連想配列(ハッシュ)は同じものとして扱われる。よって、キーのない配列要素を混ぜることもできる。また、添字配列でなくても順番は保持される。
PHPでは、多次元配列は配列の中に配列を入れ込めば実現できる。$a[0][0]のようにアクセスできる。
また、連想配列を要素に持つ連想配列$namesがあった場合、
<?php $names = array( 'assy' => array('age' => 31, 'count' => 9,), 'schwarz' => array('age' => 27, 'count' => 1,), 'zaidou' => array('age' => 50, 'count' => 2,), ); foreach ($names as $n => $v) { echo "$n は {$v['age']} 歳で {$v['count']} 人です", PHP_EOL; }
のようにアクセスすることもできる。
PHPのecho()では、変数名と文字列を区別するために{}を使います。詳しくは以下のページが参考になります。
if~elsif~else。条件式が真である場合と偽である場合に別々の処理を実行する。
if (1つ目の条件式) { 1つ目の条件式が真の場合に実行される処理 } elsif (2つ目の条件式) { 2つ目の条件式が真の場合に実行される処理 } else { すべての条件式が偽の場合に実行される処理 }
後日注記:PHPの特徴として、PHPモードとHTMLモードを行き来しても、論理的な制御フローは維持される。そのため、以下のようなコードを書くことができる。
<?php if (条件式) { ?> <p>条件式が真の場合に表示される</p> <?php } else { ?> <p>条件式が偽の場合に表示される</p> <?php } ?>
詳しくは実用的な例 - PHPマニュアルが参考になる。
後日注記:また、{}を使った場合に「どのカッコがどのカッコに対応しているのか」が、このようなHTMLに対する埋め込みだと分かりづらくなる。このような時は{}の代わりに:(コロン)とendif;やendfor;やendwhile;などを使うことができる。
<?php if (条件式): ?> <p>条件式が真の場合に表示される</p> <?php else: ?> <p>条件式が偽の場合に表示される</p> <?php endif; ?>
詳しくは制御構造に関する別の構文 - PHPマニュアルが参考になる。
構造化プログラミングも参照のこと。
while。条件式が真である間繰り返す。
while (条件式) { 条件式が真である間繰り返す処理 }
do-while。whileと同様だが、最初の一回目は必ず実行される。
do { 条件式が真である間繰り返す処理 } while (条件式);
for。C言語のfor文と同様、カウントと条件の比較に関連する部分をひとつの場所に書ける。
for (インデックス変数の初期化を行う式; 条件式; 繰り返しが毎回終わる度に実行される処理) { 条件式が真である間繰り返す処理 }
foreach。Javaなどの拡張for文と同様、シーケンス(連続したデータ構造)の要素をひとつひとつ取り出しながら反復処理を行う。
foreach (反復参照可能なシーケンス as 要素) { 要素ごとに実行される処理 }
foreachでは現在のキーを取得することもできる。
foreach (反復参照可能なシーケンス as キー => 要素) { キーと要素ごとに実行される処理 }
foreachでは、参照を用いることで、要素を一時的な変数にコピーするのではなく、元の要素を書き換えることができる。
foreach (反復参照可能なシーケンス as &要素) { 要素ごとに実行される処理 }
参照を使った例:
<?php $people_types = array( 'assy' => 'human', 'schwarz' => 'robot', 'zaidou' => 'saint', ); foreach ($people_types as &$t) { $t = 'character'; } var_dump($people_types); // すべての要素がcharacterになっている
後日注記:また、ほかの言語にあるように、break文(繰り返しから抜ける)やcontinue文(今回の繰り返しをスキップして次の繰り返しを行う)を使うことができる。
関数の例:
<?php function ave2($x, $y) { return ($x + $y) / 2; } $z = ave2(4, 12);
後日注記:引数によって関数に値を渡し、関数からreturnによって値を返すことができる。ただし、引数に与える値や返す値の型を静的に明記する必要はない。
後日注記:もし、PHPに型宣言が必要だと考えるなら、PHPの最近のバージョンでは型宣言を関数やクラスに記述できる。
<?php declare(strict_types=1); function ave2(float $x, float $y): float { return ($x + $y) / 2; } $z = ave2(4.5, 12.0);
強い型付けを有効にするためにstrict_types=1をdeclare()命令で設定する必要がある。
詳しくは以下が参考になります。
関数も参照のこと。
コールバック関数と可変関数は、関数に対して関数名を引数に指定して呼び出すことで、関数の中から関数を呼び出す仕組み。
関数の中で、さまざまな場所から場合によって異なる関数を呼び出すことができる。
コールバック関数は、たとえば$arが配列だったとして、
array_map('intval', $ar);
のようにする。この場合、変数を数値型に変換するintval()関数を、array_map()を使って配列$arの全要素に適用している。
たとえば、文字列をexplode()で分割して配列に格納し、それを数値に変換するには以下のようにします。
$str = "1:2:3:4:5"; $ar = explode(':', $str); array_map('intval', $ar);
explode()の使い方については以下が参考になります。
array_map()に与えるのはPHPに用意されている関数だけではなく、自分で作った関数であってもよい。
function multiple3($n) { return $n * 3; } $ar = [1, 2, 3, 4, 5]; array_map('multiple3', $ar);
また、関数func_call_func()の引数が$arg_funcだったとして、func_call_func()の中で$arg_func();とし、関数hoge_func()を定義し、
function func_call_func($arg_func) { for ($i = 0; $i < 10; $i++) { $arg_func($i); } } function hoge_func($x) { echo '<p>' . $x . '</p>', PHP_EOL; } func_call_func('hoge_func');
とこの関数を呼び出すことで、関数hoge_func()を関数func_call_func()の内部の$arg_func();から呼び出すことができる。これを可変関数と言う。
関数型プログラミングも参照のこと。
(パーフェクトPHP (PERFECT SERIES 3)を参考に執筆しました。)
また、これら以外にも無名関数と呼ばれる機能もある。無名関数はクロージャのように使うこともできる。
後日注記:たとえば、無名関数をコールバック関数に使った関数は、以下のようになる。
function func_call_loop($callback, $end) { for ($i = 0; $i < $end; $i++) { $callback($i); } } func_call_loop(function($n) { echo '<p>' . $n . '</p>', PHP_EOL; }, 20);
array_map()に無名関数を指定することもできる。
$ar = [1, 2, 3, 4, 5]; array_map(function($n) { return $n * 3; }, $ar);
クロージャ・無名関数・関数オブジェクトを参照のこと。
require()は、別のファイルに書かれたPHPスクリプトを読み込むために使う。一度しか読む必要がない場合はrequire_once()が使える。
また、同様の関数にinclude()とinclude_once()がある。違いは、include()を使った場合、ファイルが存在しなくても、警告は発せられるが実行は継続される。
後日注記:実際のPHPプログラミングでは、共通の関数やクラスの定義を読み込むためにrequire()を使うほか、データベース用のユーザー名とパスワードなど、どのファイルからも共通して使われる「共通のデータ」を宣言して読み込むために、require()やrequire_once()を使ってそのデータが保持されているPHPファイルを読み込みます。
(パーフェクトPHP (PERFECT SERIES 3)といちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング (「いちばんやさしい教本」シリーズ)を参考に執筆しました。)
PHPでは、Perl風の一行コメントである#と、C/C++風の一行コメントである//と、複数行のブロックコメントである/* ~ */が利用できる。
JavaのJavadocと同様、PHPでもDocCommentのための/** ~ */という形式のコメントが利用できる。
HTMLのコメントである<!-- ~ -->とごっちゃにならないように注意しよう。
2023.02.03
パーフェクトPHP (PERFECT SERIES 3)を参考に執筆しました。
PHPでオブジェクト指向プログラミングを行うことは可能だ。クラスやオブジェクトも完備され、標準でさまざまな機能が提供されており、C++/Javaに負けない高度なオブジェクト指向機能を使うことができる。
オブジェクトの作成には「new」演算子を使い、メソッドの呼び出しには->を使う。たとえばデータベースへのアクセスにはPDOクラスのオブジェクトを作って行う。
オブジェクト指向も参照のこと。
PHPのオブジェクト指向の記述は、JavaやC++とよく似ている。
まず、クラスはclass文で記述する。extendsをつけることで、既にあるクラスを継承し、機能を追加したり、メソッドをオーバーライドして機能を上書きすることができる。
<?php class Cat { public function mew() { echo 'にゃーん', PHP_EOL; } }
インターフェースはinterface文で記述する。implementsをつけることで、既にあるインターフェースを実装し、共通のインターフェースからそのクラスを使うことができる。インターフェースは「implements Reader, Writer」のように複数のインターフェースを実装できる。
クラスのインスタンスはnewで生成し、->でメソッドを実行できる。
$kuro = new Cat(); $kuro->mew();
アクセス修飾子は、public(公開), private(非公開), protected(自らあるいは継承したクラスオンリー)がある。
オブジェクトのインスタンスは参照型変数として扱われるため、そのままコピーすると同じオブジェクトを参照する別名の変数となる。これはJavaと同じ。明示的に複製したければcloneを使う。
$shiro = clone $kuro;
親クラスのメソッドやプロパティを子クラスに同じ名前で定義すると、オーバーライドできる。
抽象クラスはabstractで宣言する。親クラスで抽象的な「とっかかり」となる共通部分を作っておいて、詳細は派生クラスで実装することができる。
また、PHPにはマジックメソッドというものがあり、これはオブジェクトを特定の状況で使う時に自動的に呼び出されるメソッドで、フックとして使うことができる。
たとえば、__toString()メソッドは、文字列型へキャストしようとした時に呼び出される。この動作を上書き(オーバーロード)することで、デフォルトの動作を書き換えることができる。
コンストラクタの__constructやデストラクタの__destructは、マジックメソッドの一種として実現されている。
詳しくはパーフェクトPHP (PERFECT SERIES 3)を参照のこと。
マジックメソッドの面白い例として、__invoke()メソッドがある。これはオブジェクトのインスタンスを関数のように実行することのできるメソッド。たとえば、
<?php class Cat { public function __invoke($x) { echo $x, PHP_EOL; } } $kuro = new Cat(); $kuro('mew');
のように実行できる。また、array_map()のような関数の引数にこのオブジェクトを渡すこともできる。
例外は、
throw new 例外のクラス名();
で送出し、
try { 例外が発生するかもしれない処理 } catch (例外のクラス名 変数名) { 例外が発生した場合の処理 }
で処理する。
参照は以下のようになる:
<?php $x = 100; $y =& $x;
$xと$yは同じ領域を参照する。
$y = 200;
とした場合、$xも200に変更される。
後日注記:PHPではオブジェクトのインスタンス変数は特に何もしなくても参照型として扱われるため、関数の外で宣言されたオブジェクトを引数に与えた場合、関数の中から操作できる。=で代入しても、同じ場所を指す参照となるだけで複製はされない。明示的に複製するにはcloneが必要。
var_dump()は変数の詳細をダンプして表示する関数。たとえばbool型の変数などでecho()文を用いると空白しか表示されないなどといった時に、変数の値の詳細な確認のために使うことができる。
PHPのエラーレポーティングは、E_PARSE(文法の間違い)、E_ERROR(実行時の致命的エラー)、E_WARNING(警告)、E_NOTICE(重要度の低い警告)、E_DEPRECATED(廃止予定の古い機能)があり、これらすべてを指定するのがE_ALL。
このうち、実行されずに終了するのがE_PARSE、実行中にその場で終了するのがE_ERROR。E_WARNINGとE_NOTICEは警告は出されるものの実行が継続される。
また、これらに加えて、非推奨な記述が使われている時にE_STRICTを設定できる。
エラーレベルは、php.iniでランタイムレベルで制御することもできるし、error_reporting()関数でプログラムレベルで制御することもできる。エラーレベルはビット演算子を用いたフラグによって表現する。
ちなみにエラーを表示するかどうかはdisplay_errorsで制御できる。エラーを表示しない場合でも、log_errorsを設定することで、エラーをログに取ることもできる。ログのファイル名はerror_logで設定する。本番環境ではエラーを表示せずログに記録することが推奨される。
(パーフェクトPHP (PERFECT SERIES 3)を参考に執筆しました。)
以下の書籍が参考になります。
パーフェクトPHP (PERFECT SERIES 3)を参考に執筆しました。
文字列の処理は、printf(), sprintf(), htmlspecialchars(), nl2br(), implode(), explode()などを使うことが多い。
関数 | 説明 |
---|---|
printf() | 変数をフォーマットして出力する。 |
sprintf() | 出力せずにフォーマットする。 |
htmlspecialchars() | HTMLのタグを文字に変換する。 |
nl2br() | 改行をbrタグにする。 |
implode() | 配列を連結して文字列にする。 |
explode() | 文字列を分割して配列にする。 |
ほかにも、さまざまな文字列処理の関数がある。文字列系の関数にはstr*あるいはstr_*という接頭辞が付いており、さまざまな文字列処理に活用できる。
詳しくは以下を参照のこと。
PHPではPerl互換の正規表現によるパターンマッチングを行うことができる。
関数 | 説明 |
---|---|
preg_match() | 正規表現でマッチング。最初の一回だけマッチングを行う。 |
preg_match_all() | 正規表現でマッチング。すべての箇所にマッチングを行う。 |
preg_replace() | 置換。 |
preg_split() | 分割。 |
文字列の検索は正規表現を使わなくても、strpos()関数を使った方が効率的なので、正規表現を使わなくてもいい時は文字列系の関数を使おう。
正規表現も参照のこと。
C言語のラッパー関数として、fopen(), fread(), fwrite(), fclose()などを使うことができる。
file_get_contents()関数を使うと、ファイルの内容を一度にすべて読み込める。また、file_put_contents()関数を使うと書き込みができる。
SplFileObjectクラスはオブジェクト指向のファイル操作用のクラスで、fopen()系の関数をメンバに持つ。foreach文で1行ごとにファイル読み込みを行うためのイテレータとしても利用できる。
このほか、ファイル処理の関数としてmkdir(), rmdir(), rename(), copy(), unlink()などがある。
Linuxシステムコール・APIも参照のこと。
ファイル一覧を取得するには、C言語と同様のglob()関数を用いると便利。たとえば以下のようになる:
glob('hoge_dir/*.txt')
PHPには、多数の配列関連のAPIが標準で用意されている。
関数 | 説明 |
---|---|
array_shift() array_unshift() array_push() array_pop() | 配列をスタックやキューのように扱う。 array_shift()とarray_unshift()は先頭に要素を取り出し・追加。 array_push()とarray_pop()は末尾に要素を追加・取り出し。 |
sort()/rsort() ksort()/krsort() asort()/arsort() usort()/uasort()/uksort() | 昇順あるいは降順のソート。 k*はキーのソート。 a*はキーとの結合関係を維持。 u*はユーザー定義関数を使用。 |
array_reverse() | 逆順に並べ替え。 |
shuffle() | ランダムに並べ替え。 |
count() | 配列の要素数をカウント。 |
in_array() | 配列の中に値を含む要素が存在するかを確認。 |
array_search() | 値を検索して見つかった要素のキーを取得。 |
array_fill() | 配列のすべての要素を同じ値で埋める。 |
array_map() array_filter() | コールバック関数を指定して配列をマップあるいはフィルタリング。 |
array_keys() | 配列のキーだけを取り出す。 |
array_merge() | 配列を結合。 |
array_slice() | 配列のスライスを切り出す。 |
array_splice() | 要素を置き換え(削除して追加)。 |
詳しくは以下のページ・書籍が参考になる。
配列とリストとハッシュやスタックとキューも参照のこと。
PHP標準のGD拡張モジュールを使うことで、PHPで画像を動的に作成したり、画像を操作したりできる。
簡単な画像処理の他、投稿された画像のリサイズなどにも使うことができる。
ImagickはImageMagickをPHPで使用するための画像処理ライブラリ。
主な関数の一覧は以下が参考になる。
PHPのリファレンスは以下から参照できます。
以下は個人サイト。
PEARはPHPのライブラリ。
PEARの例として、たとえば認証機能を使えるようになるPEAR::Authなどが存在する。
php.iniはPHPの設定ファイル。Debianでは/etc/php5/cli/php.ini、CentOSでは/etc/php.iniにある。
特に文字コードをUTF-8に設定し、mbstring.*の各種設定で日本語マルチバイト環境とUTF-8の設定をしよう。
書籍「いちばんやさしいPHPの教本 人気講師が教える実践Webプログラミング (「いちばんやさしい教本」シリーズ)」を参考にさせていただきました。
PHPの設定ファイルで、文字コードをUTF-8に設定しましょう。このためには、php.iniを変更します。
以下はphp.iniの例。
default_charset = "UTF-8" mbstring.language = Japanese mbstring.internal_encoding = UTF-8 mbstring.http_input = pass mbstring.http_output = UTF8 mbstring.encoding_translation = Off mbstring.substiture_character = none; mbstring.func_overload = 0
mod_phpは従来からのApacheのPHPモジュール。
FPMはFastCGI Process Managerのことで、PHPをFastCGIで動かすことのできる実装のひとつ。
ApacheでPHPを動かす場合に、php-fpmとmod_phpでどのように違うかは以下が参考になる。
FastCGIについて詳しくはFastCGIの世界観を参照のこと。
Wikipediaで使われているWikiエンジン。
Wikiも参照のこと。
Webサイト作成フレームワーク。
WordPressも参照のこと。