溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何理解.NET中新PHP SDK + Runtime的PeachPie

發(fā)布時(shí)間:2021-10-11 11:03:49 來源:億速云 閱讀:128 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了如何理解.NET中新PHP SDK + Runtime的PeachPie,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

前言

這幾天想基于 .NET Core 搞一個(gè)自己的博客網(wǎng)站,于是在網(wǎng)上搜刮各種博客引擎,找到了這些候選:Blogifier、Miniblog 以及 edi 寫的 Moonglade。

Blogifier:這是前端是個(gè) Angular SPA 應(yīng)用,不利于 SEO,同時(shí)首屏加載速度慢,因此排除。

Miniblog:顧名思義 Mini,可以完美承載內(nèi)容但是主題實(shí)在是過于簡單,沒有可自定義性,因此排除。

Moonglade:總體感覺不錯(cuò),界面設(shè)計(jì)得也很好,功能全面,然而需要 SQL Server 作為數(shù)據(jù)庫,然而 SQL Server 雖然有 Linux 版本,但受限于主機(jī)配置和預(yù)算因此也被排除。

難道就沒有適合我需求的博客引擎了嗎?答案當(dāng)然是:有。

眾所周知 PHP 是世界上最好的語言(滑稽),還是眾所周知有一個(gè)叫做 WordPress 的博客引擎生態(tài)非常龐大,而且是使用 PHP 構(gòu)建的。

可是 PHP 和 .NET 又有什么關(guān)系呢?

PeachPie

PeachPie 是一個(gè)完全構(gòu)建于 .NET Standard 之上的一套完整的 PHP SDK + Runtime,包含編譯器和運(yùn)行時(shí)等等,兼容 PHP 5.4-7.4(當(dāng)然部分功能仍在開發(fā)中)。

官網(wǎng):https://www.peachpie.io

那么 PeachPie 有什么優(yōu)點(diǎn)呢:

  • 開源:https://github.com/peachpiecompiler/peachpie

  • 跨平臺(tái):因?yàn)?PeachPie 完全構(gòu)建于 .NET 之上,因此也就跟著跨平臺(tái)了,Windows、MacOS、Linux 等等,從架構(gòu)上跨 x86、x86_64、ARM、ARM64,未來甚至還會(huì)有 MIPS、MIPS64、Risc-V 等等......

  • 純托管代碼:借助 VS 強(qiáng)大的調(diào)試器和 IDE 體驗(yàn),從開發(fā)、調(diào)試到測試、Profile 一條龍非常爽

  • 編譯:PHP 是沒有編譯之說的,這門動(dòng)態(tài)類型語言和 Python 面臨一樣的問題,幾乎無法在編譯時(shí)發(fā)現(xiàn)代碼中的錯(cuò)誤,即便借助 linter 診斷出了語法錯(cuò)誤也很難診斷出類型的錯(cuò)誤。而 PeachPie 則有完善的編譯器套件將 PHP 代碼完整的編譯為 .NET Standard 程序集,意味著在編譯期就做好了語法和類型檢查,保證了運(yùn)行時(shí)不會(huì)因?yàn)榇a問題導(dǎo)致程序崩潰,同時(shí)應(yīng)用分發(fā)的時(shí)候也不需要源代碼,確保了源碼安全

  • 與 .NET 互操作:PeachPie 在保留了 PHP 原本的生態(tài)基礎(chǔ)上做到了 PHP 和 .NET 的互操作,一個(gè) PeachPie 項(xiàng)目不但可以使用 PHP 原有生態(tài)中的包和插件,還能享受 .NET 的生態(tài),快樂超級(jí)加倍

  • 運(yùn)行在 .NET 上:CLR/CoreCLR 自帶久經(jīng)考驗(yàn)的 JIT 和 GC,因此通過 PeachPie 編譯的程序集運(yùn)行在 CLR/CoreCLR 之上則無需做任何的代碼改動(dòng)即可享受到這些東西,在 php-bench 中,借助 CoreCLR 平臺(tái)的 JIT,函數(shù)調(diào)用性能拉開了原來 PHP 幾個(gè)數(shù)量級(jí)

  • .NET Foundation 項(xiàng)目:背后有 .NET Foundation 支持,瓦利亞高品質(zhì),有保證

可是有人就要問了,為什么我不直接用 PHP 而是選用 PeachPie 曲線救國呢?

