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 サイト 公式リポジトリ

PEACH PIE の 特徴と 弱点 PEACHPIE とは

PHP のコードを .NET の共通言語基盤 (CLI: Common Language Infrastructure) に準拠する PEACH 中間言語 (IL: Intermediate Language) へコンパイルするツールとランタイム PIE の ライブラリから構成された開発環境です。 特徴と 弱点

PHP のコードから、 .exe や .dll が作れます。 ちなみに LIVE DEMO では、 PHP から IL 以外に C# と VB のコードへ変換した結果も 見られます。

PEACHPIE より PEACH PIE の 特徴と 弱点

PEACHPIE より 特徴(よくできているところ)

❖ .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 リポジトリ 弱点(ちょっと困っているところ)

❖ 現在のバージョンはコンパイラでの提供で、 非常に厳密なエラーチェックを行う PEACH ➢ 完全にコンパイルエラーを除去しないと PIE の 全く動かせない・・・ 特徴と ➢ 実行にコンパイルが必要な処理は動作しない 弱点 ❖ 不足するライブラリ、拡張機能がもうちょっとある ➢ PHAR 等はまだ途中 ⇒ 0.9.9 で対応! ➢ ob_end_clean() が実行できない (0.9.10 時点 ) ➢ 素の WordPress や各種フレームワークが、いきなりコンパイルできるわけで はない

⇒ 徐々に解決していきそうな感じではあります PEACHPIE の導入 GET STARTED

❖ Install .NET Core SDK PEACH ➢ dotnet コマンドを使うのと、 PIE の クロスプラットフォームな環境を用意するため 導入 .NET サイトより SDK をインストール

❖ Install Peachpie .NET Templates ➢ PEACHPIE 用のテンプレートを導入 (要インターネット接続)

> dotnet new -i Peachpie.Templates::* アプリケーション作成手順

1. プロジェクトの作成 ➢ dotnet コマンドでテンプレートから生成 PEACH PIE の 2. 処理コードの実装 導入 ➢ . ファイルを開いて、実処理を記述 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 says \"Hello .NET World!\""; }

main(); 普通の PHP のコードが書けます。 当然、クラスも書けます。 2 . 処理コードの実装

2.2 プロジェクトファイル < プロジェクト名 >.msbuildproj ( コンソールアプリのプロジェクトより ) PEACH の PIE 導入 Exe netcoreapp2.0 program.php Simpliest PHP project for .NET Core, a console application.

.sln や .msbuildproj のファイルは Visual Studio で開けます。 2 . 処理コードの実装

2.3 OutputType PEACH の Exe PIE Exe … 実行モジュール 導入 .NET Core .dll .NET Framework .exe

Library … クラスライブラリ .dll

コマンドラインアプリを作成する以外 は、基本的にクラスライブラリとしての 活用が基本となりそうです。 2 . 処理コードの実装

2.3 TargetFramework

PEACH netcoreapp2.0 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 で接続した 上でビルドしたところ。 この時は、 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 で ソリューション 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 Library ソリューション netstandard2.0 program.php Simpliest PHP library project.

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 "); C# から呼び出す際は、 } Context のオブジェクトを 必要とします。 4. C# から PHP コード呼び出す処理を実装

4.2 C# から PHP のクラスを利用 user.php Program.cs

Visual name = $name; } }

public function sayHello(){ $format = '%s says "Hello PhperNa!"'; return sprintf($format, $this->name); PHP のクラスは、 } C# のクラス同様に使えます。 } 取り扱う型は PhpValue です。 5. ビルド&実行

C# プロジェクトをスタートアッププロジェクトに選択 「▶開始」で実行! Visual Studio で ソリューション

ちょっと気になる今後の動向 ちょっと気 ★ ロードマップの を迎え、 の基本的な機能が になる 0.9.9 pre-alpha PHP ほぼ出そろったので、次の 1.0.0 の目標である Visual Studio Code/ 今後の Visual Studio 2017 の Extension 化が楽しみ

動向 ★ まだ制約はあるものの、 C# から PHP のコードが呼び出せることが 確認できたので、 View 作成の作業分担の検討材料にしたい ASP.NET Blog February 6, 2018 by Daniel Roth A new experiment: Browser-based web apps with .NET and Blazor ちょっと気 Blazor になる Full-stack web development with C# and WebAssembly 今後の 動向 Browser + Razor = Blazor ASP.NET の View エンジンである Razor の記法が使える Single Page Web Application のフレームワークです。

WASM な .NET 実行環境が、 .NET の中間言語 (IL) をブラウザ上で実行します。 実行環境だけでなく、開発環境も一通り揃っていて簡単に試行できる状況です! 1. Blazor のサンプルを動かす

1.1 拡張機能と更新プログラムの画面より ASP.NET Core Blazor Language Services をインストール ちょっと気 になる 今後の 動向

1.2 新しいプロジェクトで ASP.NET Core Web アプリケーションを選択 1. Blazor のサンプルを動かす

1.3 新しい ASP.NET Core Web アプリケーションより Blazor を選択 ちょっと気 になる 今後の 動向 1.4 新しいプロジェクトが開いたら、依存関係が解決するまで待機 Razor は @ から HTML タグまでに記述し、 サーバーサイドで動作します。 Blazor では、同じ構文で クライアントサイドで 動作します。 1. Blazor のサンプルを動かす

1.5 そのまま実行! ちょっと気 になる 今後の 動向

Loading 表示の後、 Single Web Page な 画面が 表示されます。

2. Blazor と PEACHPIE を連携

2.1 Blazor のソリューションへ PHP のプロジェクトを追加

ちょっと気 2.2 WebApplication プロジェクトの になる 参照へ 今後の PHP のプロジェクトと Peachpie.Library を追加 動向

PHP のクラスライブラリのプロジェクト を追加しています。 2. Blazor と PEACHPIE を連携

2.3 WebApplication.csproj を編集 ちょっと気 になる 今後の 動向

PropertyGruop に、 : BlazorLinkOnBuild の 設定を追加します false 2. Blazor と PEACHPIE を連携

2.4 PHP のプログラムを準備 ちょっと気 になる 今後の 動向 2. Blazor と PEACHPIE を連携

2.5 Blazor から PHP のコードを呼び出し ちょっと気 になる 今後の 動向 2. Blazor と PEACHPIE を連携

2.6 実行! ちょっと気 になる 今後の 動向 ★ 値を単純にレンダリングする場合は、 ちょっと気 型変換なしで記述できるので意外と楽 になる ★ ブラウザ上の .NET ランタイムにて動作するプログラム 今後の をデバッグするのは難しい 動向 ★ 一部とはいえ、クライアントサイドで PHP 由来の プログラムが動作するのは楽しい

★ ブラウザの DLL 読み込み等に抵抗はあるかもしれないが、 Blazor や PEACHPIE の良いところを、少しでも業務に 利用したい ご清聴ありがとうございました!

PEACHPIE ~ .NET と PHP の橋渡し~

※ ご注意※ ❖ 当該内容には個人の希望的な推測や時代遅れの情報を多分に含んでいます。 ❖ 必ず 1 次ソースにて最新情報を確認し、用法用量を守ってご使用ください。

2018.10.13 ぺちぱな。18 @MIRROR_