Peachpie ~ .Net と Php の橋渡し~
Total Page:16
File Type:pdf, Size:1020Kb
PEACHPIE ~ .NET と PHP の橋渡し~ 2018.10.13 ぺちぱな。18 @MIRROR_ ❖ 当方の最近の状況 ➢ VB 以外の案件が増えてきたこと ❖ なぜ PEACHPIE ? 概要 ➢ クローズドな環境での突破口として ❖ PEACHPIE の特徴と弱点 ➢ よくできているところと、ちょっと困っているところ ❖ PEACHPIE の導入 ➢ .NET Core での導入手順の紹介 ❖ Visual Studio でソリューション ➢ Visual Studio 上で C# と PHP のプロジェクトを連携してみる ❖ ちょっと気になる今後の動向 ➢ .NET 界のとある動きの件と PEACHPIE について ❖ 状況 #1 ➢ 新規開発案件の大半が VB から C# へ移行しました。 ➢ .NET Framework は 4.5 以上が基本となりました。 当方の ➢ Parallel クラスやラムダ式を積極的に利用できるように なりました。 最近の 状況 ❖ 要因 #1 ➢ OS やブラウザ、データベース、 Web サーバ等のバージョン アップが重なりました。 ➢ ベンダーサポート対象外のものは、順次刷新されました。 ❖ 結果 #1 ➢ 開発環境が今時に近づいた! ❖ 状況 #2 ➢ Form アプリやブラウザアプリと Web サービスとの連携を 図る案件が増えました。 当方の ➢ ミドルウェア評価のため、仕様変更を念頭に入れた案件が 増えました。 最近の 状況 ❖ 要因 #2 ➢ 部署固有の専用アプリではなく、 部署間で情報を共用するアプリ開発の要望が増えました。 ❖ 結果 #2 ➢ ステークホルダーが増え、開発当初で決まらない事が増え、 UI を含めて作り直しが増えた! なぜ PEACHPIE ? 現在の課題と今後の目標 ❖ 以前と比較して新しい技術導入が容易になったが、 なぜ 開発スピードは中々上がらない。 PEACH ➢ もっとオープンな世界を見て、知見を広げたい! PIE ? ❖ 業務ロジックと UI(View) を分離させた場合、 C# や VB は最適なのか疑問。 ➢ 作業分担の事を考えると業務ロジックを C# 、 View は「 PHP 」が良いのでは! 要件と方針 ❖ .NET Framework の環境はそのまま使いたい なぜ ➢ UI 部分は作業を切り分けられるけど、 PEACH あまり基幹と環境が異なるのも困る… PIE ? ❖ PHP の対応バージョンが高いこと、 開発が活発であること ➢ 10年単位とか、長く利用する場合が多い PEACHPIE の特徴と弱点 Web サイト <https://www.peachpie.io/> 公式リポジトリ <https://github.com/peachpiecompiler/peachpie> PEACH PIE の 特徴と 弱点 PEACHPIE とは PHP のコードを .NET の共通言語基盤 (CLI: Common Language Infrastructure) に準拠する PEACH 中間言語 (IL: Intermediate Language) へコンパイルするツールとランタイム PIE の ライブラリから構成された開発環境です。 特徴と 弱点 PHP のコードから、 .exe や .dll が作れます。 ちなみに LIVE DEMO では、 PHP から IL 以外に C# と VB のコードへ変換した結果も 見られます。 PEACHPIE <https://www.peachpie.io/> より PEACH PIE の 特徴と 弱点 PEACHPIE <https://www.peachpie.io/> より 特徴(よくできているところ) ❖ .NET Standard 2.0 に対応 ➢ .NETCore もしくは .NET Framework 上で動作 PEACH クロスプラットフォーム! PIE の ➢ コンパイル済のコードで動作するため割と高速 特徴と ➢ .NET のセキュリティ機構が働く 弱点 ❖ Visual Studio Core/2017 上で開発可能! ❖ PHP7 の文法に対応 ➢ WordPress のサンプルがあって、実際に動く ❖ .PHP と .NET のコード間で、相互呼び出しが可能 WordPress を 起動したところ .NET Core 上で 動いてます宣言! WordPress running on .NET Core with Peachpie <https://youtu.be/R3zHxMNzSLs> リポジトリ <https://github.com/iolevel/peachpie-wordpress> 弱点(ちょっと困っているところ) ❖ 現在のバージョンはコンパイラでの提供で、 非常に厳密なエラーチェックを行う PEACH ➢ 完全にコンパイルエラーを除去しないと PIE の 全く動かせない・・・ 特徴と ➢ 実行にコンパイルが必要な処理は動作しない 弱点 ❖ 不足するライブラリ、拡張機能がもうちょっとある ➢ PHAR 等はまだ途中 ⇒ 0.9.9 で対応! ➢ ob_end_clean() が実行できない (0.9.10 時点 ) ➢ 素の WordPress や各種フレームワークが、いきなりコンパイルできるわけで はない ⇒ 徐々に解決していきそうな感じではあります PEACHPIE の導入 GET STARTED <https://www.peachpie.io/getstarted> ❖ Install .NET Core SDK PEACH ➢ dotnet コマンドを使うのと、 PIE の クロスプラットフォームな環境を用意するため 導入 .NET <https://www.microsoft.com/net> サイトより SDK をインストール ❖ Install Peachpie .NET Templates ➢ PEACHPIE 用のテンプレートを導入 (要インターネット接続) > dotnet new -i Peachpie.Templates::* アプリケーション作成手順 1. プロジェクトの作成 ➢ dotnet コマンドでテンプレートから生成 PEACH PIE の 2. 処理コードの実装 導入 ➢ .php ファイルを開いて、実処理を記述 3. プロジェクトのビルド ➢ dotnet コマンドで .exe もしくは .dll を生成 1.プロジェクトの作成 1.1 コンソールアプリケーションの場合 PEACH > dotnet new console -lang PHP -o < プロジェクト名 > PIE の 導入 以下のファイルが作成されます。 < プロジェクト名 >/ README.md < プロジェクト名 >.msbuildproj .php のファイルは複数追加可能。 プロジェクトファイルが、自動でビルド対象 program.php ← PHP のコードを記述する! に含めます。 実行時呼び出し先を変更したい場合 は、プロジェクトファイルの修正が必要。 1.プロジェクトの作成 1.2 クラスライブラリの場合 PEACH > dotnet new classlib -lang PHP -o < プロジェクト名 > PIE の 導入 以下のファイルが作成されます。 < プロジェクト名 >/ README.md < プロジェクト名 >.msbuildproj lib.php ← PHP のコードを記述する! 1.プロジェクトの作成 1.3 Web アプリケーションの場合 PEACH > dotnet new web -lang PHP -o < プロジェクト名 > PIE の 以下のファイルが作成されます。 導入 < プロジェクト名 >/ README.md < プロジェクト名 >.sln ← ソリューションになってる Server/ Server.csproj PHP で構築された Program.cs ← サーバー処理担当 Website プロジェクトの DLL の Website/ 内容を、 Server プロジェクトの Website.msbuildproj 処理から呼び出す構成。 index.php ← PHP のコードを記述する! 2 . 処理コードの実装 2.1 .php ファイル PEACH program.php ( コンソールアプリのプロジェクトより ) の PIE <?php 導入 function main() { echo "< プロジェクト名 > says \"Hello .NET World!\""; } main(); 普通の PHP のコードが書けます。 当然、クラスも書けます。 2 . 処理コードの実装 2.2 プロジェクトファイル < プロジェクト名 >.msbuildproj ( コンソールアプリのプロジェクトより ) PEACH の <Project Sdk="Peachpie.NET.Sdk/0.9.10"> PIE <PropertyGroup> 導入 <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.0</TargetFramework> <StartupObject>program.php</StartupObject> <Description>Simpliest PHP project for .NET Core, a console application.</Description> </PropertyGroup> <ItemGroup> <Compile Include="**/*.php" /> </ItemGroup> .sln や .msbuildproj のファイルは Visual Studio で開けます。 </Project> 2 . 処理コードの実装 2.3 OutputType PEACH の <OutputType>Exe</OutputType> PIE Exe … 実行モジュール 導入 .NET Core .dll .NET Framework .exe Library … クラスライブラリ .dll コマンドラインアプリを作成する以外 は、基本的にクラスライブラリとしての 活用が基本となりそうです。 2 . 処理コードの実装 2.3 TargetFramework PEACH <TargetFramework>netcoreapp2.0</TargetFramework> PIE の netstandard< バージョン > 導入 .NET Core/.NET Framework 例 : netstandard2.0 netcoreapp< バージョン > “netstandard” は、規格 .NET Core 例 : netcoreapp2.0 として .NET Core と .NET Framework の バージョン 両フレームワークが共通す net< > る部分のため、クラスライブ .NET Framework 例 : net472 ラリでは積極的に選択した いところ 3.プロジェクトのビルド 3.1 コンソールアプリケーション、クラスライブラリのビルド PEACH > cd < プロジェクト名 > ← .msbuildproject のディレクトリ PIE の > dotnet build 導入 ★ 依存関係を解決する際に NuGet で Web からダウンロードします。 ★ Visual Studio 上でビルドする場合は、 パッケージの自動更新 完了を確認してから! ★ .msbuildproj を手動更新した際、ビルド時のパッケージ更新に失敗 する場合があります。 パッケージ情報の不整合が原因であれば、 obj フォルダを削除すれば 解決するかもしれません。 powershell から SSH で接続した Linux 上でビルドしたところ。 この時は、 0.9.0 でした。 初回のビルド時は、 依存関係の解決のために複数のファイルを NuGet よりダウンロードします。 Visual Studio 上で .msbuildproject を 開いたところ。 最初は依存関係に警告が付きますが、 しばらくするとパッケージマネージャーが自動で NuGet より必要なファイルを ダウンロードして解決します。 3.プロジェクトのビルド 3.2 Web アプリケーションのビルド 本家の説明では Server PEACH > cd < プロジェクト名 > ← .sln のディレクトリ のディレクトリ内でビルドし ていますが、 dotnet コマン の > dotnet build ドは .sln ファイルを解釈す PIE るため、ソリューション単位 でビルド可能です。 導入 ★ Visual Studio 上でビルドする場合は、 パッケージの自動更新完了を確認してから! ★一度ビルド成功後に .php ファイルを更新した際、 Website のプロジェクトがビルドされない場合は 手動でリビルドを実行してください。 3.プロジェクトのビルド 3.3 コンソールアプリケーションの実行 PEACH > dotnet run ←.msbuildproj から実行 の PIE > dotnet < プロジェクト名 .dll> ← .NET Core アプリを実行 導入 > プロジェクト名 .exe ← .NET Framework ( WIndows )アプリを実行 dotnet run ★ Visual Studio では、 は、 restore と build に依存してい 「▶」実行ボタンかデバッグメニューより実行します。 ますので、実行可 能なプロジェクトの 場合は、いきなり dotnet run でも OK ! Linux 上で実行したところ。 .NET Core アプリのため、 dotnet コマンドより呼び出します。 Visual Studio では ブレークポイントを設定して、 変数や呼び出し履歴の 確認ができます。 3.プロジェクトのビルド 3.4 Web アプリケーションの実行 PEACH > dotnet run -p Server ←.sln から実行 の PIE > cd Server 導入 > dotnet run ←.csproj から実行 ★ ソリューションから起動する場合は、 プロジェクトの指定が必要です。 ★ Visual Studio 上では、「▶ IIS Express 」より実行します。 Linux 上で実行したところ。 Windows 側のブラウザより指定されたポート に接続してみました。 Visual Studio では IIS Express 上で動作します。 デバッグ時に自動でブラウザが 開いて IIS へ接続し、 IIS が Server へ 接続します。 Visual Studio でソリューション C# から PHP のコードを呼び出すソリューションを作成 基本的なサンプルは 以下のサイトを参照 Visual Peachpie Samples Studio <https://github.com/iolevel/peachpie-samples> で ソリューション PHP と C# の連携は、以下のプロジェクトを参照 csharp-php-hybrid … C# から PHP using-csharp-from-php … PHP から C# ここからが本番。 Peachpie Samples は、 dotnet コマンドにてテンプ 今回は、 を参考に レートから作成したプロジェクト。 csharp-php-hybrid なので、 Visual Studio スタート Visual Studio 2017 で作成した C# のソリューションへ だった場合のお話。 PHP のプロジェクトを追加した例を紹介! 材料: Visual Studio 2017 PHP のコンソールアプリのプロジェクト Visual 手順: Studio 1. Visual Studio で C# のコンソールアプリを新規作成 で ソリューション 2. PHP のプロジェクトをクラスライブラリ向けへ変更 3. C# のソリューションへ PHP のプロジェクトを追加 4. C# から PHP コード呼び出す処理を実装 5. ビルド&実行 PHP プロジェクトが クラスライブラリの場合、 2. の手順は不要です。 1. Visual Studio で C# のコンソールアプリを新規作成 業務を想定して、ターゲットは .NET Framework を選択 Visual Studio で ソリューション 2. PHP のプロジェクトをクラスライブラリ向けへ変更 2.1 PHP のプロジェクトを C# プロジェクト内にコピー Visual Studio で ソリューション 2.2 ディレクトリ名とプロジェクトファイル名をアセンブリ名へ変更 プロジェクトファイルの修正を 最小限に抑えるため、ディレクトリ名とプ ロジェクトファイル名をアセンブリ名へ変 更します。 2. PHP のプロジェクトをクラスライブラリ向けへ変更 2.3 PHP プロジェクト内の obj と bin フォルダと .sln ファイルを削除 Visual PHP プロジェクトの再構築を 確実に行うため、以前の依存関係情報 Studio と、不要なソリューションファイル等を削 で 除します。 ソリューション 2.4 C# のソリューションのファイルビューを開く ファイルビューより ソリューション追加前の PHP プロジェクト内のファイルを 可視化します。 2. PHP のプロジェクトをクラスライブラリ向けへ変更 2.5 プロジェクトファイルを編集 Visual < アセンブリ名 >.msbuildproj Studio <PropertyGroup> で <OutputType>Library</OutputType> ソリューション <TargetFramework>netstandard2.0</TargetFramework> <StartupObject>program.php</StartupObject> <Description>Simpliest PHP library project.</Description> </PropertyGroup> OutputType を Exe から Library へ、 TargetFramework を netcoreapp2.0 から netstandard2.0 へ変更します。 StartupObject は利用しないため、タグごと削除します。 Description は、プロジェクト内容に合わせて変更します。 3. C# のソリューションへ PHP のプロジェクトを追加 3.1 ソリューションのメニューより既存プロジェクトを追加 Visual Studio で ソリューション ソリューション エクスプローラーより、 ソリューションのコンテキストメニューから既存のプロジェ クトを選択します。 3. C# のソリューションへ PHP のプロジェクトを追加 Visual Studio で ソリューション C# のソリューション内にコピーした PHP プロ ジェクトを選択します。 プロジェクトファイルを既に開いていた場合 は、閉じてください。 3. C# のソリューションへ PHP のプロジェクトを追加 3.2 PHP プロジェクトの依存関係構築完了まで待機 Visual Studio で ソリューション PHP プロジェクトファイルを更新している場 合、パッケージマネージャーによる依存関係の 自動解決が行われますので、構築完了まで 待機します。 3. C# のソリューションへ PHP のプロジェクトを追加 3.3 C# プロジェクトの参照へ PHP のプロジェクトを追加 Visual Studio で ソリューション C# プロジェクトの 参照マネージャーを開き、 ソリューション内の PHP プロジェクトを選択します。 3. C# のソリューションへ PHP のプロジェクトを追加 3.4 C# プロジェクトの参照へ Peachpie.Library を追加 Visual Studio で ソリューション C# プロジェクトの NuGet パッケージマネージャーを開き、 参照から Peachpie.Library を インストールします。 3. C# のソリューションへ PHP のプロジェクトを追加 3.5 C# プロジェクトの依存関係構築完了まで待機 Visual Studio で ソリューション C# プロジェクトの参照に Peachpie.Library が追加されると、 using Pchp.Core; が記述できます。 これで PEACHPIE の機能を呼び出す 準備が完了します。 3. C# のソリューションへ PHP のプロジェクトを追加 Visual Studio で ソリューション PEACHPIE をインストール済みの状態で バージョンが変わった場合、 変更のプレビュー画面が開きます。 問題がなければ、 OK ボタンを押下して 先へ進みます。 4. C# から PHP コード呼び出す処理を実装 4.1 C# から PHP の GLOBAL 関数を利用 program.php Program.cs Visual <?php Context.AddScriptReference(Assembly.Load( function main() new AssemblyName("PhperNaLib"))); Studio { で e("PhperNaApp says \"Hello .NET using (var ctx = World!\""); Context.CreateConsole("PhperNaApp1")) ソリューション } { function e($value) // 標準 GLOBAL 関数の呼び出し { ctx.Call("phpinfo"); echo htmlspecialchars($value); // ユーザ定義の読み込み } ctx.Include("", "program.php"); main(); // GLOBAL 関数の呼び出し PHP のコードを ctx.Call("e", "\n<WARN>"); C# から呼び出す際は、 } Context のオブジェクトを 必要とします。 4.