因?yàn)槲覙芬?,雨女無瓜(逃

開始使用#

本文開發(fā)環(huán)境采用 Visual Studio Code(需要安裝 PeachPie 插件),當(dāng)然你也可以用 Visual Studio 等其他開發(fā)工具。

安裝 PeachPie 最新的項(xiàng)目模板:

  
    
  
  
  

Copy

dotnet new -i Peachpie.Templates::*

然后就會(huì)出現(xiàn)三個(gè)新的項(xiàng)目模板:Console Application、Class library 和 ASP.NET Core Empty。

我們這次整個(gè) Console Application 看看。

  
    
  
  
  

Copy

dotnet new console -lang PHP

然后隨便寫點(diǎn)代碼:

  
    
  
  
  

Copy

<?php

function main()
{
   $students =
       array(
           array("first_name" => "Joe", "score" => 83, "last_name" => "Smith"),
           array("first_name" => "Frank", "score" => 92, "last_name" => "Barbson"),
           array("first_name" => "Benji", "score" => 90, "last_name" => "Warner")
       );
   
   foreach ($students as $value) {
       echo $value["first_name"], " ", $value["last_name"], "'s score is ", $value["score"], "\n";
   }
}

main();

用配置 .NET Core 項(xiàng)目的方式寫好 Visual Studio Code 需要的 tasks.json 和 launch.json,隨便下點(diǎn)斷點(diǎn)然后編譯 + F5 運(yùn)行!

編譯輸出(請無視掉我的霓虹語電腦環(huán)境):

  
    
  
  
  

Copy

.NET Core 向け Microsoft (R) Build Engine バージョン 16.7.0-preview-20220-01+80e487bff
Copyright (C) Microsoft Corporation.All rights reserved.

 復(fù)元対象のプロジェクトを決定しています...
 復(fù)元対象のすべてのプロジェクトは最新です。
 プレビュー版の .NET Core を使用しています。https://aka.ms/dotnet-core-preview をご覧ください
 PeachPie PHP Compiler version 0.9.981+565af85b9aafc42fe1af2f30ccd73ff093a2fad7
 PeachPieConsole -> C:\Users\hez20\source\repos\PeachPieConsole\bin\Debug\netcoreapp3.1\PeachPieConsole.dll

ビルドに成功しました。
   0 個(gè)の警告
   0 エラー

経過時(shí)間 00:00:12.98

Voila!

如何理解.NET中新PHP SDK + Runtime的PeachPie

輸出:

  
    
  
  
  

Copy

Joe Smith's score is 83
Frank Barbson's score is 92
Benji Warner's score is 90

如果去掉打錯(cuò)一個(gè)變量 $value 變成 $vuale 會(huì)怎么樣呢?

  
    
  
  
  

Copy

<?php

function main()
{
   $students =
       array(
           array("first_name" => "Joe", "score" => 83, "last_name" => "Smith"),
           array("first_name" => "Frank", "score" => 92, "last_name" => "Barbson"),
           array("first_name" => "Benji", "score" => 90, "last_name" => "Warner")
       );
   
   foreach ($students as $value) {
       echo $vuale["first_name"], " ", $value["last_name"], "'s score is ", $value["score"], "\n";
   }
}

main();

編譯輸出:

  
    
  
  
  

Copy

.NET Core 向け Microsoft (R) Build Engine バージョン 16.7.0-preview-20220-01+80e487bff
Copyright (C) Microsoft Corporation.All rights reserved.

 復(fù)元対象のプロジェクトを決定しています...
 復(fù)元対象のすべてのプロジェクトは最新です。
 プレビュー版の .NET Core を使用しています。https://aka.ms/dotnet-core-preview をご覧ください
 PeachPie PHP Compiler version 0.9.981+565af85b9aafc42fe1af2f30ccd73ff093a2fad7
program.php(13,14): warning PHP5007: Undefined variable: $vuale [C:\Users\hez20\source\repos\PeachPieConsole\PeachPieConsole.msbuildproj]
 PeachPieConsole -> C:\Users\hez20\source\repos\PeachPieConsole\bin\Debug\netcoreapp3.1\PeachPieConsole.dll

ビルドに成功しました。

program.php(13,14): warning PHP5007: Undefined variable: $vuale [C:\Users\hez20\source\repos\PeachPieConsole\PeachPieConsole.msbuildproj]
   1 個(gè)の警告
   0 エラー

経過時(shí)間 00:00:09.51

由于上述代碼在 PHP 中是合法代碼,因此為了保持兼容性,PeachPie 不會(huì)報(bào)錯(cuò)而是給了警告。

但如果我們少一個(gè)分號(hào)呢:

  
    
  
  
  


           

<?php

function main()
{
   $students =
       array(
           array("first_name" => "Joe", "score" => 83, "last_name" => "Smith"),
           array("first_name" => "Frank", "score" => 92, "last_name" => "Barbson"),
           array("first_name" => "Benji", "score" => 90, "last_name" => "Warner")
       )
   
   foreach ($students as $value) {
       echo $value["first_name"], " ", $value["last_name"], "'s score is ", $value["score"], "\n";
   }
}

main();

編譯輸出:

  
    
  
  
  

Copy

.NET Core 向け Microsoft (R) Build Engine バージョン 16.7.0-preview-20220-01+80e487bff
Copyright (C) Microsoft Corporation.All rights reserved.

 復(fù)元対象のプロジェクトを決定しています...
 復(fù)元対象のすべてのプロジェクトは最新です。
 プレビュー版の .NET Core を使用しています。https://aka.ms/dotnet-core-preview をご覧ください
 PeachPie PHP Compiler version 0.9.981+565af85b9aafc42fe1af2f30ccd73ff093a2fad7
program.php(12,5): error PHP2014: Syntax error: unexpected token 'foreach' [C:\Users\hez20\source\repos\PeachPieConsole\PeachPieConsole.msbuildproj]

ビルドに失敗しました。

program.php(12,5): error PHP2014: Syntax error: unexpected token 'foreach' [C:\Users\hez20\source\repos\PeachPieConsole\PeachPieConsole.msbuildproj]
   0 個(gè)の警告
   1 エラー

経過時(shí)間 00:00:01.77

這次就會(huì)直接報(bào)錯(cuò)了。

由此可見,使用 PeachPie 能夠無需第三方工具輔助,直接在編譯時(shí)就驗(yàn)證代碼正確性,對項(xiàng)目的健壯性有很大幫助。

PHP 與 .NET 互操作#

我們試試互操作,在 PHP 里面創(chuàng)建一個(gè) .NET 中的 HashSet<TValue>

  
    
  
  
  


           

<?php

function main()
{
   $list = new System\Collections\Generic\HashSet<string>;
   $list->Add("test");
   $list->Add("hello");
   $list->Add("hello");
   $list->Add("lol");
   foreach ($list as $key => $value) {
       echo $key, ": ", $value, "\n";
   }
}

main();

輸出:

  
    
  
  
  

Copy

0: test
1: hello
2: lol

完美,另外,鑒于 PHP 代碼最后都會(huì)被編譯成 .NET Standard 程序集,因此反過來當(dāng)然也沒問題,就不做介紹了。

一些坑#

PeachPie 已經(jīng)發(fā)展了好幾年的時(shí)間了,盡管大多數(shù) PHP 代碼都能正常運(yùn)行,但是標(biāo)準(zhǔn)庫仍存在一些兼容性問題,具體可以去這里跟蹤:https://docs.peachpie.io/compatibility-status 。

由于目前還在補(bǔ)全兼容性問題,所以很多優(yōu)化工作(比如數(shù)組的優(yōu)化)都沒有做,性能方面還有很大的提升空間。

不過官方目前開發(fā)進(jìn)度十分快,因此短時(shí)間內(nèi)就能看到大量的新庫函數(shù)被實(shí)現(xiàn),到目前已經(jīng)是 0.9.800,1.0 正式版也快要發(fā)布了,很快就能正式投入生產(chǎn)使用啦。

Blog 搭建#

回到前面的主題,有了 PeachPie,我就能把 WordPress 放到 .NET Core 上面跑啦。

當(dāng)然,直接下載下來 WordPress 的源代碼編譯跑到 ASP.NET Core 上面時(shí)會(huì)出現(xiàn)一些問題,比如資源加載全部 404,這是因?yàn)?PeachPie 在編譯 PHP 代碼時(shí)默認(rèn)不會(huì)將非 .php 的文件包含到編譯過程中,我們需要修改 .msbuildproj 調(diào)整項(xiàng)目屬性將資源文件包含在編譯過程中,并作為 Content 引入。

