这几天想基于 .NET Core 搞一个本身的博客网站,因而在网上搜刮各类博客引擎,找到了这些候选:Blogifier、Miniblog 以及 edi 写的 Moonglade。php
Blogifier:这是前端是个 Angular SPA 应用,不利于 SEO,同时首屏加载速度慢,所以排除。前端
Miniblog:顾名思义 Mini,能够完美承载内容可是主题实在是过于简单,没有可自定义性,所以排除。git
Moonglade:整体感受不错,界面设计得也很好,功能全面,然而须要 SQL Server 做为数据库,然而 SQL Server 虽然有 Linux 版本,但受限于主机配置和预算所以也被排除。github
难道就没有适合我需求的博客引擎了吗?答案固然是:有。web
众所周知 PHP 是世界上最好的语言(滑稽),仍是众所周知有一个叫作 WordPress 的博客引擎生态很是庞大,并且是使用 PHP 构建的。数据库
但是 PHP 和 .NET 又有什么关系呢?编程
PeachPie 是一个彻底构建于 .NET Standard 之上的一套完整的 PHP SDK + Runtime,包含编译器和运行时等等,兼容 PHP 5.4-7.4(固然部分功能仍在开发中)。json
那么 PeachPie 有什么优势呢:安全
但是有人就要问了,为何我不直接用 PHP 而是选用 PeachPie 曲线救国呢?
由于我乐意,雨女无瓜(逃
本文开发环境采用 Visual Studio Code(须要安装 PeachPie 插件),固然你也能够用 Visual Studio 等其余开发工具。
安装 PeachPie 最新的项目模板:
dotnet new -i Peachpie.Templates::*
而后就会出现三个新的项目模板:Console Application、Class library 和 ASP.NET Core Empty。
咱们此次整个 Console Application 看看。
dotnet new console -lang PHP
而后随便写点代码:
<?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 运行!
编译输出(请无视掉个人霓虹语电脑环境):
.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:\Users\hez20\source\repos\PeachPieConsole\bin\Debug\netcoreapp3.1\PeachPieConsole.dll ビルドに成功しました。 0 個の警告 0 エラー 経過時間 00:00:12.98
Voila!
输出:
Joe Smith's score is 83 Frank Barbson's score is 92 Benji Warner's score is 90
若是去掉打错一个变量 $value
变成 $vuale
会怎么样呢?
<?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();
编译输出:
.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:\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 個の警告 0 エラー 経過時間 00:00:09.51
因为上述代码在 PHP 中是合法代码,所以为了保持兼容性,PeachPie 不会报错而是给了警告。
但若是咱们少一个分号呢:
<?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 向け 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:\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 個の警告 1 エラー 経過時間 00:00:01.77
此次就会直接报错了。
因而可知,使用 PeachPie 可以无需第三方工具辅助,直接在编译时就验证代码正确性,对项目的健壮性有很大帮助。
咱们试试互操做,在 PHP 里面建立一个 .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();
输出:
0: test 1: hello 2: lol
完美,另外,鉴于 PHP 代码最后都会被编译成 .NET Standard 程序集,所以反过来固然也没问题,就不作介绍了。
PeachPie 已经发展了好几年的时间了,尽管大多数 PHP 代码都能正常运行,可是标准库仍存在一些兼容性问题,具体能够去这里跟踪:https://docs.peachpie.io/compatibility-status 。
因为目前还在补全兼容性问题,因此不少优化工做(好比数组的优化)都没有作,性能方面还有很大的提高空间。
不过官方目前开发进度十分快,所以短期内就能看到大量的新库函数被实现,到目前已是 0.9.800,1.0 正式版也快要发布了,很快就能正式投入生产使用啦。
回到前面的主题,有了 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 中间件使用,很是方便。
那么事情就简单了:
dotnet new web dotnet add package PeachPied.WordPress.AspNetCore --version 1.0.0-*
而后编写少许服务端代码,配置一下 https 跳转、响应压缩和静态文件什么的,再加入 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(); } } }
代码部分搞定,固然上述代码你也能够用 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": { } } }
而后发布咱们的 WordPress!
dotnet publish -c Release
最后打包 bin/Release/netcoreapp3.1/publish 上传到服务器上面,搭建好数据库而后运行便可。
进入管理面板,大多数主题、插件都能正常工做,安装点主题,配置配置插件和 SMTP,就所有搞定啦。
内存占用 195 MB,运行在 .NET Core 3.1.3 上,很是清真!
至此个人 Blog 搭建完成,欢迎你们访问:https://hez2010.com 。
评论和注册什么的也开放了,欢迎你们常光临~
后续我也会不断在上面更新文章,固然,这个 Blog 上面的内容也就不只限于编程啦,敬请期待~
今后 PHP 也是 .NET 上的一门语言了,完结撒花~