PHP開発とは、サーバー側でHTMLやJSONを組み立て、データベースと連携してWebの機能を作る作業です。この記事では、PHPで作れるものと向かない処理を整理したうえで、2026年10月時点のサポート期限に沿ったバージョンの選び方、手元で動かすまでの環境構築、SQLインジェクションとXSSを防ぐ最小コード、Laravel・Symfony・CakePHPの選び方、システム開発として運用に乗せるまでの手順を順に説明します。コード例はPHP 8.5.8で実行して出力を確かめています。
まとめ
- PHPはWebのサーバー側を作る言語です。サーバー側の言語が判明しているWebサイトの69.7%がPHPを使っています(W3Techs、2026年10月11日時点)。業務システム、会員制サイト、API、WordPressのようなCMSまで作れます。
- 新規開発はPHP 8.5、依存ライブラリの都合があれば8.4を選びます。8.4のアクティブサポートは2026年12月31日に終わり、8.5は2027年12月31日まで続きます。
- 最初の一歩はビルトインサーバーで足ります。
php -Sで動かし、依存はComposerで管理し、チーム開発に入る段階でDockerに揃えます。 - 安全な書き方は最初から:SQLはプリペアドステートメントで、出力は
htmlspecialchars()で処理します。PHP 7.0で削除された旧mysql拡張を使う古いサンプルは写しません。 - フレームワークはLaravelが第一候補です。現行のLaravel 13はPHP 8.3以上が必要です。長期保守の基幹系はSymfony 7.4 LTS、規約に沿って堅実に作るならCakePHP 5を検討します。
- システム開発では静的解析・テスト・CIを着手時に入れます。外注する場合は、PHPとフレームワークの版、サポート期限、更新を誰が担うかを契約前に決めておきます。
PHPで作れるものと向かない処理
PHPはブラウザからのリクエストを受け取り、データベースを読み書きして、HTMLやJSONを返す処理を得意とします。画面側のJavaScriptと組み合わせて、1つのWebサービスになります。
PHPで作れるシステムと採用実績
コーポレートサイトの問い合わせフォーム、会員登録・予約・決済を伴うWebアプリ、受発注や在庫管理などの業務システム、スマホアプリが呼び出すWeb API、CMSまで、Webを介するシステムの大半はPHPで作れます。W3Techsの集計では、サーバー側の言語が判明しているWebサイトの69.7%がPHPで、2位のJavaScript(7.7%)を大きく引き離しています。この数字を押し上げているのがWordPressです。W3TechsのWordPressの項目では、CMSが判明しているサイトの58.6%がWordPressを使っています。Wikipediaを動かすMediaWikiもPHP製です。
採用面の利点は、レンタルサーバーからクラウドまで実行環境の選択肢が多いことと、エンジニアの層が厚いことです。開発会社の変更や社内への引き継ぎに備え、採用するフレームワークの経験者を確保できるか、設計資料とテストを引き継げるかを確認します。
PHPを避けたい処理と組み合わせる言語
PHPは1リクエストごとに処理を終える実行モデルが基本です。そのため、数万の常時接続を保つチャット基盤や、CPUを数分〜数時間占有する数値計算・機械学習の学習処理は向きません。こうした部分はGo・Node.js・Pythonで別サービスにし、PHPはそれを呼び出す業務ロジックと画面側に専念させる構成が素直です。全部をPHPに寄せる判断も、全部を他言語に置き換える判断も避け、処理の性質で切り分けます。
PHPが「嫌われる」と言われてきた理由
PHPへの批判としてよく挙がるのは、関数名や引数の順序に統一感がないことと、入力値をSQL文に直接連結するような危険なサンプルコードが今も検索で見つかることです。後者の代表例が旧mysql拡張で、PHP 7.0の移行ガイドにあるとおり、7.0で本体から削除されました。関数名の不統一は互換性を保つために残っているもので、フレームワークを使えば日常的に触れる場面は限られます。
現在のPHPは、引数・戻り値・プロパティの型宣言、declare(strict_types=1) による厳密な型チェック、列挙型(enum)を備えています。検索で見つけたサンプルに mysql_query() が出てきたら、PHP 7.0で削除された旧APIを使うサンプルなので、現在の開発には転用しないでください。
PHPのバージョン選びとサポート期限
PHPは毎年11〜12月に新しいマイナー版が出て、各版はリリースから2年間のアクティブサポート(バグ修正とセキュリティ修正)と、その後2年間のセキュリティ修正のみの期間を経て終了します。php.netのサポート表をもとにまとめると、2026年10月時点では次のとおりです。
| 版 | リリース日 | アクティブサポート | セキュリティ修正 |
|---|---|---|---|
| 8.5 | 2025-11-20 | 2027-12-31まで | 2029-12-31まで |
| 8.4 | 2024-11-21 | 2026-12-31まで | 2028-12-31まで |
| 8.3 | 2023-11-23 | 終了 | 2027-12-31まで |
| 8.2 | 2022-12-08 | 終了 | 2026-12-31まで |
8.5系の最新パッチは2026年9月24日公開の8.5.11です(php.netのリリース情報)。次の8.6は2026年10月8日にテスト版の8.6.0 RC3が出た段階で、php.netの告知は本番での利用を控えるよう求めています。新規開発は8.5を選び、使いたいライブラリが8.5に未対応のときだけ8.4にします。8.2で動いている既存システムは2026年12月31日でセキュリティ修正も止まるため、年内に8.4以上へ上げる計画が必要です。
各版で何が変わったかは、PHP 8.5の変更点と新機能まとめ|リリース日・主要機能・非推奨と移行ポイントとPHP 8.4の新機能と変更点|プロパティフック・配列検索関数・非推奨対応を実行結果で確認で実行結果つきで扱っています。
PHP開発環境の構築手順
PHP開発環境は「PHP本体+Webサーバー+データベース」で成り立ちます。学習や小さな検証はPHP本体だけで始められ、チームで同じ環境を共有する段階でDockerに移るのが無理のない順序です。
PHP本体の導入とビルトインサーバーの起動
PHPにはWebサーバーが組み込まれており、ApacheやNginxを入れなくても php -S でブラウザから確認できます。macOSならHomebrew、Windowsなら公式のWindows版バイナリやLaravel Herdなどで本体を入れたら、次の2つのコマンドで動作を確かめます。
# 入っているPHPの版を確認する
php -v
# 新しい作業ディレクトリ内で公開用ディレクトリを作成する
mkdir public
# publicディレクトリを公開して起動する(開発専用)
php -S 127.0.0.1:8000 -t public
このビルトインサーバーは開発用です。PHPマニュアルには「It should not be used on a public network.」と警告があり、本番では使いません。
Composerによる依存ライブラリの管理
Composerは、フレームワークやライブラリの版を composer.json に宣言し、composer.lock で全員が同じ版を再現するための依存管理ツールです。現行は2026年8月27日公開の2.10.3です。現在のPHP開発はComposerを前提に回るため、PHP本体の次に入れます。
# Laravelのプロジェクトを作る
composer create-project laravel/laravel example-app
cd example-app
# ライブラリを追加する
composer require guzzlehttp/guzzle
# composer.lockどおりに一括インストールする(チーム共有・CI向け)
composer install
Docker・Laravel Sailによる開発環境の統一
Dockerを使うと、PHPの版・拡張モジュール・データベースをコンテナとして固定でき、「自分の環境では動く」問題を避けられます。Laravelでは公式のLaravel Sailが compose.yaml を生成してくれます。Laravel 13のSailドキュメントの手順は、既存のプロジェクトにSailを追加する形です。
# Sailを開発用の依存として追加する
composer require laravel/sail --dev
# compose.yamlを生成し、.envに接続情報を書き込む
php artisan sail:install
# コンテナを起動する
./vendor/bin/sail up
Sailの基本コマンドはLaravel Sailとは|sail up・sail downなど基本コマンドの使い方と導入手順で詳しく説明しています。
XAMPP・Laragon・Herdを選ぶ場面
Dockerを入れずにApacheやMySQLまでまとめて動かしたい場合は、オールインワン環境が早道です。XAMPPはWindows・macOS・Linuxに対応し、WindowsではLaragon、macOSとWindowsではLaravel Herdも選べます。いずれも個人の学習には十分です。チームでPHPの版や拡張モジュール、データベースの違いによる不具合が出始めたら、Dockerで構成を共有します。違いはLaragonとは|料金・ライセンスと使い方【v8.6.1対応】とLaravel Herdとは|PHPバージョン切替と.test公開の仕組み・Sailとの使い分けで比べられます。
SQLインジェクションとXSSを防ぐ最小コード
入門記事で最も差が出るのが、データベースに書き込み、それを画面に出す部分です。次のコードは、POSTで受け取った文字列をSQLiteに保存し、一覧を出力するローカル検証用の例です。フォーム画面、入力検証、認証、CSRF対策は含みません。PHP 8.5.8の pdo_sqlite で動作を確かめています。
<?php
declare(strict_types=1);
$pdo = new PDO('sqlite:' . __DIR__ . '/../app.sqlite');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('CREATE TABLE IF NOT EXISTS posts (id INTEGER PRIMARY KEY, title TEXT NOT NULL)');
// 入力値はSQL文に連結せず、プレースホルダで渡す
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$stmt = $pdo->prepare('INSERT INTO posts (title) VALUES (:title)');
$stmt->execute([':title' => (string) ($_POST['title'] ?? '')]);
}
$posts = $pdo->query('SELECT id, title FROM posts ORDER BY id')->fetchAll(PDO::FETCH_ASSOC);
foreach ($posts as $post) {
// 出力時にエスケープしてXSSを防ぐ
echo $post['id'], ': ', htmlspecialchars($post['title']), PHP_EOL;
}
public/index.php として保存し、ビルトインサーバーで起動したうえで、スクリプトタグと、SQLを壊そうとする文字列 x'); DROP TABLE posts; -- を順にPOSTすると、出力は次のようになりました。
1: <script>alert(1)</script>
2: x'); DROP TABLE posts; --
2件目の文字列はSQLとして実行されず、ただの値として保存されています。プレースホルダを使ったことで、入力値がSQL文の一部として解釈されないためです。出力側では < や ' が文字参照に変わり、ブラウザがスクリプトとして実行しません。htmlspecialchars() の既定フラグはPHP 8.1以降 ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401 で、シングルクォートも変換されます。
この2点は、LaravelのクエリビルダーやBladeテンプレートでは標準で行われます。逆に言えば、フレームワークの外で生のSQLを書く場面や、Bladeで {!! !!} を使って未エスケープ出力する場面が、脆弱性の入り口になります。
PHPフレームワークの選定:Laravel・Symfony・CakePHP
ルーティング、データベース操作、認証、CSRF対策といった共通処理をフレームワークに任せると、作るべき業務ロジックに集中できます。国内の実務で候補になるのは主に次の3つで、版と要件はPackagistと各公式サイトで2026年10月11日に確認しました。
| フレームワーク | 現行版 | 必要なPHP | セキュリティ修正の期限 |
|---|---|---|---|
| Laravel 13 | 13.35.0 | 8.3以上 | 2028-03-17 |
| Symfony 8.1 | 8.1.8 | 8.4以上 | 2027年1月 |
| Symfony 7.4(LTS) | 7.4.20 | 8.2以上 | 2029年11月 |
| CakePHP 5 | 5.4.3 | 8.2以上 | 5系の終了日は未公表 |
Laravel 13を第一候補にする理由
Laravelは認証、ジョブキュー、メール、ファイル保存、テストの仕組みを標準で揃えており、少人数でも速く形にできます。Laravelのリリースポリシーでは、メジャー版は毎年1回出て、各版はバグ修正18か月・セキュリティ修正2年です。Laravel 13は2026年3月17日にリリースされ、PHP 8.3〜8.5に対応します。採用版のセキュリティサポート終了日から逆算し、依存パッケージの対応確認と移行テストを含む更新計画を組んでください。版ごとの要件とアップグレードの判断はLaravelの最新バージョンは13|対応PHPバージョン・サポート期限一覧とアップグレード判断にまとめています。
Symfony 7.4 LTSを選ぶ場面
Symfonyは単体で使える部品(コンポーネント)の集まりで、Laravelも内部でSymfonyの部品を多数使っています。Symfonyのリリース情報では、通常版の8.1は2027年1月にサポートが終わる一方、長期サポート版の7.4はバグ修正が2028年11月、セキュリティ修正が2029年11月まで続きます。メジャー更新の頻度を抑えたい基幹系では7.4 LTSが候補です。ただし、2026年10月から5年以上運用するなら、2029年11月のサポート終了前に後継LTSへ移行する計画が必要です。Symfonyの経験がないチームでは、構成や設計方針を決める工数も見積もります。Laravelとの比較では、チームの習熟度と再利用できる実装を判断材料にします。
CakePHP 5を選ぶ場面
CakePHPは「設定より規約」の思想で、命名とディレクトリ構成の型に従えば迷わず組めます。国内での採用実績と日本語情報が多く、既存のCakePHP案件を保守してきたチームが新規開発するときに選ばれます。現行の5.4.3はPHP 8.2以上で動きます。CakePHPのサポート方針では、マイナー版のセキュリティ修正は「5系のサポート終了」か「後続のマイナー版が3つ出る」かの早いほうまでで、4系はセキュリティ修正も2026年9月10日に終わりました。CakePHP 2系・3系で動いている古いシステムは、5系への移行か、Laravelへの作り直しかを費用で比べることになります。
フレームワークを使わない構成が合う場面
数本のスクリプトで済むバッチ処理や、WordPressのプラグイン・テーマ開発では、フレームワークを入れないほうが軽く済みます。ただし、ログイン機能やフォームを持つWebアプリを素のPHPで書くと、前章のエスケープやCSRF対策を全部自分で実装することになります。画面数にかかわらず、認証・権限管理・入力検証などの共通処理が複数機能にまたがるWebアプリでは、フレームワークを第一候補にします。軽量な選択肢としてはCodeIgniter(コードイグナイター)とは?特徴・Laravelとの違いと4.7の使い方やTempestとは?PHPフレームワークの導入手順とLaravel・Symfonyとの違い【v3.19.2実測】もあります。
PHPシステム開発の進め方
受託でも自社開発でも、PHPのシステム開発は「要件定義→設計→実装→テスト→リリース→運用」の順に進みます。PHP特有の勘所は、版と品質の仕組みを着手時に固定してから機能を積むことです。
要件定義から運用までの流れ
要件定義では、扱うデータ・画面・外部連携を洗い出し、PHPとフレームワークの版、データベース、インフラ構成を決めます。版を決めるときは、前掲のサポート表から「リリース予定日に何年サポートが残っているか」を確認します。たとえば2027年春に稼働するシステムをLaravel 13・PHP 8.5で作れば、セキュリティ修正はフレームワーク側が2028年3月まで残ります。リリース後は、ログ監視、バックアップ、composer update によるライブラリ更新を月1回など定期作業として運用に組み込みます。
静的解析・テスト・CIの初期設定
PHPは実行して初めて型の不整合が分かることがあります。これを開発中に見つけるのが静的解析です。PHPStan 2.3.1で確認したコマンドは次のとおりです。ここでは解析対象のPHPファイルをsrcディレクトリに置く前提です。Laravelのアプリを解析する場合は、対象パスをappなどに変更します。
composer require --dev phpstan/phpstan
vendor/bin/phpstan analyse src --level 6
戻り値を int と宣言した関数で number_format($total) . '円' を返すコードを置いて実行すると、「Function formatTotal() should return int but returns string.」と1件のエラーを出し、終了コード1で止まりました。CIでプルリクエストごとにこのコマンドを走らせれば、型の誤りを含むコードはマージ前に止まります。レベルの選び方はPHPStanとは?レベル0〜10の違いと導入・ベースライン運用【2.3対応】で扱っています。
テストはPHPUnitかPestで書きます。PHPUnit 13とPest 5はどちらもPHP 8.4以上が必要なため、PHP 8.3のプロジェクトでは1つ前のメジャー版を使うことになります。Pestの導入はPestPHPとは?PHPUnitとの違いと導入手順|Pest 5の新機能まで実測で解説を参照してください。本番の速度対策は、まずOPcacheが有効かを確認します(OPcacheとは?読み方とPHP 8.5の変更点・設定・確認方法)。
PHP開発の外注契約で決める版・更新担当・品質証跡
PHPのシステム開発を開発会社に依頼する場合、見積もりの金額よりも先に、次の3点を契約前に文書で決めておくと、数年後の保守で揉めずに済みます。
- 使う版:PHPとフレームワークの版を明記し、納品時点でアクティブサポート中の版であることを条件にする。
- 更新の担当:PHPやライブラリのセキュリティ更新を、保守契約の範囲に含めるか、発注側で行うかを決める。
- 品質の証跡:静的解析のレベルとテストの実行結果を納品物に含める。
新規開発の提案で使う版も確認します。PHP 8.2のセキュリティサポートは2026年12月31日で終了します。Laravel 10は2025年2月4日、Laravel 11も2026年3月12日に終了しているため、これらを新規採用する提案は避けるべきです。一から設計するPHPのシステム開発は、弊社のフルスクラッチ開発でも承っています。
クラウドでのPHP運用:コンテナとサーバーレス
クラウドの実行基盤は、処理時間、許容遅延、負荷変動、費用で選びます。コンテナとサーバーレスは排他的な分類ではなく、Google Cloud Runはコンテナを実行するサーバーレス基盤です。
常時稼働のWebアプリはコンテナ
常にリクエストが来るWebアプリは、Dockerイメージにまとめ、AWS ECSやGoogle Cloud Runなどのコンテナ実行基盤に載せます。ローカルのDocker環境をほぼそのまま本番に持ち上げられ、負荷に応じて台数を増やせます。Laravelであれば、公式のLaravel CloudやForgeを使う選択肢もあります。
散発的な処理はサーバーレス(Bref)
Webhookの受信や夜間の集計のように、たまにしか動かない処理はAWS Lambdaが向いています。LambdaはPHPを標準で提供していないため、Brefを使います。Brefのドキュメントによれば、現行の3系はPHP 8.2〜8.5のランタイムを提供しています。ただしLambdaのタイムアウトは最大900秒(15分)で、これを超える処理は実行できません。常時アクセスのあるWeb本体に使う場合は、コールドスタートを含む応答時間と費用を検証します。LambdaのProvisioned Concurrencyで起動遅延を抑える選択肢もありますが、追加料金が発生します。Brefの土台であるServerless FrameworkはServerless Frameworkとは?v4の料金・使い方・無料の代替まで【2026年最新】で扱っています。
よくある質問
PHPで開発された有名なサイトは?
WordPressで作られたサイト全般と、Wikipediaが代表例です。WordPressはPHP製のCMSで、CMSが判明しているWebサイトの58.6%が使っています(W3Techs)。Wikipediaを動かすMediaWikiもPHPで書かれています。
PHPとJavaはどちらが難しいですか?
Webアプリを動かすまでの手数はPHPのほうが少なく、入門の段階ではPHPのほうがやさしいと言えます。PHPはファイルを置けば実行でき、コンパイルが要りません。Javaは型と構造が厳密で、規模の大きい業務システムを長く保守する場面に強みがあります。
PHPは今後も使われますか?
使われ続けると考えてよい状況です。サーバー側の言語が判明しているWebサイトの69.7%がPHPで、新しいマイナー版も継続的に公開されています。Laravel・Symfonyも年単位のリリース計画が公開されています。
PHPの開発環境は何から用意すればよいですか?
PHP本体を入れて php -S で動かすところから始め、次にComposerを入れます。チームで開発する段階になったら、Dockerかフレームワーク付属の環境(LaravelならSail)で全員の環境を揃えます。
PHPのバージョンはどれを選べばよいですか?
新規開発はPHP 8.5を選びます。使いたいライブラリが8.5に未対応なら8.4にします。8.4のアクティブサポートは2026年12月31日まで、8.5は2027年12月31日までです。