另外由于 WordPress 首次配置會(huì)現(xiàn)場生成一個(gè) config.php 文件,但是由于該文件是編譯后的程序集在運(yùn)行時(shí)生成的,未參與編譯過程,因此運(yùn)行時(shí)是找不到這個(gè)類的,除非重新編譯一遍。因此我們想采用更清真的方式,直接在 appsettings.json 里面寫入配置然后運(yùn)行時(shí)讀入代替原來的 config.php。

總之需要經(jīng)過一系列操作,并且編寫少量代碼。不過,PeachPie 已經(jīng)幫我們做好了這一切:iolevel 提供了一個(gè)即插即用的 WordPress 包 PeachPied.WordPress.AspNetCore(https://github.com/iolevel/wpdotnet-sdk ),可直接作為 ASP.NET Core 中間件使用,非常方便。

那么事情就簡單了:

  
    
  
  
  


           

dotnet new web
dotnet add package PeachPied.WordPress.AspNetCore --version 1.0.0-*

然后編寫少量服務(wù)端代碼,配置一下 https 跳轉(zhuǎn)、響應(yīng)壓縮和靜態(tài)文件什么的,再加入 WordPress 中間件:

Startup.cs

  
    
  
  
  


           

using System.Linq;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace KeBlogs
{
   public class Startup
   {
       // This method gets called by the runtime. Use this method to add services to the container.
       // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
       public void ConfigureServices(IServiceCollection services)
       {
           services.AddResponseCompression(options =>
           {
               options.Providers.Add<BrotliCompressionProvider>();
               options.Providers.Add<GzipCompressionProvider>();
               options.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(new[] {
                   "image/svg+xml",
                   "image/png",
                   "font/woff",
                   "font/woff2",
                   "font/ttf",
                   "font/eof",
                   "image/x-icon",
                   "application/json",
                   "application/octet-stream" });
           });
       }

       // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
       public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
       {
           app.UseHttpsRedirection();
           app.UseResponseCompression();

           if (env.IsDevelopment())
           {
               app.UseDeveloperExceptionPage();
           }

           app.UseDefaultFiles();
           app.UseStaticFiles();

           app.UseWordPress();
       }
   }
}

代碼部分搞定,當(dāng)然上述代碼你也可以用 PHP 來寫。

然后在 appsettings.json 寫入自己的配置,比如(SALT 部分可以沒有):

  
    
  
  
  


           

{
 "WordPress": {
   "dbhost":        "localhost",
   "dbpassword":    "password",
   "dbuser":        "root",
   "dbname":        "wordpress",
   "dbTablePrefix": "wp_",
   "SALT": {
     "AUTH_KEY":         "r(EoMbKEvlg){+!T42fh-e+~IGj-4q}g8HHB9hjbiC0J*ySU1Y*3z[3c}F;6=TA5",
     "AUTH_SALT":        "q0#AzvJ*[4~Bexa9*M(sC_#pDuGQBdjL1}j*RilSe0ku]P~KuTir[7PxjE:4)_zR",
     "LOGGED_IN_KEY":    "!AAienFSridCUzF(v}m#}_;+t%Rclg;mOPKwe;w7dN0M{d,]?8V+TRW_UG)tSswa",
     "LOGGED_IN_SALT":   "C=(4(8WPMeRu_h?g7!ddI*P:+SYU=3C%g)92oV}-y5tE0r?DHWl!fjPOp=bjx2YJ",
     "NONCE_KEY":        "Z[e37@=y)m.CHa:OSldh#RT@nIZxKYGwu!/hd:vK#^{_Ec7e{KNb(G.8ch/MkH(d",
     "NONCE_SALT":       ";v7Wv/BV)Pz{W,FaAKC0buH*5U4:g]qn~;b94x]f8=lm6!yyYSbW5*2y*kRXXEF5",
     "SECURE_AUTH_KEY":  "pc}_Pv52,m=j9l#llSkLVQib.Zm!;9FRzg:{(G]tM8}[}]pPDwB4k{xV+!e)9lmR",
     "SECURE_AUTH_SALT": "#n]+o^w/%-~MVzf{AUuxUAwF[n03r{kr^r1V?wqQ?Vjt}!0HSkCB-):u-ra1%tB="
   },
   "constants": {
   }
 }
}

然后發(fā)布我們的 WordPress!

  
    
  
  
  

Copy

dotnet publish -c Release

最后打包 bin/Release/netcoreapp3.1/publish 上傳到服務(wù)器上面,搭建好數(shù)據(jù)庫然后運(yùn)行即可。

完結(jié)撒花#

進(jìn)入管理面板,大多數(shù)主題、插件都能正常工作,安裝點(diǎn)主題,配置配置插件和 SMTP,就全部搞定啦。

如何理解.NET中新PHP SDK + Runtime的PeachPie

內(nèi)存占用 195 MB,運(yùn)行在 .NET Core 3.1.3 上,非常清真!

至此我的 Blog 搭建完成,歡迎大家訪問:https://hez2010.com 。

評(píng)論和注冊什么的也開放了,歡迎大家常光臨~

后續(xù)我也會(huì)不斷在上面更新文章,當(dāng)然,這個(gè) Blog 上面的內(nèi)容也就不僅限于編程啦,敬請期待~

如何理解.NET中新PHP SDK + Runtime的PeachPie

從此 PHP 也是 .NET 上的一門語言了,完結(jié)撒花~

上述內(nèi)容就是如何理解.NET中新PHP SDK + Runtime的PeachPie,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI