社区新闻

探索 WebAssembly 与 PHP 的未来

查看官方原文 ↗ 发布于

PHP 是一门极其流行的语言。互联网的很大一部分都运行在它之上。这包括基于流行内容管理系统(CMS)的网站,如 WordPressDrupal,基于框架的网站,如 SymfonyLaravel,以及纯 PHP 网站。

然而,当您想到 PHP 时,您脑海中浮现的可能是服务器端应用程序。您可以运行它的环境数量是有限的,不是吗?

想象一下,您现在可以在一系列新环境中运行 PHP 代码,例如浏览器、无服务器、边缘,甚至嵌入到不同的应用程序中。这为 PHP 开辟了一系列新的可能性。

此时,正是 PHP 与 WebAssembly 相遇的时刻。

什么是 WebAssembly?

WebAssembly 徽标。一个紫色方块,右下角有白色的 WA 字母。

WebAssembly,简称 Wasm,是面向不同语言的可移植编译目标。您无需将代码编译为 Linux Arm64,而是将其编译为 Wasm。生成的二进制文件采用一种与平台无关且针对大小进行优化的格式。

此模块可以在任何包含 Wasm 运行时(或 Wasm 虚拟机)的环境中运行,例如:

  • 浏览器:所有主流浏览器都包含 Wasm 运行时。您可以期望您的代码在 Chrome、Firefox、Safari 或 Bing 上运行,包括它们的移动版本。
  • 服务器:有多个专注于服务器端环境的 Wasm 运行时。
  • 容器运行时:多个容器运行时(如 containerd)支持 WebAssembly 模块,将 Wasm 的全部功能带给了 Kubernetes 和其他工具。例如,您可以使用 Docker 等流行工具来运行和管理 Wasm 模块。
  • 边缘平台:Cloudflare、Fastly 和 Vercel 等不同公司提供包含 Wasm 运行时的边缘计算平台。
  • 嵌入式系统:有针对非常小型设备的 Wasm 解释器。公平地说,由于资源限制,并非所有设备都能运行 PHP 解释器。

一些应用程序甚至游戏使用 WebAssembly 来扩展其功能。一个极好的例子是 Microsoft Flight Simulator,它允许人们使用 WebAssembly 插件来扩展它。

在 WebAssembly 中运行 PHP 为这门语言打开了所有这些新的用例。

WebAssembly 使 PHP 像 JavaScript 一样可移植

JavaScript 入门很简单,尤其是与 PHP 相比。它运行在 Web 浏览器中,因此您可以编写一行代码并在不离开浏览器的情况下运行它。事实上,您几乎可以在任何地方运行它,因为大多数设备都部署了支持 JavaScript 的浏览器。如今,典型的 JavaScript 学习体验涉及交互式教程,其中每一行代码都能给您即时的视觉反馈。

另一方面,学习 PHP 过去需要本地开发环境和 Web 服务器,这对新开发者来说非常麻烦。

使 JavaScript 如此流行的另一个特性是可移植性。想象一下,您花了几个月时间构建了一个 Web 应用程序,而您的客户现在想在平板电脑上以离线模式运行它。对于 JavaScript 应用程序,可能需要一些工作,但您将能够重用现有代码库的很大一部分。然而,如果这是一个 PHP 应用程序,您就处境不妙了——它不能在平板电脑上运行,您必须使用另一种编程语言从头开始构建一个新的应用程序。

WebAssembly 开辟了一系列新的可能性。一个惊人的例子是 WordPress Playground。它使用 WebAssembly 将 PHP 和 WordPress 带到几乎任何地方:

  • 浏览器:现在可以实现交互式教程(例如这个关于 WP_HTML_Tag_Processor 的教程)。
  • Visual Studio Code:设置 WordPress 开发环境只需要安装一个插件
  • 移动应用:Blocknotes 是一款 iOS 笔记应用,在 WebView 中运行整个 WordPress。完全相同的 WordPress 站点可以作为该应用的 Web 版本托管。
  • Node.js:wp-now 是一个 npm 包,无需安装 PHP、MySQL 或 Docker 即可启动 WordPress 开发环境。
  • 边缘服务器。

其影响是深远的!

WordPress Playground 网站的截图,显示在浏览器中运行的 WordPress 实例。它显示了一篇“Hello World”博客文章。

不同设备,相同的 WordPress

WordPress 作为一个 PHP CMS,以不可移植的服务器端应用程序形式占据了超过 40% 的网络份额。那只是开始。如今,得益于 WordPress Playground 和 PHP WASI 等项目,PHP 可以作为 WebAssembly 运行。

