インフラ・運用 2026.07.03

本番サーバーのPHPバージョンを上げたらサイトが壊れた話

約13分で読めます

「更新したらサイトが真っ白になった」は現場でよく起きる悲劇です。テスト環境なしのPHPアップデートが招くリスクと、安全な更新手順を実案件ベースで解説します。

こんな状況、心当たりありませんか?

サーバー管理会社から「PHP 7.4のサポートが終了します。バージョンアップを推奨します」という通知メールが届いた。セキュリティのためにも早めに対応しなければ、と思い立ってその日の夜に本番サーバーのPHPを8.1に更新した。

そして翌朝、サイトが真っ白——。

お問い合わせフォームも動かない。管理画面にもログインできない。営業時間が始まってから問い合わせが届き始めて、パニックになる。

これは決して珍しい話ではありません。Fivenineでも過去に「他社で急にバージョンアップされてしまって…」というご相談を何件も受けています。PHPのメジャーバージョンアップは、一見すると単純な作業に見えて、実は非常に影響範囲が広い変更です。このページでは、なぜテスト環境が必要なのか、そして安全に更新するための具体的な手順を解説します。


なぜPHPバージョンアップでサイトが壊れるのか

PHPは「後方互換性」を意図的に捨てることがある

PHP 7系から8系へのアップグレードは特に破壊的な変更が多く、開発者の間では「マイグレーションの鬼門」とも呼ばれています。具体的にどのような変更があるかというと——

PHP 8.0での主な破壊的変更(一例)

  • array_key_exists() の第2引数にオブジェクトを渡すと型エラー
  • 数値文字列の比較演算の挙動変更(0 == 'foo'false に)
  • 非推奨だった関数群(create_function() など)の完全削除
  • 引数の型チェックが厳格化され、型の不一致でエラーが発生しやすくなった

PHP 8.1での追加変更

  • null を非null型の変数に渡すと Deprecated 警告(将来的にエラー)
  • fsync() などの新関数追加と既存関数の動作変更
  • readonly プロパティの導入による一部ライブラリとの競合

これらの変更は、長年動いていたコードを「突然動かなくなるコード」に変えてしまいます。特にWordPressの古いプラグインやLaravelの旧バージョン、自社開発の独自システムは影響を受けやすい傾向があります。


サーバー・インフラでお困りですか?

障害対応・移行・パフォーマンスチューニングなど、ご相談ください

無料で相談する

実案件から学ぶ:ステージング環境があれば防げた事故

あるクライアント(神奈川県内の製造業、WordPressで製品紹介サイトを運営)から連絡が入ったのは、本番サーバーのPHPを7.4から8.2に更新した直後でした。症状は以下のとおりです。

  • トップページは表示されるが、製品一覧ページが500エラー
  • カスタムフィールドを表示するプラグイン「Advanced Custom Fields(無料版)」が動作しない
  • お問い合わせフォームプラグインのメール送信が停止

原因を調査したところ、ACFの古いバージョンがPHP 8.xの型チェック厳格化に対応していなかったことが判明しました。また、フォームプラグインが依存していた関数がPHP 8.2で挙動変更されており、そこでも問題が発生していました。

復旧にかかった時間は約4時間。その間、問い合わせページにアクセスできない状態が続きました。

もし事前にステージング環境で同じ手順を試していれば、この問題はリリース前に発見できていました。対処も「本番が落ちた状態での作業」ではなく、落ち着いた状態でのテストとして完結できたはずです。


安全なPHPバージョンアップの具体的な手順

ステップ1:ステージング環境を用意する

まず本番と同等の環境を別途用意します。多くのレンタルサーバー(エックスサーバー、ConoHa WINGなど)はコントロールパネルからPHPバージョンを切り替えられるため、ステージングサブドメインを作成してそこで検証するのが現実的です。

Dockerを使えるエンジニアがいる場合は、ローカル環境で先行テストするのも有効です。

# docker-compose.yml
version: '3.8'
services:
  php81:
    image: php:8.1-apache
    ports:
      - "8081:80"
    volumes:
      - ./src:/var/www/html
  php82:
    image: php:8.2-apache
    ports:
      - "8082:80"
    volumes:
      - ./src:/var/www/html

docker compose up -d で両バージョンを同時に立ち上げ、同じコードベースで動作比較できます。

ステップ2:PHP互換性チェックツールで事前スキャン

コードを目視で確認するのは限界があります。PHP_CodeSniffer + PHPCompatibility というツールを使うと、対象バージョンで問題になるコードを自動検出できます。

# Composerでインストール
composer require --dev squizlabs/php_codesniffer
composer require --dev phpcompatibility/php-compatibility

