介绍一个根据 .NET 的船新 PHP SDK + Runtime: PeachPie

介绍一个根据 .NET 的船新 PHP SDK + Runtime: PeachPie

前语#
这几天想根据 .NET Core 搞一个自己的博客网站,所以在网上搜刮各种博客引擎,找到了这些候选:Blogifier、Miniblog 以及 edi 写的 Moonglate。

Blogifier:这是前端是个 Angular SPA 运用,不利于 SEO,一起首屏加载速度慢,因而扫除。

Miniblog:望文生义 Mini,能够完美承载内容可是主题实在是过于简略,没有可自定义性,因而扫除。

Moonglate:整体感觉不错,界面设计得也很好,功用全面,可是需求 SQL Server 作为数据库,可是 SQL Server 虽然有 Linux 版别,但受限于主机装备和预算因而也被扫除。

莫非就没有合适我需求的博客引擎了吗?答案当然是:有。

众所周知 PHP 是世界上最好的言语(诙谐),仍是众所周知有一个叫做 WordPress 的博客引擎生态十分巨大,而且是运用 PHP 构建的。

可是 PHP 和 .NET 又有什么关系呢?

PeachPie#
PeachPie 是一个彻底构建于 .NET Standard 之上的一套完好的 PHP SDK + Runtime,包括编译器和运转时等等,兼容 PHP 5.4-7.4(当然部分功用仍在开发中)。

官网:https://www.peachpie.io

那么 PeachPie 有什么长处呢:

开源:https://github.com/peachpiecompiler/peachpie
跨渠道:因为 PeachPie 彻底构建于 .NET 之上,因而也就跟着跨渠道了,Windows、MacOS、Linux 等等,从架构上跨 x86、x86_64、ARM、ARM64,未来乃至还会有 MIPS、MIPS64、Risc-V 等等......
纯保管代码:凭借 VS 强壮的调试器和 IDE 体会,从开发、调试到测验、Profile 一条龙十分爽
编译:PHP 是没有编译之说的,这门动态类型言语和 Python 面对相同的问题,简直无法在编译时发现代码中的过错,即使凭借 linter 确诊出了语法过错也很难确诊出类型的过错。而 PeachPie 则有完善的编译器套件将 PHP 代码完好的编译为 .NET Standard 程序集,意味着在编译期就做好了语法和类型查看,确保了运转时不会因为代码问题导致程序溃散,一起运用分发的时分也不需求源代码,确保了源码安全
与 .NET 互操作:PeachPie 在保留了 PHP 本来的生态基础上做到了 PHP 和 .NET 的互操作,一个 PeachPie 项目不光能够运用 PHP 原有生态中的包和插件,还能享用 .NET 的生态,高兴超级加倍
运转在 .NET 上:CLR/CoreCLR 自带久经考验的 JIT 和 GC,因而通过 PeachPie 编译的程序集运转在 CLR/CoreCLR 之上则无需做任何的代码改动即可享用到这些东西,在 php-bench 中,凭借 CoreCLR 渠道的 JIT,函数调用功能拉开了本来 PHP 几个数量级
.NET Foundation 项目:背面有 .NET Foundation 支撑,瓦利亚高品质,有确保
可是有人就要问了,为什么我不直接用 PHP 而是选用 PeachPie 曲线救国呢?

因为我愿意,雨女无瓜(逃

开始运用#
本文开发环境选用 Visual Studio Code(需求装置 PeachPie 插件),当然你也能够用 Visual Studio 等其他开发东西。

装置 PeachPie 最新的项目模板:

Copy
dotnet new -i Peachpie.Templates::*
然后就会呈现三个新的项目模板:Console Application、Class library 和 ASP.NET Core Empty。

咱们这次整个 Console Application 看看。

Copy
dotnet new console -lang PHP
然后随意写点代码:

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 项目的方法写好 Visual Studio Code 需求的 tasks.json 和 launch.json,随意下点断点然后编译 + F5 运转!

编译输出(请无视掉我的霓虹语电脑环境):

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

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

ビルドに成功しました。

0 個の正告
0 エラー

経過時間 00:00:12.98
Voila!

输出:

Copy
Joe Smith's score is 83
Frank Barbson's score is 92
Benji Warner's score is 90
假如去掉打错一个变量 $value 变成 $vuale 会怎么样呢?

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.

復元対象のプロジェクトを決定しています...
復元対象のすべてのプロジェクトは最新です。
プレビュー版の .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:Usershez20sourcereposPeachPieConsolePeachPieConsole.msbuildproj]
PeachPieConsole -> C:Usershez20sourcereposPeachPieConsolebinDebugnetcoreapp3.1PeachPieConsole.dll

ビルドに成功しました。

program.php(13,14): warning PHP5007: Undefined variable: $vuale [C:Usershez20sourcereposPeachPieConsolePeachPieConsole.msbuildproj]

1 個の正告
0 エラー

経過時間 00:00:09.51
因为上述代码在 PHP 中是合法代码,因而为了坚持兼容性,PeachPie 不会报错而是给了正告。

但假如咱们少一个分号呢:

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();
编译输出:

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

復元対象のプロジェクトを決定しています...
復元対象のすべてのプロジェクトは最新です。
プレビュー版の .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:Usershez20sourcereposPeachPieConsolePeachPieConsole.msbuildproj]

ビルドに失敗しました。

program.php(12,5): error PHP2014: Syntax error: unexpected token 'foreach' [C:Usershez20sourcereposPeachPieConsolePeachPieConsole.msbuildproj]

0 個の正告
1 エラー

経過時間 00:00:01.77
这次就会直接报错了。

由此可见,运用 PeachPie 能够无需第三方东西辅佐,直接在编译时就验证代码正确性,对项目的健壮性有很大协助。

PHP 与 .NET 互操作#
咱们试试互操作,在 PHP 里边创立一个 .NET 中的 HashSet:

Copy
<?php

function main()
{

$list = new SystemCollectionsGenericHashSet<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 代码最终都会被编译成 .NET Standard 程序集,因而反过来当然也没问题,就不做介绍了。

一些坑#
当然,PeachPie 现在还处于比较前期阶段,虽然大多数 PHP 代码都能正常运转,可是规范库仍存在一些兼容性问题,详细能够去这儿盯梢:https://docs.peachpie.io/compatibility-status 。

也正是因为仍是处于前期状况,所以许多优化作业(比方数组的优化)都没有做,功能方面还有很大的提高空间。

不过官方现在开发进度十分快,因而短时间内就能看到很多的新库函数被结束,到现在现已是 0.9.800,1.0 正式版也快要发布了,很快就能正式投入生产运用啦。

Blog 建立#
回到前面的主题,有了 PeachPie,我就能把 WordPress 放到 .NET Core 上面跑啦。

当然,直接下载下来 WordPress 的源代码编译跑到 ASP.NET Core 上面时会呈现一些问题,比方资源加载悉数 404,这是因为 PeachPie 在编译 PHP 代码时默许不会将非 .php 的文件包括到编译进程中,咱们需求修正 .msbuildproj 调整项目特点将资源文件包括在编译进程中,并作为 Content 引进。

别的因为 WordPress 初次装备会现场生成一个 config.php 文件,可是因为该文件是编译后的程序集在运转时生成的,未参加编译进程,因而运转时是找不到这个类的,除非从头编译一遍。因而咱们想选用更清真的方法,直接在 appsettings.json 里边写入装备然后运转时读入替代本来的 config.php。

总归需求通过一系列操作,而且编写少数代码。不过,PeachPie 现已帮咱们做好了这一切:iolevel 供给了一个即插即用的 WordPress 包 PeachPied.WordPress.AspNetCore(https://github.com/iolevel/wpdotnet-sdk ),可直接作为 ASP.NET Core 中间件运用,十分便利。

那么作业就简略了:

Copy
dotnet new web
dotnet add package PeachPied.WordPress.AspNetCore --version 1.0.0-*
然后编写少数服务端代码,装备一下 https 跳转、呼应紧缩和静态文件什么的,再参加 WordPress 中间件:

Startup.cs

Copy
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();
}
}

}
代码部分搞定,当然上述代码你也能够用 PHP 来写。

然后在 appsettings.json 写入自己的装备,比方(SALT 部分能够没有):

Copy
{
"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": {
}

}
}
然后发布咱们的 WordPress!

Copy
dotnet publish -c Release
最终打包 bin/Release/netcoreapp3.1/publish 上传到服务器上面,建立好数据库然后运转即可。

结束撒花#
进入办理面板,大多数主题、插件都能正常作业,装置点主题,装备装备插件和 SMTP,就悉数搞定啦。

内存占用 195 MB,运转在 .NET Core 3.1.3 上,十分清真!

至此我的 Blog 建立结束,欢迎我们拜访:https://hez2010.com 。

谈论和注册什么的也开放了,欢迎我们常莅临~

后续我也会不断在上面更新文章,当然,这个 Blog 上面的内容也就不只限于编程啦,敬请期待~

结束撒花~

作者: hez2010

出处:https://www.cnblogs.com/hez2010/p/12878619.html