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

项目地址:oraoto/pib

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

性能测试

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

<?php$start = microtime(true);$arr = [];for ($i = 0; $i < 100000; $i++) {$time = microtime(true);$arr[$i . '_' . $time] = $time;
}echo (microtime(true) - $start) . PHP_EOL;

点我直接跑一下

我的电脑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,就要自己实现协程方案,这我还做不了。

目前可以完善和尝试的:

  1. 语法检查
  2. 错误信息显示
  3. 减少代码体积
  4. 处理内存泄漏

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

通过WebAssembly在浏览器运行PHP相关推荐

  1. JS高级——浏览器运行前端项目的原理及流程

    一.认识浏览器 二.V8引擎 三.V8引擎中执行JS代码过程(涉及执行上下文.作用域提升) 四.浏览器事件循环-微任务和宏任务 一.认识浏览器 在生活中或者是工作中,我们对浏览器已经非常熟悉,比如谷歌 ...

  2. 为什么说 WebAssembly 属于浏览器之外? Why WebAssembly Belongs Outside the Browser

    Why WebAssembly Belongs Outside the Browser 原文 https://www.wasm.builders/thomastaylor312/why-webasse ...

  3. 运行python需要网吗-浏览器运行python脚本吗

    Python的脚本不是用浏览器运行的.要运行Python程序,需要用到Python解释器. python解释器是一种让其他程序运行起来的程序.Python也有一个名为解释器的软件包,当你编写了一段Py ...

  4. 微软上线Try .NET,支持在浏览器运行C#代码

    微软Try .NET项目近期上线,这一项目允许用户通过浏览器运行和编写C#代码,同时还支持完整的代码提示. 用户可以通过访问这一项目官网(点此进入)对Try .NET这一项目进行简单了解.该项目允许开 ...

  5. edge浏览器运行不流畅怎么办 提高edge浏览器速度的方法

    edge浏览器是win10系统的专用浏览器,它代替了慢吞吞的IE,很多人觉得edge浏览器运行速度快,但是有时候浏览某些网站的时候会不流畅,所以怎么提高edge浏览器的运行速度呢,小编就来教教大家. ...

  6. 通过浏览器启动php cli,Cron作业PHP脚本失败但脚本将通过CLI或浏览器运行

    我有几个我试图设置的PHP脚本(最近移动到新服务器),它们将从命令行和浏览器运行,但只有一个将通过cron运行,另一个似乎有权限问题,如果文件是设置为644我从cron收到此消息:/ bin / sh ...

  7. MyEclipse2014用外部的浏览器运行web项目

    首先还是先打开我们的MyEclipse 2014 编辑器 然后选择Windows选项 下的preferences(首选项)选项 然后在弹出的首选项设置界面 选择General选项 打开 然后选择Web ...

  8. 浏览器运行java的方法_通过浏览器运行java程序的两种方法

    方法一:Applet技术 现在有一个application,要把它转换成Applet. 首先,用eclipse打开这个项目. 然后找到要改的java类,让这个类继承Applet类或者JApplet类. ...

  9. 详细判断浏览器运行环境

    作者:JowayYoung 仓库:Github.CodePen 博客:掘金.思否.知乎.简书.头条.CSDN 公众号:IQ前端 联系我:关注公众号后有我的微信哟 特别声明:原创不易,未经授权不得对此文 ...

最新文章

  1. 如何让网页不受电信114劫持
  2. oracle分片键,数据库SQL语句及性能优化
  3. 远程研发能有多高效?手淘新版本上线只用了5天!
  4. bzoj2442codevs4654 单调队列优化dp
  5. IBASE important table
  6. Teams Bot如何做全球化
  7. 一个项目的整个测试流程
  8. 用node.js读写文件
  9. linux 红帽6系统下载,Red Hat Enterprise Linux 6.2 ISO 下载
  10. 【转】前端进阶之路:如何高质量完成产品需求开发
  11. 80. 删除排序数组中的重复项 II
  12. 见证“开放式多路供水”的技术难度应大于人类上天!
  13. Android设置输入法
  14. 《深度思维》读书笔记
  15. 你的计算机没有安装cad2006,win7安装autocad2006无法正常的2种解决方法
  16. c语言怎么读取西门子plc数据,怎样读取西门子PLC中的程序
  17. 计算机无法正常更新,无法完成更新正在撤销更改请不要关闭你的计算机的解决方法...
  18. 纯干货:分享一些跨境电商客服经常会用到的话术(含中英文)
  19. 解决腾讯地图标记多个点,只渲染最后一个点问题
  20. 查找list中重复数据

热门文章

  1. java对象转为json字符串
  2. SQL备份与恢复之备份类型和选项
  3. Dot Net设计模式—外观模式
  4. 新一代HTML5开发工具Wijmo子控件详解
  5. C#实现动态桌面背景图片切换
  6. C++C#外挂(内存修改)
  7. PHP PSR-2 代码风格规范 (中文版)
  8. 【2014】【辛星】【php】【秋季】【2】第一个php程序
  9. 三星6.0系统手机最简单激活XPOSED框架的教程
  10. C++编写Config类读取配置文件