# PHP 8.1の互換性チェックを実行
./vendor/bin/phpcs \
  --standard=PHPCompatibility \
  --runtime-set testVersion 8.1 \
  -r ./wp-content/themes/your-theme/ \
  --extensions=php

出力例:

FOUND 3 ERRORS AFFECTING 2 FILES
-------------------------------------------------------
 functions.php:142 | ERROR | Function create_function() is removed in PHP 8.0
 custom-post.php:87 | ERROR | Passing null to non-nullable parameter deprecated in PHP 8.1

このようにエラーが特定できれば、修正箇所が明確になります。

ステップ3:ステージングでバージョン切り替えと動作確認

ツールでのスキャン後、ステージング環境でPHPバージョンを切り替えて実際に動作確認します。確認すべき項目はシステムによって異なりますが、最低限以下は必ずチェックしてください。

  • トップページの表示
  • 主要な内部リンクページの表示
  • フォーム送信(実際に送信テストを行う)
  • 管理画面へのログインと各種操作
  • ECサイトであれば決済フロー全体
  • 外部サービス連携(メール送信、API連携など)

エラーが出た場合は、PHPのエラーログを確認します。

# エラーログの確認(サーバーのパスは環境により異なる)
tail -n 50 /var/log/php/error.log

# またはWordPressならwp-config.phpでデバッグを有効化
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );  // /wp-content/debug.logに記録
define( 'WP_DEBUG_DISPLAY', false );  // 画面には表示しない

ステップ4:本番更新前にバックアップを取得し、メンテナンスモードへ

ステージングで問題なければ、本番に適用します。ただし更新前後のバックアップは必須です。

# データベースのバックアップ(WordPressの場合)
mysqldump -u dbuser -p dbname > backup_$(date +%Y%m%d_%H%M%S).sql

# ファイルのバックアップ
tar czf site_backup_$(date +%Y%m%d).tar.gz /var/www/html/

WordPressであればメンテナンスプラグインを使い、作業中はユーザーに「メンテナンス中」画面を表示する配慮も忘れずに。


よくある失敗パターンと対処法

バージョンを戻せば動作は復旧しますが、**問題の根本解決にはなりません**。次のサポート終了期限までに必ず対応が必要で、先送りにするほど対応コストは増えます。また、バージョンを戻す操作自体でデータ破損するケースも稀にあります。復旧はあくまで緊急措置として、計画的な移行を進めましょう。
更新が止まっているプラグインや、有料版のみPHP8対応しているプラグインも存在します。更新前に各プラグインの「テスト済み最新バージョン」を確認する習慣をつけてください。WordPressの管理画面 > プラグイン一覧で確認できます。
PHP Fatal Errorが発生すると、WordPressは何も表示しない「白画面(WSOD)」になります。`WP_DEBUG_LOG` を有効にして `/wp-content/debug.log` を確認するか、phpのerror_logを直接確認する必要があります。本番で突然発生した場合は焦らず、まずログを確認することが先決です。
環境変数、php.iniの設定、インストール済みの拡張モジュールがステージングと本番で違う場合に起きます。`phpinfo()` の出力を両環境で比較して差分を確認してください。特に `mbstring`、`gd`、`curl`、`pdo_mysql` などの拡張が有効かどうかは要チェックです。

まとめ:「更新前のひと手間」がサイトを守る

PHPのバージョンアップ自体は避けて通れない作業です。セキュリティ的には古いPHPを使い続けることのほうが危険であり、サポート切れのバージョンは脆弱性が修正されなくなります。

問題は「更新する/しない」ではなく、**「どのように更新するか」**です。ステージング環境での事前検証というひと手間が、本番サイトの停止という最大のリスクを防ぎます。

Fivenineでは、お客様のサーバー環境を調査したうえで、ステージング環境の構築から動作確認・本番適用まで一括してサポートしています。「自分では判断できない」「エラーが出て対処できない」という方は、ぜひご相談ください。


サーバー・インフラでお困りですか?

障害対応・移行・パフォーマンスチューニングなど、ご相談ください

無料で相談する

サーバー管理、丸ごとお任せください

サーバー保守・運用

監視・障害対応・パフォーマンス改善まで、安定稼働をサポートします

200件以上の制作実績 顧客満足度97% 初回相談無料

※ 通常1営業日以内にご返信します

PHPバージョンアップ 安全手順チェックリスト

この記事をシェア

サーバー・インフラの課題を解決します

構築・移行・監視・障害対応まで、安定した運用環境をご提供します。 初回相談は無料です。

※ 1営業日以内にご返信いたします

この技術でお困りなら

無料でプロに相談できます

相談する
AIに無料相談