Peachpie ~ .Net と Php の橋渡し~

Peachpie ~ .Net と Php の橋渡し~

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.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    68 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us