NativePHPは、Laravelで作ったアプリをWindows・macOS・Linuxのデスクトップアプリとして配布するためのフレームワークです。画面はWeb技術のまま、PHPの実行環境ごとアプリに同梱するので、利用者のPCにPHPが入っていなくても動きます。この記事では、2026年10月時点の最新版であるnativephp/desktop 2.3.1を対象に、仕組み、動作要件、インストールから起動・ビルドまでの手順、ElectronやTauriとの違い、配布前に確認すべき点を整理します。手順と出力は、Laravel 13.34.0の新規プロジェクトに2.3.1を導入して確認した内容です。
まとめ:NativePHPの最新版と導入判断の要点
- 正体:Laravel向けのパッケージ群。Desktop版はElectronの上で、同梱した静的PHPがLaravelを動かす。GUIフレームワークではなく、画面はBlade・Livewire・Vue・Reactなど好きなものを使う
- 最新版:Desktop版は
nativephp/desktop2.3.1(2026年9月14日)。v1時代のnativephp/laravelとnativephp/electronは廃止扱いで、名前空間もNative\Desktopに変わった - 要件:PHP 8.3以上、Laravel 11以上(2.2.0でLaravel 13に対応)、Node 22以上。実行先はWindows 10以上、macOS 12以上、Linux
- 導入:
composer require→php artisan native:install→php artisan native:runの3コマンドでウィンドウが開く - 配布前の注意:
.envはアプリに丸ごと同梱される。同梱されるElectronは40系で、Electron公式のサポート対象(最新3メジャー)から外れている
NativePHPの仕組み:Electron・静的PHP・Laravelの3層
公式ドキュメントは、NativePHPを「OSの機能を呼ぶためのクラス群」「アプリをビルド・バンドルするツール」「利用者の端末でそのまま動く静的PHPランタイム」の3つの組み合わせだと定義しています。Desktop版ではこの3つが次のようにつながります。
- Electronがアプリとして起動し、同梱の静的PHPでLaravelを立ち上げる
- ElectronのウィンドウがLaravelのルートURLを表示する。画面の作り方はWebアプリと同じ
- PHP側で
Window::open()やNotification::title()を呼ぶと、Electron側のAPIへHTTPで橋渡しされる
PHPとElectronの間は、起動のたびに作り直される共有鍵で認証されたHTTP通信です。本番ビルドでは PreventRegularBrowserAccess ミドルウェアが全ルートに自動で掛かり、アプリのウィンドウ以外(通常のブラウザなど)からのアクセスを受け付けません。
静的PHPは nativephp/php-bin パッケージが提供します。実測では macOS(x64)向けに php-8.3.zip・php-8.4.zip・php-8.5.zip の3版が入っていました。組み込まれる拡張は php-extensions.txt で決まっている26個だけで、pdo_sqlite はありますが pdo_mysql と pdo_pgsql はありません。データベースは公式にSQLiteのみのサポートで、アプリの初回起動時に利用者の appdata フォルダへ database.sqlite が作られ、マイグレーションが走ります。
Mobile版(NativePHP for Mobile)との違い
同じ名前でスマートフォン向けの nativephp/mobile もあり、2026年9月23日の4.5.2が最新です(Packagistのライセンス表記はMIT)。こちらはElectronを使わず、コンパイル済みのPHPをSwift/KotlinのシェルアプリへLaravelごと組み込み、Webサーバーなしで端末内で動かします。v4ではBladeコンポーネントをネイティブのUI部品として描画するEDGEコンポーネントを備えています。iOSアプリのビルドはMacでしかできず、WindowsではWSL上で動かせません。以下はDesktop版の話です。
Electron・Tauriとの違い:PHPで書けることの代償
NativePHPのDesktop版は、中身がElectronです。ElectronでJavaScriptを書く代わりにLaravelでアプリを書ける、と捉えるのが正確です。
| 項目 | NativePHP(Desktop) | Electron | Tauri |
|---|---|---|---|
| アプリ側の言語 | PHP(Laravel) | JavaScript/TypeScript | Rust |
| 画面の描画 | 同梱のChromium | 同梱のChromium | OS標準のWebView |
| 同梱するランタイム | Electron+静的PHP | Chromium+Node.js | 通常はWebViewを共有(Windowsでは同梱も可能) |
| 標準のDB | SQLite(自動設定) | なし(自分で選ぶ) | なし(自分で選ぶ) |
| モバイル | 別製品(Mobile版) | 非対応 | 同じ枠組みで対応 |
代償は配布サイズです。ElectronのChromiumに加えてPHPの実行ファイルとLaravelの vendor も同梱するため、同じ画面を素のElectronで作った場合より大きくなりやすく、差はアプリの依存関係やビルド条件で変わります。開発環境では、Electron側の node_modules が491MB、php-bin が357MBになりました(いずれも配布物そのものではなく、ビルドの材料です)。
Electron自体の仕組みはElectronとは?Web技術でデスクトップアプリを作る入門解説【2026年最新】、OS標準のWebViewを使う方式はTauriとは?Electronとの違い・将来性・始め方まで徹底解説【2026年版】で詳しく扱っています。
動作要件と対応バージョン(2026年10月時点)
| 項目 | 要件 | 根拠 |
|---|---|---|
| PHP | 8.3以上 | composer.json(^8.3) |
| Laravel | 11以上(13まで) | composer.json・2.2.0の変更履歴 |
| Node.js | 22以上 | 公式Installation |
| 実行OS | Windows 10+/macOS 12+/Linux | 公式Installation |
| 同梱Electron | 40系(^40.10.2) | 2.3.1のpackage.json |
公式のサポートポリシーの表はLaravelを「11.x、12.x」としか書いていませんが、2.2.0で「Laravel 13.x Compatibility」が入り、composer.jsonも ^13.0 を許可しています。今回の検証もLaravel 13.34.0で問題なく導入できました。Laravel 13の要件はLaravelの最新バージョンは13|対応PHPバージョン・サポート期限一覧とアップグレード判断にまとめています。
開発環境は、公式がMac・WindowsではLaravel Herdとは|PHPバージョン切替と.test公開の仕組み・Sailとの使い分けを推しています。コンテナや仮想環境でも開発はできますが、公式は「想定外の問題とビルドの手作業が増える」と注意しています。
インストールから起動までの手順
既存のLaravelアプリに追加する場合も、新規に作る場合も手順は同じです。
composer require nativephp/desktop
php artisan native:install
php artisan native:run
native:install は次の4つを行います。実際に生成・変更されたファイルで確認しました。
app/Providers/NativeAppServiceProvider.phpとconfig/nativephp.phpを生成composer.jsonにnative:devスクリプト(native:runとVite開発サーバーを並行起動)を追加post-update-cmdにphp artisan native:install --force --quietを登録し、composer updateのたびに再実行- Electron側のnpm依存とElectron本体をダウンロード
Laravel 12以降の新規プロジェクトには ignore-scripts=true を含む .npmrc が入っており(13.34.0でも確認)、2.2.x以前ではこの設定を引き継いでElectron本体のダウンロードが黙って飛ばされ、起動時に原因の分かりにくいエラーになっていました(Issue #145)。2.3.0でElectronのインストールがアプリのnpm設定から切り離され、2.3.1では .npmrc があってもElectron 40.10.2が取得できています。2.3.0そのものはコンパイル済みファイルの欠落で native:run が起動しない不具合(#152)があるので、2.3.1以上を使ってください。
native:run の前に、まず php artisan serve などブラウザで動かして例外を潰しておくのが公式の推奨です。native:run はアプリのコードをビルド用ディレクトリへコピーして起動するため、PHPのコードを変えても再起動するまで反映されません。画面側はVite(npm run dev)のホットリロードが効きます。
ウィンドウ・通知・メニューバーの基本コード
アプリ起動時の処理は NativeAppServiceProvider の boot() に書きます。生成直後は Window::open(); だけが入っています。サイズとタイトルを決め、前回のサイズと位置を覚えさせ、起動を通知する例です(メソッドの存在は2.3.1のクラスで確認済み)。
<?php
namespace App\Providers;
use Native\Desktop\Contracts\ProvidesPhpIni;
use Native\Desktop\Facades\Notification;
use Native\Desktop\Facades\Window;
class NativeAppServiceProvider implements ProvidesPhpIni
{
public function boot(): void
{
Window::open()
->title('在庫管理')
->width(1024)
->height(720)
->minWidth(800)
->minHeight(600)
->rememberState();
Notification::title('在庫管理')
->message('アプリを起動しました')
->show();
}
public function phpIni(): array
{
return [
'memory_limit' => '512M',
];
}
}
Window::open() はIDを省略すると main になり、アプリのルートURLを開きます。別ウィンドウは Window::open('settings')->url(...) のようにIDを付けて開き、Window::close('settings') で閉じます。rememberState() で状態を覚えられるのは1つのウィンドウだけです。
ウィンドウを持たない常駐型にしたいときは、MenuBar::create() でメニューバー(タスクトレイ)アプリにできます。このほかクリップボード、ダイアログ、グローバルショートカット、子プロセス、キューワーカーなどのファサードがあり、画面はBladeのほかLivewire(Laravel)とは?v4対応の使い方とコンポーネント作成・Blade連携の手順やLaravel Inertiaとは|APIを作らずSPAを組む仕組みと3系の変更点で組めます。
ビルド・コード署名・自動更新
配布用のビルドは native:build です。引数なしなら実行中のOSとアーキテクチャ向けに、mac・win・linux を付ければそのOS向けに作ります。出力先は2.0以降 nativephp/electron/dist です。
php artisan native:build # 実行中のOS向け
php artisan native:build win # Windows向け(クロスビルド)
クロスビルドはすべての組み合わせで動くわけではなく、LinuxからWindows向けを作るには32bit版のwineが要ります。公式も「対応する各OSでビルドし、配布前にそのOSで動作確認する」ことを求めています。ビルドのたびに config/nativephp.php の version を変えてください。利用者側のマイグレーションは、このバージョンが変わったときにしか走りません。
コード署名は、macOSなら NATIVEPHP_APPLE_ID・NATIVEPHP_APPLE_ID_PASS(アプリ用パスワード)・NATIVEPHP_APPLE_TEAM_ID を .env に設定し、別途Developer ID Application証明書と秘密鍵をビルド環境に用意すると、ビルド時に署名と公証まで行います。公式ドキュメントは、公証しないと開発機以外のMacでは「壊れているため開けません」という警告が出て起動できないと説明しています(表示される警告文は署名の有無やmacOSの版で変わります)。Windowsは証明書による署名と、公式が推奨するAzure Trusted Signingの2方式です。macOSの署名・公証の詳細はElectron製Macアプリのコード署名とApple公証|notarytoolとentitlements設定の実測手順を参照してください。
自動更新は config/nativephp.php の updater で設定し、配布先はGitHub Releases・S3・DigitalOcean Spacesから選びます。既定値は「有効・Spaces」なので、使わない配布先の設定は見直してください。php artisan native:publish はビルドと配布先へのアップロードを一度に行います。
配布前に確認すべき3つの落とし穴
NativePHPは「Webアプリの感覚で作れる」のが売りですが、配布物は利用者のPCに置かれます。サーバーに置くWebアプリと同じ感覚で配ると、次の3点で問題になります。
.envの同梱と既定の除去対象キー
公式ドキュメントは、ビルド時に .env がアプリへそのままコピーされ、アプリを手にした誰でも読めると明記しています。除去されるのは cleanup_env_keys に書いたキーだけで、既定は AWS_*・AZURE_*・GITHUB_*・DO_SPACES_*・*_SECRET・BIFROST_* と署名用の変数です。判定に使われるLaravelの Str::is() で確かめると、次のキーは既定では残ります。
| キー | 既定の扱い |
|---|---|
| STRIPE_SECRET・PUSHER_APP_SECRET | 除去される |
| OPENAI_API_KEY | 残る |
| DB_PASSWORD・MAIL_PASSWORD | 残る |
| APP_KEY | 残る |
外部APIの鍵は、cleanup_env_keys に足すだけでなく、そもそもアプリに持たせない設計にするべきです。公式も、秘密の操作は自前のAPIサーバーに任せ、アプリからはそのAPIを呼ぶ形を勧めています。利用者ごとに発行する短命なトークン(公式の目安は48時間未満)で認証してください。
同梱Electron 40のサポート終了と更新対応
2.3.1が使うElectronは ^40.10.2 で、今回の導入では40.10.2が入りました。Electronの公式サポートは最新3メジャーのみで、2026年6月30日にElectron 43が出た時点で40系は対象外になり、40系の最終リリースは7月1日の40.10.6です。2026年10月時点の最新は44系で、Chromiumのセキュリティ修正は40系には届きません。不特定多数に配るアプリや、外部のWebページを表示するアプリでは、NativePHPがElectronを上げるまで待つか、php artisan native:install --publish でElectronプロジェクトを手元に出してバージョンを自分で管理する必要があります。後者は composer update のたびに差分を取り込む手間がかかります。
日本語アプリ名によるmacOS起動不具合と修正版
2.2.x以前では、APP_NAME にASCII以外の文字を使うと、macOS向けのビルドは成功するのにアプリが起動しない不具合がありました(PR #148、2.3.0で修正)。原因は、electron-builderがバンドル名をUnicodeのNFD(分解形)で書き、CFBundleName はNFC(合成形)のまま書くため、Electronが両者を対応付けられないことです。日本語では「データ管理」「ポイント」のように濁点・半濁点を含む名前がNFCとNFDでバイト列が変わり、「在庫管理」「メモ帳」は変わりません。古い版で日本語名のアプリを作っている場合は、2.3.1へ上げてください。
NativePHPを選ばないほうがよい場面
次の条件に当てはまるなら、別の手段を選んでください。
- アプリのサイズやメモリ使用量を小さく抑えたい:ChromiumとPHPを同梱する構成なので、Tauriも候補に入れ、同じ機能・条件で配布サイズとメモリ使用量を測ってから決める
- 社内のMySQLやPostgreSQLへ端末から直接つなぎたい:同梱PHPに
pdo_mysql・pdo_pgsqlが無く、DB接続情報も.envごと配ることになる。API経由にするか、独自の静的PHPをNATIVEPHP_PHP_BINARY_PATHで差し替える(公式のサポート外) - Laravelを使っていない:NativePHPはLaravel前提で、素のPHPやSymfonyでは使えない
逆に、Laravelで作った社内向けの業務ツールを、ブラウザでなく専用アプリとして配りたい場面では、既存のコードと知識をほぼそのまま使えるのが強みです。
v1からv2への変更点とリリース履歴
2025年5月以前の解説記事やサンプルはv1前提で、パッケージ名とコマンド名が今と違います。v2で変わった主な点は次のとおりです。
nativephp/electronとnativephp/laravelを外し、nativephp/desktopに置き換える- 名前空間を
Native\LaravelからNative\Desktopへ変える native:serveは非推奨になりnative:runへ改名- ウィンドウの
nodeIntegrationが既定で無効。必要な場合に限りWindow::open()->webPreferences(['nodeIntegration' => true])で変更する - Electron 38への更新でmacOS Catalina・Big Surのサポートを終了
| 版 | 公開日 | 主な変更 |
|---|---|---|
| 0.1.0 | 2023-07-18 | 最初の公開(nativephp/electron) |
| 1.0.0 | 2025-04-07 | 正式版(nativephp/electron) |
| 2.0.0 | 2025-10-14 | nativephp/desktopへ統合 |
| 2.2.0 | 2026-04-29 | Laravel 13対応・Nightwatch連携 |
| 2.3.0 | 2026-09-05 | スプラッシュ画面・非ASCII名の修正 |
| 2.3.1 | 2026-09-14 | 2.3.0の起動不能を修正 |
公開日はNativePHP/desktopのGitHub Releasesの日付で、0.1.0と1.0.0はPackagistのnativephp/electronの日付です。
よくある質問
NativePHPはWindowsで使えますか?
使えます。作ったアプリはWindows 10以上で動き、開発もWindows上でできます。Windows向けのビルドは php artisan native:build win で、Macからのクロスビルドもできますが、公式は配布前に実機のWindowsで動作確認するよう求めています。一般利用者への配布では、証明書またはAzure Trusted Signingによる署名を推奨します。未署名でも配布はできますが、起動時に警告や制限が生じます。
NativePHPにTauri版はありますか?
2026年10月時点ではありません。Packagistに公開されている公式パッケージはDesktop(Electronベース)、Mobile、静的PHPのphp-binなどで、Tauriを使うドライバーはありません。Chromiumを同梱しない軽さを優先するなら、PHPではなくRustで書くTauriを直接使うことになります。
Laravelを使わずにNativePHPは使えますか?
使えません。公式ドキュメントは、NativePHPがLaravelの上に作られており、使う前にLaravelでのWebアプリ開発に慣れておくべきだと書いています。インストールもcomposerでLaravelプロジェクトへ入れる形で、素のPHPスクリプトを単体でアプリにする仕組みはありません。
NativePHPは無料ですか?商用アプリに使えますか?
Desktop版の nativephp/desktop はMITライセンスで、商用アプリにも使えます。ただし同梱される静的PHPのパッケージ nativephp/php-bin は、ライセンス表記にMITのほかApache-2.0、GPL-3.0-or-later、PHP-3.01が並びます。商用で配布する前に、同梱物のライセンスを確認してください。
PHPでGUIアプリを作る方法はNativePHP以外にもありますか?
あります。古くはPHP-GTKのようにPHPからGUI部品を直接操作する拡張がありましたが、NativePHPは方式が違い、PHPに描画をさせずWeb技術の画面をElectronで表示します。そのためUIはHTML・CSS・JavaScriptで作り、PHPはLaravelのアプリとしてデータ処理とOS機能の呼び出しを受け持ちます。既存のWeb画面を再利用できる点は、Laravelアプリをデスクトップ向けに展開する際の利点です。