T-CREATOR

PHP 開発環境の作り方【完全ガイド】:macOS/Windows/Linux 別最適解

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 を起動します。

#サービス役割起動方法
1ApacheWeb サーバーStart ボタンをクリック
2MySQLデータベースStart ボタンをクリック
3FileZillaFTP サーバー(任意)必要に応じて起動

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 の拡張機能が不足している

解決方法:

  1. エラーログで具体的なエラーメッセージを確認する
  2. PHP の構文エラーがあれば修正する
  3. 不足している拡張機能をインストールする
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 開発をお楽しみください。

関連リンク