PHP Logo PHP

作成日:2015年10月12日

PHP とは?

PHP は主に Web サーバー上で動作するインタプリタ型スクリプト言語で、動的な Web サイトを作成するために作られました。

PHP は元は Personal Home Pages の略でしたが、今は PHP: Hypertext Processor に変わりました。

また、Web ページを記述する HTML 内に PHP を埋め込むことができます。

Web では、クライアントとサーバーと言う役割があり、クライアントがサーバーに対してコンテンツの要求(リクエスト)をすると、サーバー側が要求されたページを応答(レスポンス)します。

クライアントとは通常 Web ブラウザで、サーバーとはネットワーク上でクライアントからの要求を処理するコンピュータです。

Web ブラウザに URIURL) を入力すると、Web ページが表示されますが、これは Web ブラウザが Web サーバーへコンテンツを要求(リクエスト)し、Web サーバーがその要求に応答した結果(レスポンス)が Web ブラウザに表示されます。

URI(URL)やコンテンツなどをクライアント・サーバー間でやり取りする基本的な手続き(プロトコル)を決めているのが HTTP です。

HTTP はハイパーテキスト(HTML等)を転送するための約束事で、「クライアントがサーバに要求し、サーバーがその要求に応答する」という仕組みを規定しています。

PHP はサーバー側にあるプログラミング言語で、Web サーバー上で動作します。

サーバーは PHP コードを実行して、ブラウザに向けて送信する前に HTML に変換します。つまりブラウザにはサーバー上で動作した PHP コードの実行結果としての HTML コードだけが見えるようになっています。

Web サイトの全てのページは、HTML も CSS も PHP もサーバー上に格納されています。但し、全てがサーバー上で処理されるわけではありません。 HTML ファイルや CSS ファイルなどはブラウザに直接送られます。それに対して PHP ファイルは、Web サーバー上で処理され実行されるコードを含んでいて、ブラウザに送られるのは、PHP コードではなく PHP コードを実行した結果の HTML です。

言い換えると、Web サーバーが、PHP ファイルをブラウザからリクエストされると、その中身を調べて PHP の記述を見つけて、Web サーバーの中で PHP プログラムを実行し HTML に変換します。そのため、Web サーバーが PHP ファイルの読み込みを終えると、PHP の部分は HTML やテキストに置き換わり、変換が完了した HTML タグだけのデータをブラウザに送り返します。

静的なページ

Web ブラウザが HTML ファイルや JPEG ファイルなどをリクエストした場合、あらかじめ Web サーバー上に用意されていたファイルがそのまま送信されます。このため送信されるファイルの内容はいつも同じで、このようなページを静的なページと呼びます。

動的なページ

Web ブラウザが PHP ファイルをリクエストした場合、PHP ファイルに記述されたプログラムが Web サーバー上で実行されて、その結果作成されたページが Web ブラウザに送信されます。この時ページの内容はリクエストに応じてプログラムにより変化させることができ、このようなページを動的なページと呼びます。

サーバーサイドスクリプト

PHP は基本的にサーバー側で動作するスクリプト、サーバーサイドスクリプトです。サーバーサイドスクリプトは、クライアントサイドスクリプトとは異なり、ファイルシステムやデータベースをはじめ、サーバー側でデータを保存・管理することが可能です。

サーバーサイドスクリプトには、PHP 以外に、JSPASP などがあります。

PHP に必要なソフトウェア

PHP でアプリケーションを開発、実行するには以下のソフトウェアが必要です。

Web サーバー
PHP はサーバーサイドスクリプトなので、Web サーバーが必要です。Web サーバーにはいろいろなソフトウェアがありますが、ここでは広く利用されている Apache HTTP Sever (以降 Apache)を使用します。
PHP
PHP の本体で、PHP の実行エンジンや各種ライブラリ、設定ファイル等 PHP の開発・実行に必要な一連のソフトウェアを含みます。
データベースサーバー
データベースサーバーは必ずしも必須ではありませんが、データを処理する上で有用です。ここでは MySQL というデータベースを使用します。

開発環境の準備

かつては、Web サーバーや PHP、データベースを1つ1つ個別にインストールしていましたが、XAMPP や MAMPP を利用することでインストールがとても簡単になりました。

