资讯专栏INFORMATION COLUMN

通过WebAssembly在浏览器运行PHP

ZHAO_ / 3220人阅读

摘要:演示地址,你可以在上面运行代码,然后通过复制地址栏分享代码。如果要让代码操作浏览器的,必须写扩展,使用的去调用,这还是可以做的。

演示地址:PIB: PHP in Browser,你可以在上面运行PHP代码,然后通过复制地址栏分享代码。

项目地址:oraoto/pib

某天晚上,在看Emscripten的文档,发现Emscripten有emconfigureemmake,可以直接用Emscripten替换编译器实现项目移植,灵光一现就有了这个项目。

性能测试

首先娱乐测试一下,改自eechen的测试,10万的数组填充和字符串拼接:


点我直接跑一下

我的电脑CPU是i5-6400,Chrome 66耗时0.35秒,Firefox耗时0.25秒,而原生PHP 7.2只需0.048秒,也就是说性能大约是原生PHP 7.2的1/7左右。

跑PHP源代码自带的Zend/bench.php

simple             0.288
simplecall         0.088
simpleucall        0.226
simpleudcall       0.241
mandel             1.138
mandel2            1.251
ackermann(7)       0.221
ary(50000)         0.037
ary2(50000)        0.033
ary3(2000)         0.626
fibo(30)           0.855
hash1(50000)       0.067
hash2(500)         0.084
heapsort(20000)    0.264
matrix(20)         0.285
nestedloop(12)     0.444
sieve(30)          0.178
strcat(200000)     0.043
------------------------
Total              6.369

而原生PHP 7.2只要0.591秒,差了近11倍。

功能测试

因为是直接编译PHP解析器,所以语言层面的大部分功能都是支持的,目前已知不支持的只有Generator(已支持)

下面是一些PHP7的新特性:

object类型

抽象方法重写

可空类型

Void函数

数组解构

类常量可见性

库函数方面支持比较少,默认只编译了datepcrebcmathctypejsonReflectionSPLtokenizerstandardCore这些扩展。

实现原理

原理并不复杂,就是用Emscripten把PHP解释器编译到WebAssembly,然后通过JavaScript调用Zend的API。

为了能让PHP解释器编译成功,需要对代码做少量修改,主要是文件系统相关的两处代码,我只直接注释掉或者return跳过代码。

对比现有方案

3v4l这种在服务端执行代码然后返回结果到前端的方案已经很成熟,在运行和分享PHP代码方面,PIB的优势就是省去了我部署服务器的钱(文件都在Github pages)。

也有其他的在浏览器直接运行PHP的方案:

php2wasm直接把PHP代码编译成wasm,现在还不成熟

pyhp.js用Pyton实现PHP解释器(PyHP,据作者说性能比PHP7好),然后再把这个解释器编译到JS,支持的特性有限,作者已经弃坑

而PIB已经支持了大部分PHP语言特性,不过性能和稳定性仍需提高。

未来

一开始设想是用PHP进行前端开发的,但是实现不容易,所以先做成这个样子了。

如果要让PHP代码操作浏览器的DOM,必须写PHP扩展,使用Emscripten的API去调用JavaScript,这还是可以做的。

而JavaScript很多接口都是需要回调的,Emscripten也是可以做到,但是只是回调到C/C++,如果要回调到PHP,就要自己实现协程方案,这我还做不了。

目前可以完善和尝试的:

语法检查

错误信息显示

减少代码体积

处理内存泄漏

如果你有什么有趣的想法,也不妨提个issue或者评论一下。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28723.html

相关文章

  • WebAssembly 系列(六)WebAssembly 的现与未来

    摘要:目前正在开发两个编译器系统。这就意味着有很多功能还在襁褓之中,没有经过彻底思考以及实际验证。这些特性叫做未来特性。实现这一功能将会使用中的,而这一功能的实现将会提高程序执行的效率。目前浏览器在逐渐支持用标记来加载模块。 作者:Lin Clark 编译:胡子大哈 翻译原文:http://huziketang.com/blog/posts/detail?postId=58ce7fd3a6...

    mcterry 评论0 收藏0
  • WebAssembly起步

    摘要:解析下载后,需要引擎经过两个阶段转换成,然后再转换为浏览器需要的中间字节码。未来所有支持编译到字节码的编程语言,理论上都可以输出。 了解WebAssembly原理 WebAssembly是一种可以在浏览器上运行的二进制可执行格式文件。它将成为浏览器进化史上又一次革命。 自从浏览器问世以来,javascript就成为浏览器上执行程序的唯一标准,越来越多的应用程序通过javascript开...

    shiina 评论0 收藏0
  • 图说 WebAssembly(六):现状与展望

    摘要:现状年月日,主流的四大浏览器达成了共识并宣布的最小可行产品已经完成。更快的函数调用当前,在中调用函数比想象的要慢。直接操作目前,没有任何方式能够操作。这就导致了部分应用可能会因此而推迟发布时间。结束现如今已经相当快速。 本文是图说 WebAssembly 系列文章的最后一篇。如果您还未阅读之前的文章,建议您从第一篇入手。 现状 2017 年 2 月 28 日,主流的四大浏览器达成了共识...

    clasnake 评论0 收藏0
  • WebAssembly 那些事儿

    摘要:的目标是对高级程序中间表示的适当低级抽象,即代码旨在由编译器生成而不是由人来写。表示把源代码变成解释器可以运行的代码所花的时间表示基线编译器和优化编 WebAssembly 那些事儿 什么是 WebAssembly? WebAssembly 是除 JavaScript 以外,另一种可以在网页中运行的编程语言,并且相比之下在某些功能和性能问题上更具优势,过去我们想在浏览器中运行代码来对网...

    邱勇 评论0 收藏0

发表评论

0条评论

ZHAO_

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<