PHP 開発環境の作り方【完全ガイド】:macOS/Windows/Linux 別最適解
PHP で Web アプリケーションを開発するとき、最初に悩むのが「どうやって環境を作ればいいの?」という点ではないでしょうか。OS によって手順が異なりますし、どのツールを選ぶかで開発の効率も大きく変わります。
本記事では、macOS、Windows、Linux それぞれに最適な PHP 開発環境の構築方法を、初心者の方にもわかりやすく解説していきます。Docker を使った統一的な方法から、各 OS ネイティブな環境構築まで、あなたのニーズに合った最適解が見つかるはずです。
背景
PHP 開発環境に求められる要素
PHP でアプリケーションを開発するには、いくつかの必須コンポーネントが必要になります。まず PHP 本体はもちろん、Web サーバー、データベース、そして快適な開発を支援するツール群です。
これらを適切に組み合わせることで、ローカル環境で効率的に開発を進められます。ただし、OS によってインストール方法や推奨される構成が異なるため、自分の環境に合った選択が重要になってきますね。
OS ごとの環境構築の違い
開発環境の構築方法は OS によって大きく異なります。macOS では Homebrew を使ったパッケージ管理が主流ですし、Windows では WSL2 や XAMPP などの選択肢があるでしょう。Linux ではディストリビューションごとのパッケージマネージャーを活用できます。
それぞれの OS には特性があり、その特性を活かした環境構築が最も効率的です。一方で、Docker を使えば OS の違いを吸収した統一的な環境も実現できます。
以下の図は、各 OS における PHP 開発環境の主要コンポーネントの関係を示しています。
mermaidflowchart TB
dev["開発者"] --> os_choice{"OS 選択"}
os_choice -->|macOS| mac["Homebrew ベース"]
os_choice -->|Windows| win["WSL2 / XAMPP"]
os_choice -->|Linux| linux["APT / YUM ベース"]
os_choice -->|すべて| docker["Docker ベース"]
mac --> components1["PHP + Nginx + MySQL"]
win --> components2["PHP + Apache + MySQL"]
linux --> components3["PHP + Nginx + PostgreSQL"]
docker --> components4["コンテナ化された<br/>統一環境"]
components1 --> app["Web アプリケーション"]
components2 --> app
components3 --> app
components4 --> app
図で理解できる要点
- OS ごとに最適な構築方法が異なる
- Docker を使えば OS の違いを吸収できる
- 最終的にはすべて同じ Web アプリケーション開発につながる
課題
環境構築における一般的な課題
PHP 開発環境を構築する際、多くの開発者が直面する課題があります。まず「どのツールを選べばいいのか分からない」という選択の問題です。XAMPP、MAMP、Docker、ネイティブインストールなど、選択肢が多すぎて迷ってしまいますね。
次に「OS ごとに手順が違いすぎる」という問題があります。macOS で動いた手順が Windows では通用しないことも多く、チーム開発では環境差異がトラブルの原因になることもあるでしょう。
バージョン管理とポータビリティ
プロジェクトごとに異なる PHP バージョンが必要になることも珍しくありません。PHP 7.4 で動くレガシープロジェクトと、PHP 8.3 を使う新規プロジェクトを同時に扱うケースもあるでしょう。
また、ローカル環境と本番環境で動作が異なる「私の環境では動くのに...」問題も頻発します。これらの課題を解決するには、適切なツールと方法論の選択が欠かせません。
以下の図は、開発環境構築時に発生しがちな課題とその影響範囲を示しています。
mermaidflowchart LR
issues["環境構築の課題"] --> choice["ツール選択の迷い"]
issues --> diff["OS 間の手順差異"]
issues --> version["バージョン管理"]
issues --> portability["環境差異問題"]
choice --> time_loss["構築時間の増加"]
diff --> team_issues["チーム開発の障壁"]
version --> conflict["依存関係の衝突"]
portability --> bugs["本番環境との<br/>動作差異"]
time_loss --> productivity["生産性低下"]
team_issues --> productivity
conflict --> productivity
bugs --> productivity
図で理解できる要点
- 複数の課題が相互に影響し合っている
- 最終的にはすべて開発生産性の低下につながる
- 適切な解決策の選択が重要
解決策
OS 別最適解の選択基準
各 OS に最適な PHP 開発環境を構築するには、以下の基準で方法を選ぶと良いでしょう。
| # | 基準 | 内容 |
|---|---|---|
| 1 | 学習コスト | 初心者でも理解しやすいか |
| 2 | 柔軟性 | バージョン切り替えやカスタマイズが容易か |
| 3 | パフォーマンス | ネイティブに近い速度で動作するか |
| 4 | 移植性 | 他の環境への移行が容易か |
| 5 | コミュニティ | 情報が豊富で問題解決しやすいか |
これらの基準を踏まえて、各 OS での最適解をご紹介していきます。まず全 OS で共通して使える Docker ベースの環境から見ていきましょう。
Docker による統一環境(全 OS 対応)
Docker を使えば、OS の違いを気にせず同じ環境を構築できます。チーム開発や本番環境との一致を重視する場合に特におすすめですね。
以下の図は、Docker を使った PHP 開発環境のアーキテクチャを示しています。
mermaidflowchart TB
host["ホスト OS<br/>(macOS/Windows/Linux)"]
subgraph docker_env["Docker 環境"]
compose["docker-compose.yml"]
subgraph containers["コンテナ群"]
php["PHP コンテナ<br/>(PHP-FPM)"]
web["Web サーバー<br/>(Nginx/Apache)"]
db["DB コンテナ<br/>(MySQL/PostgreSQL)"]
redis["Redis コンテナ"]
end
end
host -->|Docker Desktop| docker_env
compose --> php
compose --> web
compose --> db
compose --> redis
web -->|FastCGI| php
php -->|SQL| db
php -->|Cache| redis
図で理解できる要点
- ホスト OS に依存しない統一環境
- docker-compose で複数コンテナを一元管理
- 各コンテナが独立して動作し、相互連携する
まず、docker-compose.yml を作成します。この設定ファイルで、PHP、Web サーバー、データベースの構成を定義していきます。
yamlversion: '3.8'
services:
# PHP-FPM コンテナの設定
php:
image: php:8.3-fpm
container_name: php_app
volumes:
- ./src:/var/www/html
networks:
- app_network
次に、Web サーバーとデータベースの設定を追加します。
yaml# Nginx Web サーバーの設定
nginx:
image: nginx:alpine
container_name: nginx_server
ports:
- '8080:80'
volumes:
- ./src:/var/www/html
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
depends_on:
- php
networks:
- app_network
# MySQL データベースの設定
mysql:
image: mysql:8.0
container_name: mysql_db
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: app_db
MYSQL_USER: appuser
MYSQL_PASSWORD: apppass
ports:
- '3306:3306'
volumes:
- mysql_data:/var/lib/mysql
networks:
- app_network
最後に、ネットワークとボリュームの定義を追加します。
yaml# ネットワーク設定
networks:
app_network:
driver: bridge
# 永続化ボリューム設定
volumes:
mysql_data:
driver: local
Nginx の設定ファイル(nginx/default.conf)も作成しましょう。この設定で PHP-FPM と連携させます。
nginxserver {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
# PHP ファイルへのリクエスト処理
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# 静的ファイルの処理
location / {
try_files $uri $uri/ /index.php?$query_string;
}
}
環境を起動するには、以下のコマンドを実行します。
bash# コンテナをバックグラウンドで起動
docker-compose up -d
# 起動状態を確認
docker-compose ps
# ログを確認
docker-compose logs -f
これで http://localhost:8080 で PHP アプリケーションにアクセスできるようになります。コンテナの停止や削除も簡単に行えますね。
bash# コンテナを停止
docker-compose stop
# コンテナを停止して削除
docker-compose down
# ボリュームも含めて完全削除
docker-compose down -v
macOS での環境構築
macOS では Homebrew を使った環境構築が最もスムーズです。Apple Silicon(M1/M2/M3)でも Intel Mac でも同じ手順で進められます。
まず Homebrew がインストールされていない場合は、公式サイトの指示に従ってインストールしてください。Homebrew が使える状態になったら、PHP をインストールします。
bash# Homebrew のアップデート
brew update
# PHP 8.3 のインストール
brew install php@8.3
# インストール確認
php -v
PHP がインストールできたら、Web サーバーをセットアップします。macOS では Nginx が軽量で扱いやすいのでおすすめです。
bash# Nginx のインストール
brew install nginx
# Nginx の起動
brew services start nginx
# ブラウザで http://localhost:8080 にアクセスして確認
次に、データベースをインストールします。MySQL と PostgreSQL のどちらでも構いませんが、ここでは MySQL を使います。
bash# MySQL 8.0 のインストール
brew install mysql@8.0
# MySQL の起動
brew services start mysql@8.0
# セキュリティ設定
mysql_secure_installation
PHP と Nginx を連携させるために、Nginx の設定を編集します。設定ファイルは /opt/homebrew/etc/nginx/nginx.conf(Apple Silicon)または /usr/local/etc/nginx/nginx.conf(Intel Mac)にあります。
nginx# PHP ファイルの処理設定を追加
location ~ \.php$ {
root /opt/homebrew/var/www;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
PHP-FPM を起動して、Nginx と連携させます。
bash# PHP-FPM の起動(設定ファイルの場所を確認)
php-fpm -D
# Nginx を再起動して設定を反映
brew services restart nginx
複数のバージョンを管理したい場合は、brew で複数バージョンをインストールして切り替えられます。
bash# PHP 8.2 もインストール
brew install php@8.2
# バージョンの切り替え
brew unlink php@8.3
brew link php@8.2 --force
# 確認
php -v
Composer(PHP のパッケージマネージャー)もインストールしておくと便利です。
bash# Composer のインストール
brew install composer
# インストール確認
composer --version
Windows での環境構築
Windows では WSL2(Windows Subsystem for Linux 2)を使う方法と、XAMPP を使う方法の 2 つが主流です。それぞれの特徴を理解して選びましょう。
WSL2 を使う方法(推奨)
WSL2 を使えば、Windows 上で Linux 環境を動かせます。本番環境が Linux の場合、環境差異を最小限にできるのでおすすめですね。
まず、PowerShell を管理者権限で開いて WSL2 をインストールします。
powershell# WSL のインストール(Ubuntu が既定でインストールされる)
wsl --install
# インストール後、PC を再起動
再起動後、Ubuntu が起動するので、ユーザー名とパスワードを設定します。設定が完了したら、Linux と同じ手順で環境を構築できます。
bash# パッケージリストの更新
sudo apt update
sudo apt upgrade -y
# PHP 8.3 のインストール
sudo apt install -y software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt update
sudo apt install -y php8.3 php8.3-fpm php8.3-mysql php8.3-cli
Web サーバーとして Nginx をインストールします。
bash# Nginx のインストール
sudo apt install -y nginx
# Nginx の起動
sudo service nginx start
# 起動確認
sudo service nginx status
MySQL もインストールして設定します。
bash# MySQL のインストール
sudo apt install -y mysql-server
# MySQL の起動
sudo service mysql start
# セキュリティ設定
sudo mysql_secure_installation
Nginx と PHP-FPM を連携させるために、設定ファイルを編集します。
bash# 設定ファイルを編集
sudo nano /etc/nginx/sites-available/default
以下の設定を追加します。
nginxserver {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
}
location / {
try_files $uri $uri/ =404;
}
}
設定を保存したら、Nginx を再起動します。
bash# 設定のテスト
sudo nginx -t
# Nginx の再起動
sudo service nginx restart
# PHP-FPM の起動
sudo service php8.3-fpm start
WSL2 では、Windows のブラウザから http://localhost でアクセスできます。ファイルは /var/www/html に配置しましょう。
XAMPP を使う方法(初心者向け)
XAMPP は Apache、MySQL、PHP を一括でインストールできるパッケージです。GUI で管理できるので、コマンドラインに慣れていない方に向いています。
公式サイト(https://www.apachefriends.org/)から Windows 用のインストーラーをダウンロードして実行します。インストールウィザードに従って進めるだけで、必要なコンポーネントが揃います。
インストールが完了したら、XAMPP Control Panel を起動します。
| # | サービス | 役割 | 起動方法 |
|---|---|---|---|
| 1 | Apache | Web サーバー | Start ボタンをクリック |
| 2 | MySQL | データベース | Start ボタンをクリック |
| 3 | FileZilla | FTP サーバー(任意) | 必要に応じて起動 |
Apache と MySQL を起動したら、http://localhost にアクセスして動作確認します。PHP ファイルは C:\xampp\htdocs\ に配置すれば実行されます。
簡単な PHP ファイルを作成してテストしてみましょう。
php<?php
// C:\xampp\htdocs\info.php として保存
// PHP の設定情報を表示
phpinfo();
ブラウザで http://localhost/info.php にアクセスすると、PHP の詳細情報が表示されます。これで環境構築は完了です。
Linux での環境構築
Linux ではディストリビューションごとにパッケージマネージャーが異なります。ここでは代表的な Ubuntu/Debian 系と CentOS/RHEL 系の手順を紹介します。
Ubuntu/Debian 系
Ubuntu や Debian では apt パッケージマネージャーを使います。まず、システムを最新の状態にアップデートしましょう。
bash# パッケージリストの更新
sudo apt update
sudo apt upgrade -y
# 必要なツールのインストール
sudo apt install -y software-properties-common
PHP の公式リポジトリを追加して、最新版をインストールします。
bash# PHP リポジトリの追加
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# PHP 8.3 と主要な拡張機能のインストール
sudo apt install -y \
php8.3 \
php8.3-fpm \
php8.3-cli \
php8.3-mysql \
php8.3-pgsql \
php8.3-mbstring \
php8.3-xml \
php8.3-curl \
php8.3-zip
インストールが完了したら、バージョンを確認します。
bash# PHP バージョンの確認
php -v
# インストールされた拡張機能の確認
php -m
Nginx を Web サーバーとしてインストールします。
bash# Nginx のインストール
sudo apt install -y nginx
# Nginx の起動と自動起動設定
sudo systemctl start nginx
sudo systemctl enable nginx
# ステータス確認
sudo systemctl status nginx
データベースは MySQL または PostgreSQL を選択できます。ここでは両方の手順を示します。
bash# MySQL の場合
sudo apt install -y mysql-server
sudo systemctl start mysql
sudo systemctl enable mysql
sudo mysql_secure_installation
# PostgreSQL の場合
sudo apt install -y postgresql postgresql-contrib
sudo systemctl start postgresql
sudo systemctl enable postgresql
Nginx と PHP-FPM を連携させるため、サイト設定ファイルを作成します。
bash# 新しいサイト設定を作成
sudo nano /etc/nginx/sites-available/php_app
以下の内容を記述します。
nginxserver {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
# アクセスログとエラーログの設定
access_log /var/log/nginx/php_app_access.log;
error_log /var/log/nginx/php_app_error.log;
# PHP ファイルの処理
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
# 静的ファイルの処理
location / {
try_files $uri $uri/ =404;
}
# .htaccess などの隠しファイルへのアクセスを拒否
location ~ /\.ht {
deny all;
}
}
設定ファイルを有効化して、Nginx を再起動します。
bash# シンボリックリンクを作成して設定を有効化
sudo ln -s /etc/nginx/sites-available/php_app /etc/nginx/sites-enabled/
# デフォルト設定を無効化(任意)
sudo rm /etc/nginx/sites-enabled/default
# 設定のテスト
sudo nginx -t
# Nginx を再起動
sudo systemctl restart nginx
# PHP-FPM も再起動
sudo systemctl restart php8.3-fpm
CentOS/RHEL 系
CentOS や RHEL では yum または dnf パッケージマネージャーを使います。ここでは dnf の例を示します。
bash# システムのアップデート
sudo dnf update -y
# EPEL リポジトリの追加
sudo dnf install -y epel-release
# Remi リポジトリの追加(最新 PHP 用)
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
PHP モジュールを有効化してインストールします。
bash# PHP 8.3 モジュールの有効化
sudo dnf module reset php
sudo dnf module enable php:remi-8.3
# PHP とその拡張機能のインストール
sudo dnf install -y \
php \
php-fpm \
php-cli \
php-mysqlnd \
php-pgsql \
php-mbstring \
php-xml \
php-json \
php-curl \
php-zip
Nginx をインストールして設定します。
bash# Nginx のインストール
sudo dnf install -y nginx
# サービスの起動と自動起動設定
sudo systemctl start nginx
sudo systemctl enable nginx
sudo systemctl start php-fpm
sudo systemctl enable php-fpm
SELinux を使用している場合、Nginx が PHP-FPM と通信できるように設定が必要です。
bash# SELinux の設定(Nginx が PHP-FPM と通信できるようにする)
sudo setsebool -P httpd_can_network_connect 1
sudo setsebool -P httpd_execmem 1
# ファイアウォールで HTTP を許可
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --reload
Nginx の設定ファイルを編集します。
bash# 設定ファイルの編集
sudo nano /etc/nginx/conf.d/php_app.conf
以下の内容を記述します。
nginxserver {
listen 80;
server_name _;
root /usr/share/nginx/html;
index index.php index.html;
location ~ \.php$ {
fastcgi_pass unix:/run/php-fpm/www.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location / {
try_files $uri $uri/ =404;
}
}
設定を反映させて再起動します。
bash# 設定のテスト
sudo nginx -t
# サービスの再起動
sudo systemctl restart nginx
sudo systemctl restart php-fpm
具体例
シンプルな PHP アプリケーションの作成
環境構築が完了したら、実際に動作する PHP アプリケーションを作成してみましょう。ここでは、データベースに接続して情報を表示する簡単な例を紹介します。
まず、プロジェクトのディレクトリ構成を確認します。
bash/var/www/html/
├── index.php # メインページ
├── config.php # データベース設定
├── database.php # データベース接続クラス
└── users.php # ユーザー情報表示ページ
データベース接続の設定ファイル(config.php)を作成します。
php<?php
// config.php - データベース接続設定
// データベース接続情報
define('DB_HOST', 'localhost');
define('DB_NAME', 'app_db');
define('DB_USER', 'appuser');
define('DB_PASS', 'apppass');
define('DB_CHARSET', 'utf8mb4');
// アプリケーション設定
define('APP_NAME', 'PHP Sample App');
define('DEBUG_MODE', true);
// エラー表示設定(開発環境)
if (DEBUG_MODE) {
ini_set('display_errors', 1);
error_reporting(E_ALL);
}
次に、データベース接続を管理するクラス(database.php)を作成します。
php<?php
// database.php - データベース接続クラス
require_once 'config.php';
class Database {
private $connection;
/**
* コンストラクタ - データベースに接続
*/
public function __construct() {
try {
// DSN (Data Source Name) の構築
$dsn = sprintf(
'mysql:host=%s;dbname=%s;charset=%s',
DB_HOST,
DB_NAME,
DB_CHARSET
);
// PDO オプションの設定
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
// PDO インスタンスの作成
$this->connection = new PDO($dsn, DB_USER, DB_PASS, $options);
} catch (PDOException $e) {
// 接続エラーの処理
die('データベース接続エラー: ' . $e->getMessage());
}
}
データベース操作のメソッドを追加します。
php /**
* SELECT クエリを実行して結果を取得
*
* @param string $query SQL クエリ
* @param array $params バインドするパラメータ
* @return array クエリ結果
*/
public function query($query, $params = []) {
try {
$stmt = $this->connection->prepare($query);
$stmt->execute($params);
return $stmt->fetchAll();
} catch (PDOException $e) {
if (DEBUG_MODE) {
die('クエリエラー: ' . $e->getMessage());
}
return [];
}
}
/**
* INSERT/UPDATE/DELETE クエリを実行
*
* @param string $query SQL クエリ
* @param array $params バインドするパラメータ
* @return bool 成功時 true、失敗時 false
*/
public function execute($query, $params = []) {
try {
$stmt = $this->connection->prepare($query);
return $stmt->execute($params);
} catch (PDOException $e) {
if (DEBUG_MODE) {
die('実行エラー: ' . $e->getMessage());
}
return false;
}
}
}
トップページ(index.php)を作成します。
php<?php
// index.php - メインページ
require_once 'config.php';
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?php echo APP_NAME; ?></title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
h1 {
color: #333;
border-bottom: 3px solid #4CAF50;
padding-bottom: 10px;
}
ページの本文を追加します。
php .info-box {
background: #e8f5e9;
padding: 15px;
border-left: 4px solid #4CAF50;
margin: 20px 0;
}
.link-button {
display: inline-block;
padding: 10px 20px;
background: #4CAF50;
color: white;
text-decoration: none;
border-radius: 4px;
margin-top: 10px;
}
.link-button:hover {
background: #45a049;
}
</style>
</head>
<body>
<div class="container">
<h1><?php echo APP_NAME; ?></h1>
<div class="info-box">
<h2>環境情報</h2>
<p><strong>PHP バージョン:</strong> <?php echo phpversion(); ?></p>
<p><strong>サーバー:</strong> <?php echo $_SERVER['SERVER_SOFTWARE'] ?? 'Unknown'; ?></p>
<p><strong>ドキュメントルート:</strong> <?php echo $_SERVER['DOCUMENT_ROOT']; ?></p>
</div>
<a href="users.php" class="link-button">ユーザー一覧を見る</a>
</div>
</body>
</html>
最後に、データベースからユーザー情報を取得して表示するページ(users.php)を作成します。
php<?php
// users.php - ユーザー情報表示ページ
require_once 'config.php';
require_once 'database.php';
// データベース接続
$db = new Database();
// テーブルが存在しない場合は作成
$createTable = "
CREATE TABLE IF NOT EXISTS users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
";
$db->execute($createTable);
// サンプルデータが存在しない場合は挿入
$checkData = "SELECT COUNT(*) as count FROM users";
$result = $db->query($checkData);
if ($result[0]['count'] == 0) {
$sampleUsers = [
['田中太郎', 'tanaka@example.com'],
['佐藤花子', 'sato@example.com'],
['鈴木一郎', 'suzuki@example.com'],
];
foreach ($sampleUsers as $user) {
$db->execute(
"INSERT INTO users (name, email) VALUES (?, ?)",
$user
);
}
}
ユーザーデータを取得して表示します。
php// ユーザーデータの取得
$users = $db->query("SELECT * FROM users ORDER BY id");
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ユーザー一覧 - <?php echo APP_NAME; ?></title>
<style>
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background: white;
padding: 30px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
th, td {
padding: 12px;
text-align: left;
border-bottom: 1px solid #ddd;
}
th {
background-color: #4CAF50;
color: white;
}
tr:hover {
background-color: #f5f5f5;
}
</style>
</head>
<body>
<div class="container">
<h1>ユーザー一覧</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>名前</th>
<th>メールアドレス</th>
<th>登録日時</th>
</tr>
</thead>
<tbody>
<?php foreach ($users as $user): ?>
<tr>
<td><?php echo htmlspecialchars($user['id']); ?></td>
<td><?php echo htmlspecialchars($user['name']); ?></td>
<td><?php echo htmlspecialchars($user['email']); ?></td>
<td><?php echo htmlspecialchars($user['created_at']); ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<p style="margin-top: 20px;">
<a href="index.php">トップページに戻る</a>
</p>
</div>
</body>
</html>
デバッグとトラブルシューティング
開発中によく発生するエラーとその解決方法を紹介します。
エラー: Error 500: Internal Server Error
このエラーは PHP のスクリプトエラーが原因で発生することが多いです。まず、エラーログを確認しましょう。
bash# Nginx のエラーログを確認(Ubuntu/Debian)
sudo tail -f /var/log/nginx/error.log
# Apache のエラーログを確認(XAMPP/Windows)
# C:\xampp\apache\logs\error.log を確認
# PHP-FPM のログを確認
sudo tail -f /var/log/php8.3-fpm.log
発生条件:
- PHP の構文エラー
- require/include するファイルが見つからない
- PHP の拡張機能が不足している
解決方法:
- エラーログで具体的なエラーメッセージを確認する
- PHP の構文エラーがあれば修正する
- 不足している拡張機能をインストールする
bash# 不足している拡張機能のインストール例
sudo apt install php8.3-mbstring php8.3-xml php8.3-curl
sudo systemctl restart php8.3-fpm
エラー: PDOException: SQLSTATE[HY000] [2002] Connection refused
データベースに接続できない場合に発生します。
エラーメッセージ:
lessFatal error: Uncaught PDOException: SQLSTATE[HY000] [2002] Connection refused
in /var/www/html/database.php:25
発生条件:
- データベースサーバーが起動していない
- 接続情報(ホスト、ポート、ユーザー名、パスワード)が間違っている
- ファイアウォールでポートがブロックされている
解決方法:
bash# 1. MySQL が起動しているか確認
sudo systemctl status mysql
# 起動していない場合は起動
sudo systemctl start mysql
# 2. 接続情報が正しいか確認
mysql -u appuser -p app_db
# 3. ユーザーとデータベースを作成(存在しない場合)
sudo mysql -u root -p
MySQL コンソールで以下を実行します。
sql-- データベースの作成
CREATE DATABASE IF NOT EXISTS app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- ユーザーの作成と権限付与
CREATE USER IF NOT EXISTS 'appuser'@'localhost' IDENTIFIED BY 'apppass';
GRANT ALL PRIVILEGES ON app_db.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
-- 確認
SHOW DATABASES;
SELECT User, Host FROM mysql.user WHERE User = 'appuser';
エラー: Fatal error: Call to undefined function mysqli_connect()
MySQL 拡張機能がインストールされていない場合に発生します。
解決方法:
bash# mysqli 拡張機能のインストール
sudo apt install php8.3-mysql
# または PDO MySQL ドライバ
sudo apt install php8.3-pdo-mysql
# PHP-FPM を再起動
sudo systemctl restart php8.3-fpm
# 拡張機能が有効になったか確認
php -m | grep -i mysql
パフォーマンス最適化
開発環境でも快適に動作させるための設定です。
PHP の設定(/etc/php/8.3/fpm/php.ini)を最適化します。
ini; メモリ制限を増やす
memory_limit = 256M
; アップロードファイルサイズの上限
upload_max_filesize = 64M
post_max_size = 64M
; 実行時間の上限
max_execution_time = 300
; OPcache を有効化(パフォーマンス向上)
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.revalidate_freq=2
設定を変更したら、PHP-FPM を再起動します。
bash# 設定の再読み込み
sudo systemctl restart php8.3-fpm
# OPcache の状態確認用 PHP ファイル
echo '<?php phpinfo(); ?>' | sudo tee /var/www/html/phpinfo.php
まとめ
PHP 開発環境の構築方法を、macOS、Windows、Linux それぞれの OS に最適化した形でご紹介しました。Docker を使えば OS の違いを吸収した統一環境を作れますし、各 OS ネイティブな方法でもしっかりとした環境を構築できます。
重要なポイントをまとめると、以下のようになりますね。
環境構築の選択肢
- Docker: すべての OS で統一環境、チーム開発や本番環境との一致を重視する場合に最適
- macOS: Homebrew を使ったネイティブインストールが軽量で管理しやすい
- Windows: WSL2 で Linux 環境を使う方法と、XAMPP で GUI 管理する方法から選択
- Linux: apt/dnf などのパッケージマネージャーで柔軟に構成可能
環境構築後の確認事項
- PHP バージョンと必要な拡張機能が揃っているか
- Web サーバー(Nginx/Apache)が正常に起動しているか
- データベースに接続できるか
- エラーログの場所を把握しているか
環境構築は一度しっかりと整えれば、その後の開発がとてもスムーズになります。最初は手順が多くて大変に感じるかもしれませんが、一つずつ確実に進めていけば必ず動作する環境が作れるでしょう。
また、開発中にエラーが発生したときは、エラーメッセージとログファイルが最も重要な手がかりになります。焦らず、エラー内容を正確に把握して対処していけば、ほとんどの問題は解決できますよ。
これで、あなたの環境に合った PHP 開発環境が整ったはずです。快適な PHP 開発をお楽しみください。
関連リンク
articlePHP 開発環境の作り方【完全ガイド】:macOS/Windows/Linux 別最適解
articlePHP とは?2025 年版の特徴・強み・できることを徹底解説【保存版】
articleCodeIgniterで接続しているデータベースにPHPからテーブルを作成するサンプルコード
article「Codeigniter」トラックバック受信処理について使い方とサンプル
articlePHPでフォーム送信時のCAPTCHA(画像認証) を簡単に設置できる「Securimage」の使い方とサンプル
articlePHPから日本語のメールを送信するやり方
articleNano Banana とは?ゼロからわかる特徴・できること・向いている用途【2025 年版】
articlePHP 開発環境の作り方【完全ガイド】:macOS/Windows/Linux 別最適解
articleNotebookLM 情報設計のベストプラクティス:ソース粒度・タグ・命名規則
articleRedis 監視と可観測性:Prometheus Exporter と Grafana の実践ダッシュボード
articleNode.js で ESM の `ERR_MODULE_NOT_FOUND` を解く:解決策総当たりチェックリスト
articleReact 開発環境の作り方:Vite + TypeScript + ESLint + Prettier 完全セットアップ
blogiPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
blogGoogleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
blog【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
blogGoogleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
blogPixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
blogフロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
review今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
reviewついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
review愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
review週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
review新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
review科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来