XAMPP

XAMPP: Apache + MySQL + PHP + Perl

XAMPP は、完全に無償で MySQL、PHP、および Perl を含んだ、簡単にインストールできる Apache の開発環境で、https://www.apachefriends.org/jp/download.html からダウンロードすることができます。

XAMPP のインストール

XAMPP のインストール方法は以下を参照ください。

XAMPP のインストール方法と基本的な使い方

MAMPP のインストール

MAMPP のインストール方法は以下を参照ください。

MAMP のインストールと初期設定

php.ini の編集

PHP の設定ファイル「php.ini」はデフォルトでは以下のフォルダにあります。

PHP エラーの表示

ローカル(開発)環境の場合は、エラーがチェックできるようになっている方が良いのでエラーを表示するようにしておくと良いでしょう。

※ 逆に本番(プロダクション)環境では、エラーが表示されてしまうとファイルのパスなどが表示されてしまい、セキュリティ上問題があるのでエラーを表示しないように設定し、ログに出力するようにするのが一般的です。

php.ini の display_errors という「エラーをHTML出力の一部として画面に出力するかどうか」を定義する項目で設定することができます。

以下のように On になっていれば、全ての php ファイルに対してエラーを表示するようになります。

display_errors = On 

全ての php ファイルに対してエラーを出力しないようにするには以下のようにします。

display_errors = Off 

関連:エラーメッセージの制御

XAMPP (MAMPP) のセキュリティ

XAMPP (MAMPP) は開発環境での使用を目的としているため、利用性を優先していてデフォルトではセキュリティレベルが最低になっています。そのため不要なソフトウェアは起動しないようにします。

また、PC のファイアウオールを有効にしておくと良いでしょう。

phpinfo()

次のコードを含む php ファイルを「phpinfo.php」などのファイル名で作成して保存します。

<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>PHP Info</title>
</head>
<body>
<?php phpinfo();?>
</body>
</html> 

この phpinfo.php は、PHP の現在の設定状況を確認するのに役立つユーティリティです。php.ini の編集内容が認識されているかや、拡張モジュールが組み込まれているか等を確認することができます。

但し、これはローカルの開発環境などでは問題ありませんが、本番環境のサーバー等には置かないように注意が必要です。phpinfo() 関数の表示により、PHP の設定内容がわかってしまうためセキュリティ上良くありません。

phpinfo() 関数で、設定情報を表示させないようにするには、php.ini で「disable_functions」を検索して以下のように記述します。(設定変更を反映させるには、Apache を再起動する必要があります。)

disable_functions=phpinfo

XAMPP をインストールしてあれば、ブラウザで「http://localhost/xampp/」にアクセスするか、XAMPP のコントロールパネルの Apache の「Admin」をクリックして、左側のメニューの「phpinfo()」でも確認することができます。

XAMPP コントロールパネル

XAMPP ホーム

phpinfo()

HTTP の応答ヘッダーに含まれる PHP バージョンを隠す

PHP をインストールした状態のままで使用していると、HTTP の応答ヘッダーに PHP のバージョンが表示され、セキュリティー上あまりよくないので、バージョン情報を隠すには、php.ini で「expose_php」を検索して以下のように変更します。

expose_php=Off

文字エンコーディング

コンピュータで文字を扱う場合、「文字エンコーディング」を決定する必要があります。日本語の Web でよく使われるエンコーディングには以下のようなものがあります。

  • UTF-8
  • Shift_JIS
  • EUC-JP

現在では、UTF-8 が多く利用されています。

文字エンコーディングを統一することで、文字化けを防ぐことができます。

PHP を使用する場合は、UTF-8 を使用するのが良いです。

文字エンコーディング関連の設定

ここでは、文字エンコーディングを UTF-8 に統一して設定することにします。

php.ini の設定

php.ini では、以下のようなマルチバイトに関する設定項目があります。

mbstring.language
デフォルトの言語。主にメール送信(mb_send_mail 関数)の際のエンコーディングを決めるために使われます。
mbstring.internal_encoding
マルチバイト文字列関数でのデフォルトの文字エンコーディング。mbstring.internal_encoding は、mbstring.language より後に記述する必要があります。