您能感受到这里新机遇的规模吗?想象一下 WordPress 作为一个笔记应用运行在您所有的设备上。或者作为去中心化的 Web 应用,专门在边缘服务器或区块链上运行。甚至是在您手机上直接运行的离线优先网站。

最棒的部分是什么?它适用于所有软件,而不仅仅是 PHP 和 WordPress。

在 WebAssembly 中运行不同语言

其他语言可以享受到与 PHP 相同的好处。在 VMware Wasm Labs 中,您可以找到一系列预编译到 WebAssembly 的语言和库。它包括 Ruby 和 Python 等语言,以及 SQLite 等流行库。

您可以运行 Ruby 或 Python 代码,而无需安装任何本地解释器。只需查看最新版本,下载模块并开始运行您的项目。这篇文章教您如何使用 WebAssembly 运行 Python 应用程序

跨不同语言共享库

WebAssembly 使 PHP 开发者能够使用其他编程语言构建的一流库。毕竟,同一个应用程序可以使用许多 WebAssembly 模块——它们最初是用哪种编程语言构建的并不重要。想象一个 PHP 应用程序,它使用 Pandas(一个 Python 库)处理数据,并使用 Apache POI(一个 Java 库)将其写入 Excel——所有这些都在移动应用中运行。

这是一个令人兴奋的未来,因为今天每种语言都需要提供自己的绑定来调用底层的 WebAssembly 代码。这正是即将推出的名为 Component-Model 的标准旨在解决的问题。该标准的目标是简化您的应用程序与多个 Wasm 模块或组件之间的可组合性

该提案包括一种用于定义 WebAssembly 模块接口的新语言。WIT,即 WebAssembly 接口类型,提供了一种可移植的方式来列出 WebAssembly 模块所需和公开的所有函数。使用 WIT 文件,您可以加载一个 wasm 模块并直接调用其方法——您的运行时已经知道需要什么参数和返回类型。

因此,随着 WebAssembly 生态系统的发展,您可能会开始看到 Ruby 开发者在他们的平板电脑上使用 Jupyter Notebooks 构建 WordPress 插件。

WebAssembly 增强安全性

一张带锁的挂锁图片,后面有植物。

常规程序有权访问与运行它们的用户相同的资源。这包括文件、内网站点、计算机内存等所有资源。相比之下,WebAssembly 程序是完全隔离或沙盒化的

在您计算机上运行的典型恶意程序可以读取您有权访问的文件并将其发送到远程服务器。然而,恶意 WebAssembly 程序只有在您明确授予其访问权限的情况下才能访问该文件。您处于控制之中,可以通过在没有磁盘或网络访问权限的情况下运行 WebAssembly 来阻止这种情况。

例如,VMware Wasm Labs 团队分析了 Archive_Tar PHP 库中的一个安全问题。恶意攻击者可以在 .tar 存档中的文件名前加上 file://,诱使该库在解压时覆盖非预期的文件。直接使用它是有风险的,但您可以缓解此问题。只需将其作为 WebAssembly 模块运行,并将文件系统访问权限限制在单个空目录即可——问题就解决了。

同样,WordPress Playground 支持 PHP 5.6,即使它不再接收安全修复。诀窍是什么?PHP 无法干扰您的文件或网络,因为它没有任何访问权限。

沙盒化既关乎安全性,也关乎可移植性。WebAssembly 程序不能仅仅假设它运行在一个甚至存在硬盘的环境中。也许它运行在分布式不可变的区块链虚拟机中?或者它运行在一个绑在海龟身上、没有可写持久内存的嵌入式跟踪设备上?WebAssembly 标准不做评判。 它将在所有情况下支持您。

WebAssembly 标准有时可能看起来过于局限。它是低级的,需要为每个模块提供绑定,并且不提供对系统功能的直接访问。但这正是它如此多功能的原因。它提供了一些定义明确的功能,以支持最大的灵活性和数量惊人的环境。

WebAssembly 提供了一些定义明确的功能,以支持最大的灵活性和数量惊人的环境。

结论

几个月前,PHP 还是一种学习曲线陡峭的服务器端软件。在编写第一个 PHP 脚本之前,您必须下载多个工具并配置环境。今天,它是一种功能强大、交互式、零设置的语言,可以在任何地方运行——并带来其丰富的生态系统。

WordPress Playground 项目就是一个很好的例子。WordPress 用户和开发者现在可以尝试主题、插件,并在不离开浏览器的情况下学习如何在真实实例中使用它。所有这些都无需更改 WordPress 源代码。

而这只是 WebAssembly 所能实现的开始!可互操作、沙盒化的库在整个技术栈中运行,有可能改变我们对创建软件的思考方式。

是时候开始思考一个整合且更广泛的生态系统了