我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。

笔记:PHP和PEAR, PHAR, PECL

这三个东西可以算是PHP中的高新技术了, 既”高科技”, 又是新东西.

有PHP开发经验的可能见过这几个词, 但真心估计没几个详细了解过的.

它们有一个共同点, 都是用来管理PHP的扩展的.

PECL

即PHP Extension Community Library, PHP扩展库.

这里的扩展指的是使用C语言编写的动态链接库扩展, 通过php.ini配置, 并随PHP进程被装入内存.

常见的PECL扩展比如:

  • apc – 字节码缓存器
  • xdebug – 调试工具
  • PDO_xxoo – 数据库驱动
  • memcache, mongo – NoSQL数据库驱动
  • markdown – 文本处理器
  • zip – 压缩算法

这种动态链接库又分两种, 一种是用户空间扩展, 如mongo, markdown, 旨在通过C代码提升性能, 为PHP代码提供更好的抽象.

另一种是Zend扩展, 这是对Zend内核(PHP引擎内核)的扩展, 如apc, xdebug.

PECL在Windows上并不好用, 通常的做法是直接下载形式如php_xxoo.dll的已编译好的二进制动态链接库.

下载时还应该选择对应PHP版本号, 处理器指令集, 线程安全性的版本.

据说PECL的基础设施还在建设中, 目前有个简陋的网页(http://downloads.php.net/pierre/)可以下载到一部分编译好的Windows PECL扩展.

而在Linux则方便不少, 比如要安装apc, 只需:

pecl install apc

即可, pecl是PHCL的命令行工具, 可以自动完成扩展的安装(通常是下载源代码后自动编译)工作.

PEAR

即PHP Extension and Application Repository, PHP扩展和应用库.

这里的扩展和应用, 指的是用PHP编写的软件包, 一系列类库性质的PEAR包会被安装到PHP的根目录, 然后你就可以在你的代码中直接包含(require)这些类库.

常见的PEAR包如:

  • phpDocumentor – 文档提取工具
  • PHPUnit – 单元测试框架
  • DB – 数据库封装

PEAR希望创建一个规范化的PHP源代码包仓库, PEAR本身也对源代码的格式提出了一些要求, 以便于让源码包更加通用和规范.

同时PEAR也是PECL的上级项目, PECL是PEAR的一部分, pecl的命令行工具也包含在PEAR中.

#安装标配的源码包:
pear install db
#PEAR也采用了`软件源`的设计, 安装非标配的软件包如phpunit, 需要先添加频道(软件源)
pear channel-discover pear.phpunit.de
pear install phpunit

PHAR

PHAR即PHP Archive, 起初只是PEAR中的一个库而已, 后来在PHP5.3后被重新编写成C扩展并内置到PHP中.

PEAR用来将多个.php脚本打包(也可以打包其他文件)成一个.phar的压缩文件(通常是ZIP格式).

目的在于模仿Java的.jar, 不对, 目的是为了让发布PHP应用程序更加方便. 同时还提供了数字签名验证等功能.

.phar文件可以像.php文件一样, 被PHP引擎解释执行, 同时你还可以写出这样的代码来包含(require) .phar 中的代码.

require("xxoo.phar");
require("phar://xxoo.phar/xo/ox.php");

PEAR中的很多源码包都通过PHAR打包.

bcompiler

提到了PHAR, 我还不得不提一下bcompiler, PHP bytecode Compiler, PHP字节码编译器.

虽然它目前只是个实验性项目. 可以通过pecl安装.

很多PHP编写的商业软件, 有闭源的需要, 通常它们会选择Zend Guard等商业代码加密软件, 它们成熟稳定, 但也价格昂贵.

其实bcompiler就能满足这个需求, 它可以将PHP代码编译成字节码, 虽然保密性不及商业加密软件, 但也很难被轻易修改, 而且因为省去了生成字节码的过程, 会有不少的性能提升, 官方表示编译后体积会减少到原来的20%, 性能会提高30%.

使用bcompiler编译出的PHP字节码文件可以直接使用(就像PEAR那样):

// xxoo.exe 是 xxoo.php 编译后的字节码.
require("xxoo.exe");

题外

有空我写个在线的PHAR和bcompiler编译工具.

宽容和公平

估计大家都有过类似的经历,在学校,某个同学做了些不太光彩的事情,比如偷拿别人东西,背后报复老师同学之类的,但又不知道是谁,班主任老师便会在同学面前威逼利诱,让犯错误的同学自己稍后私下找老师承认错误,然后承诺一定不会说出去。

从小学到初中,再到高中,这样的事情就没少过。前两天,我们班里又(之前有一次丢失若干手机的)出现了一次。班主任的汽车被不知谁划了一条道子。

班主任十分肯定是我们班某个同学故意为之,是在报复她。开始占用大量时间在自习时间和课上和我们讲这些事,还表示这件事如果不调查清楚她就没心思讲课。

一开始她说她已经猜到了是谁,希望这个人能够私下找她,她不会告诉大家,否则她一定让这个人没法在学校待下去。

一天以后,显然没人承认,她的态度软了下来,仍在占用大量时间讲这事,但明显没了起初的自信,看来她并不知道是谁,之前都是在诈。她让同学们每个人写张字条,“匿名”检举,提供线索和猜测,每个人必须写。

所谓匿名为何加引号?她的原话,我是语文老师啊,谁的笔迹不认得。

又过了一天,仍没人承认,班主任说第二天早上一定会去找学校方面查看监控录像,希望那个人能够抓住最后的机会。

第二天,然后,然后没了,没有人再提起过这件事。

以上是我尽可能客观(虽然仍有倾向性)地描述事情的经过。

让我很不爽的一点就是,凭我和班主任老师这关系,我绝对是重点怀疑对象。不过我自以为我还不是头号怀疑对象,我有自己的推测,不过显然我不会说。

以前的若干次类似事件,从来没有过,我离嫌疑人这么近。我开始思考,老师所谓的保护犯错误的同学的行为,真的公平么。

我也不知道最后有没有找到那个人,但无论如何,老师占用怎么多时间去讲之后,每个人都有自己的推测,都有自己的怀疑对象。这样对像我这样的重点怀疑对象公平么?永远没有揭开真相的机会。

如果说这种保护行为只是大家约定俗成的解决方案,那么老师让每个人写字条呢。如果说之前的保护行为只是对少数人不公平,那么写字条会把整个班级都带入一种互相怀疑的诡异气氛中。

我不相信每个人都是坦荡的,每个人都觉得有人在怀疑自己,不然就不会在事件过去之后只字不提,也不会换位思考,给犯错误的人一次匿名的机会。

我觉得除非自己真的被很多人怀疑(不,我说我很坦荡你信么,我只是深夜无聊胡思乱想而已),不会去深入思考这种司空见惯的事情。我在以前的类似事件也是如此,我记得一年前,班里丢手机的那次,我给老师的字条大意是丢失的几个手机也许不是一个人所为,甚至他们也许没有恶意,也许只是拿了别人的手机玩忘了还,结果事情闹大了又不敢还。

而这次我的字条的大意是前几段的委婉浓缩版。

很多时候,人们喜欢宽容少数弱势者,但结果没想到却是间接影响到了多数人的利益,比如城管赶小贩,比如举报高考作弊者。在这件事中,宽容了犯错者,却让其他所有人陷入猜疑,同时也让其他人对犯错有一种侥幸感──自己也可以不必对自己的行为负责。

其实这种事情也没什么标准解法,毕竟学生是未成年人,需要改过的机会。我只是希望再有类似的事件,如果希望宽容犯错者的话,那么点到为止,少说报警啊,让你不得好死一类的于事无补的狠话。或者应当在调查结束后告诉大家真相。不要让大家陷入猜疑之中。

题外:我也没打算给班主任看,之前的很多事情证明了她听不进去任何意见,她会首先质问你居心何在。

JYFM: 自动化电台录音下载平台

地址: http://fm.jybox.net/

我花了上个周末,两天的时间编写和测试,4月1日正式开始运行。

我早就想写这样一个东西了,我很早,大概小学的时候就开始听广播了。现在因为上学放学的路上无聊,也会听。但早晚高峰这个时间段实在没啥有意思的节目。而我之前听的节目(信不信由你)在晚上八点。所以我往往会听以往节目的录音。

很幸运,这各种需求的不是我一个。寅类(信不信由你的粉丝)就有帮忙录音并上传的好心人。在此之前一年我一直都在听桃子姐姐上传的录音。

其实在2010年我就参与过录音,当时还没有在线收听的方式,只能用收音机加手机来录,效果不好而且还麻烦。我当时录了两、三个月,然后因为中考的关系停了。

当新浪微电台出现的时候,我眼前一亮,我就想写这么一个程序了,可以自动从新浪微电台录音,并提供下载。但一直没动手,拖啊拖,拖到了现在。

附宣传稿:

地址(复制到浏览器,最好不要用IE): http://fm.jybox.net/
简单直接,清爽界面,不废话,进去就下。

这是基于新浪微电台的全自动录音系统,只要(我)设置好录哪些,它会自动录,节目完事之后,立刻就有下载链接。

如果新浪微电台没啥动作的话,应该可以一直录下去。

意见建议,Bug汇报:QQ群210564909.

其实这个东西很早就有这个构想了,早就该做了,一直拖到现在。

这是一个平台,不止可以录信不信由你,其他的节目,其他的频道只要新浪微电台有的都可以录。目前还录了975的其他三档节目。

你觉得那些值得录,可以来告诉我,QQ群210564909

PS:这个成本是灰常高的,流量可不便宜,目前应该可以比较轻松地支持每天100次下载。

再多的话就需要加点广告或者有闲钱的给我捐点钱…右面下方有我的支付宝链接,有闲钱的捐个十块八块的就行。

技术细节

我用50行的Go写了核心部分——从新浪微电台下载流媒体。下载下来的是flv格式,再加上下载结束时我采用的是很野蛮的截断方式,我怕一些播放器放不了,于是用ffmpge转码成了mp3格式。整个流程是用PHP写的脚本,用crontab定时启动,还有个PHP的Web页面用来显示录音列表。整个项目没有用到数据库,所有信息都是包含在文件名里面的,扩展起来可能不太方便。

目前是直接用服务器提供的下载,目前算下来每天最多能支持100次下载,再多就得用网盘了。

如果未来一段时间没有太多的用户,我就打算先这样了,不改了,放放广告收收捐款,回来点小钱就行。等我Go学精了,再用Go重写整个网站。

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2025-02-10.