マルチバイト文字列関数には、文字エンコーディングを引数で指定できるものがありますが、その引数を省略した場合、mbstring.internal_encoding が使われます。

以下は、デフォルトの言語を日本語、文字エンコーディングを UTF-8 に設定する例です。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8

マルチバイト関連の設定を行う関数

プログラムから関数を使って設定することもできます。また、パラメータを省略して実行すると、現在の設定されている値を取得することができます。

マルチバイト関連の設定を行う関数
関数 対応する php.ini の設定項目
mb_language() mbstring.language
mb_internal_encoding() mbstring.internal_encoding
mb_regex_encoding() N/A

PHP ファイルを UTF-8 形式で保存する

PHP のファイル(.php)を UTF-8 形式で保存します。その際には、UTF-8 (BOMなし)を選択して、BOM (Byte Order Mark) をファイルに含めないようにします。

UTF-8(Unicode)で BOM をつけてしまうと、<?php の前に文字が出力されてしまい、想定外のエラーが出てしまう可能性がります。UTF-8 で記述するときは、必ず BOM 無しのエンコーディング(UTF-8N)を使用します。

HTTP レスポンスヘッダの文字エンコーディング

Web ブラウザの表示で、文字化けしないようにするには、表示するページの文字エンコーディングをブラウザに伝える必要があります。

そのためには、HTTP レスポンスのヘッダ内に、以下のような Content-Type の情報を出力します。

Content-Type: text/html; charset=UTF-8

Content-Type はデータの MIME タイプを指定するフィールドで、HTTP 1.1 で規定されています。

Content-Type を出力するには、以下のような方法があります。

  • PHP の設定で指定(php.ini)
  • PHP のプログラムで指定(header 関数)
  • Web サーバの設定で指定

PHP の設定で指定(php.ini)

php.ini には、以下の設定項目があり、HTTP レスポンスで送るコンテンツの種類(MIME タイプ)と文字エンコーディングを指定できます。

  • default_mimetype : Content-Type ヘッダの MIME タイプ
  • default_charset : Content-Type ヘッダの charset

以下は php.ini で設定する例です。

default_mimetype="text/html"
default_charset = "UTF-8"

PHP のプログラムで指定(header 関数)

header() 関数を使うと、ブラウザに送信する HTTP レスポンスヘッダ内に、任意の情報を含めることができます。以下は例です。

<?php
header('Content-Type: text/html; charset=UTF-8');
?>

header() 関数は、 通常の HTML タグまたは PHP からの出力にかかわらず、すべての実際の出力の前に記述する(呼び出す)必要があります。

Web サーバの設定で指定

Web サーバによっては、コンテンツの文字エンコーディングを自動的にブラウザに送信するように設定できるものがあります。Apache では以下の設定項目があります。

AddDefaultCharset ディレクティブ
これを設定すると、HTTP レスポンスヘッダで送信するコンテンツの種類が、text/plain か text/html の場合に、文字エンコーディングの指定と共に、Content-Type ヘッダが出力されます。

UTF-8 に指定するには、以下のように設定します。

AddDefaultCharset utf-8

htmlspecialchars() の文字エンコーディングの指定

プログラムで使用する文字エンコーディングを UTF-8 に統一すれば、ブラウザへの出力も UTF-8 になるはずです。

しかし、プログラムではブラウザにデータを出力する際に、HTML 特殊文字のエスケープ処理を行います。その際に、htmlspecialchars() 関数を使用しますが、次のように第3パラメータに必ず文字エンコーディングを指定するようにします。

htmlspecialchars($str, ENT_QUOTES, 'UTF-8');

指定した文字エンコーディングにおける無効な文字が含まれていれば、空文字を返すという機能があるので、htmlspecialchars() 関数を呼び出す際には、文字エンコーディングを指定するようにします。

第3引数を指定することは、不正な文字エンコードによる攻撃を防ぐセキュリティ対策として意味があります。

参考:htmlspecialcharsは不正な文字エンコーディングをどこまでチェックするか
PHP5.4のhtmlspecialcharsに非互換問題