不清楚 BPC 是什么的参看这里:
开发了一年多的 PHP 编译器 BPC 初见成效,发一些测试程序给大家看看
在过去的 3 个多月里,我们完成了 apache2 module mod_bpc 的开发,使得 bpc 可以将 php web 项目编译成动态链接库文件(.so)加载到 apache2 里,像 mod_php 那样运行.
扩展方面,我们实现了 session,spl,pdo,pdo_mysql,pdo_sqlite,filter.
php 方面,我们改写了 phpunit,使之能够编译运行.
mod_bpc 提供 web 访问,session 管理用户状态,pdo 连接数据库,phpunit 测试保障.到此,php web 开发的最小核心都 ready 了.
两年前,我写了一本电子书 《 PHPUnit in Action --- The Easy Way 》.
这本书通过一个完整的实战项目介绍了云招 OurATS 11 年来实践 PHPUnit/DbUnit 的经验.
这个实战项目是一个极简的 blog 项目,但麻雀虽小,五脏俱全,包含了用户注册 /激活 /登录 /退出 /文章的 CURD/打标签 /上传文件等功能及相应的测试方法.
这里我使用 bpc 将其编译成动态链接库,给大家展示下 bpc 编译的 web 项目是什么样子的.
该项目的 php 源码在这里: https://github.com/heguangyu5/PHPUnit-in-Action-Code/tree/bpc/ourblog
由于 php 代码最终被编译成了动态链接库,所以运行此项目不需要 php 环境.
以下假设我们在一台全新的 Ubuntu 18.04 amd64 server 上部署此项目.
sudo apt install apache2 mysql-server
由于 apache 默认启用了 module mpm_event,而我们需要 mpm_prefork,所以切换下.
sudo a2dismod mpm_event
sudo a2enmod mpm_prefork
wget https://www.ourats.com/bpc/ourblog/our_blog.sql
sudo mysql < our_blog.sql
bpc 的 pdo_mysql 扩展基于 libmysqlclient 实现,所以需要先安装 libmysqlclient.
sudo apt install libmysqlclient20
wget https://www.ourats.com/bpc/ourblog/bpc-common-2.0.tar.gz
sudo tar -C / -zxf bpc-common-2.0.tar.gz
wget https://www.ourats.com/bpc/ourblog/libapache2-mod-bpc.tar.gz
sudo tar -C / -zxf libapache2-mod-bpc.tar.gz
sudo ldconfig
sudo a2enmod bpc
wget https://www.ourats.com/bpc/ourblog/libourblog_u-4.4a.so
sudo mv libourblog_u-4.4a.so /usr/local/lib/
配置 /usr/local/etc/bpc.conf
将 libourblog_u-4.4a.so
以 web lib 加载.
sudo vi /usr/local/etc/bpc.conf
# 最后一行 (web-libs bpctest) 改为
(web-libs ourblog)
配置 apache 虚拟主机
wget https://www.ourats.com/bpc/ourblog/bpc.ourblog.me.conf
sudo mv bpc.ourblog.me.conf /etc/apache2/sites-available/
sudo mkdir /var/www/bpc.ourblog.me
sudo touch /var/www/bpc.ourblog.me/index.php
sudo mkdir /var/www/bpc.ourblog.me/upload
sudo chown www-data:www-data /var/www/bpc.ourblog.me/upload
sudo a2enmod rewrite
sudo a2ensite bpc.ourblog.me.conf
sudo systemctl restart apache2
修改本机 /etc/hosts
将 bpc.ourblog.me 指向 Ubuntu 18.04 amd64 server 的 IP 地址.
浏览器访问 http://bpc.ourblog.me 即可.
要想进一步使用各个功能,需要点击 Sign Up 注册一个帐号,然后去数据库 mail_queue 表中找到激活链接激活帐号.然后就可以点击 Sign In 登录到后台进行文章的 CURD 操作.文件上传在 admin/upload.php
页面.
到此,一个 bpc 编译的极简的 php web 项目就运行起来了.
phpunit 可以很好地保障编译后的 php 代码和 php 本身运行效果一致.
《 PHPUnit in Action --- The Easy Way 》 的读者可以下载 sync-test-db.sh
run-test
和 run-all-tests-bpc.sh
试一下.
运行这几个程序需要 《 PHPUnit in Action --- The Easy Way 》中构建的 mysql-3307,所以如果你没有环境就不用试了.
运行效果如下:
wget https://www.ourats.com/bpc/ourblog/sync-test-db.sh
wget https://www.ourats.com/bpc/ourblog/run-test
wget https://www.ourats.com/bpc/ourblog/run-all-tests-bpc.sh
chmod a+x sync-test-db.sh run-test run-all-tests-bpc.sh
mkdir -p ./OurBlog/Upload
wget -O OurBlog/Upload/ourats.png https://www.ourats.com/css/img/logo-white.png
./sync-test-db.sh
./run-all-tests-bpc.sh
=== Run Reg,Activate ===
PHPUnit 4.8.36 by Sebastian Bergmann and contributors.
.....................
Time: 98 ms, Memory: 26.84MB
OK (21 tests, 41 assertions)
=== Run BaseDbTablesInit ===
PHPUnit 4.8.36 by Sebastian Bergmann and contributors.
.
Time: 33 ms, Memory: 17.54MB
OK (1 test, 1 assertion)
=== Run Others ===
PHPUnit 4.8.36 by Sebastian Bergmann and contributors.
.........................................
Time: 208 ms, Memory: 43.46MB
OK (41 tests, 75 assertions)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.