Linux, PHP, Nginx, Algorithm, Data, MySQL&NoSQL, Distributed System, JavaScript&HTML5&CSS3 and more…

发布一个查看PHP opcode的扩展模块及Web服务

Posted: 五月 16th, 2012 | Author: | Filed under: PHP&Zend内核 | Tags: , , ,

最近花了大约一星期的时间写了一个PHP扩展模块Opdumer,并封装成了Web服务(点击这里访问)。这个模块的主要内容是输出PHP代码对应的opcode。其实之前已经有一些用于查看opcode的扩展模块,如比较有名的vld。之所以重新实现一个这样的模块,主要是因为vld不支持PHP_FUNCTION API,也就是说vld只能用于CLI形式,而Opdumer同时拥有CLI API和PHP_FUNCTION API,另外,也想借助编写这个模块的机会学习Zend Engine中opcode的编译和执行机制。个人打算后面专门针对opcode的编译执行机制写一篇文章,而本文主要描述Opcode的使用方法及对应Web服务的使用。 阅读全文 »


Mac下配置MarsEdit作为wordpress客户端

Posted: 二月 24th, 2012 | Author: | Filed under: 经验技巧 | Tags: , , , ,

最近用信用卡分期搞了台Mac Air,加入了水果党。用了几天,虽然Mac下的软件不如Windows丰富,不过对于我这个码农来说已经够用了,唯独比较怀念Windows下的Live Writer。用它写博客很多年了,忽然没有了还真不习惯。另外我也不想在虚拟机中写博客,于是一直在寻找Live Writer的替代品。终于找到了一款让我比较满意的Mac下博客客户端MarsEdit。本文简单介绍一下MarsEdit连接WordPress的方法,算是我使用MarsEdit的试水之作。
阅读全文 »


PHP哈希表碰撞攻击原理

Posted: 一月 4th, 2012 | Author: | Filed under: PHP&Zend内核 | Tags: , ,

最近哈希表碰撞攻击(Hashtable collisions as DOS attack)的话题不断被提起,各种语言纷纷中招。本文结合PHP内核源码,聊一聊这种攻击的原理及实现。
阅读全文 »


PHP/Zend类型系统思维导图

Posted: 十二月 28th, 2011 | Author: | Filed under: PHP&Zend内核 | Tags: , , , ,

之前在阅读PHP和Zend源码的过程中,总结了一份xmind思维导图。这幅导图总结了PHP的各种类型、Zend中的类型对应、zval的结构及zend中各种操作zval的宏及方法。这幅导图可以作为学习zend类型系统的概览图,也可以在开发PHP扩展模块过程中用于参考。导图已上传至xmindshare
阅读全文 »


闭包漫谈(从抽象代数及函数式编程角度)

Posted: 十二月 5th, 2011 | Author: | Filed under: 程序设计语言理论 | Tags: , , ,

前言

如果Google一下“闭包”这个词,会发现网上关于闭包的文章已经不计其数,甚至很多人将闭包看做面试JavaScript程序员的必考题(虽然闭包和JavaScript没有什么必然联系)。既然如此,我为什么还要写一篇关于闭包的文章呢?

首先,虽然网上关于闭包的文章甚多,但是很少以较为形式化的角度阐述闭包,而我认为理解闭包的关键之一就是从形式化角度理解其涵义;其次,大多数文章将闭包的概念与JavaScript语言绑定太死,这样容易局限对闭包概念的理解,而难以窥探到其本质。从JavaScript去理解闭包,个人认为这是本末倒置的,应该先理解纯粹意义上的闭包,然后再理解JavaScript中的闭包机制。

基于以上情况,本文将从较为形式化的角度阐述闭包概念,当做对现有网络的资料的一个补充。
阅读全文 »


深入研究PHP及Zend Engine的线程安全模型

Posted: 十一月 4th, 2011 | Author: | Filed under: PHP&Zend内核 | Tags: , , ,

[本文已发表在程序员杂志2012年01期]

在阅读PHP源码和学习PHP扩展开发的过程中,我接触到大量含有“TSRM”字眼的宏。通过查阅资料,知道这些宏与Zend的线程安全机制有关,而绝大多数资料中都建议按照既定规则使用这些宏就可以,而没有说明这些宏的具体作用。不知道怎么回事总是令人不舒服的,因此我通过阅读源码和查阅有限的资料简要了解一下相关机制,本文是我对研究内容的总结。

本文首先解释了线程安全的概念及PHP中线程安全的背景,然后详细研究了PHP的线程安全机制ZTS(Zend Thread Safety)及具体的实现TSRM,研究内容包括相关数据结构、实现细节及运行机制,最后研究了Zend对于单线程和多线程环境的选择性编译问题。

阅读全文 »


如何使用PHP编写daemon process

Posted: 十月 24th, 2011 | Author: | Filed under: PHP应用 | Tags: ,

今天下午在segmentfault.com看到一个提问,提问标题是“PHP怎么做服务化”,其中问道php是不是只能以web方式调用。其实很多人对PHP的使用场景都有误解,认为php只能用于编写web脚本,实际上,从PHP4开始,php的使用场景早已不限于处理web请求。

从php的架构体系来说,php分为三个层次:sapi、php core和zend engine。php core本身和web没有任何耦合,php通过sapi与其它应用程序通信,例如mod_php就是为apache编写的sapi实现,同样,fpm是一个基于fastcgi协议的sapi实现,这些sapi都是与web server配合用于处理web请求的。但是也有许多sapi与web无关,例如cli sapi可以使得在命令行环境下直接执行php,embed sapi可以将php嵌入其它语言(如Lua)那样。这里我并不打算详细讨论php的架构体系和sapi的话题,只是说明从架构体系角度目前的php早已被设计为支持各种环境,而非为web独有。

除了架构体系的支持外,php丰富的扩展模块也为php在不同环境发挥作用提供了后盾,例如本文要提到的pcntl模块posix模块配合可以实现基本的进程管理、信号处理等操作系统级别的功能,而sockets模块可以使php具有socket通信的能力。因此php完全可以用于编写类似于shell或perl常做的工具性脚本,甚至是具有server性质的daemon process。

为了展示php如何编写daemon server,我用php编写了一个简单的http server,这个server以daemon process的形式运行。当然,为了把重点放在如何使用php编写daemon,我没有为这个http server实现具体业务逻辑,但它可以监听指定端口,接受http请求并返回给客户端一条固定的文本,整个过程通过socket实现,全部由php编写而成。
阅读全文 »


PHP Extension开发基础

Posted: 十月 21st, 2011 | Author: | Filed under: PHP&Zend内核 | Tags: ,

摘要&引言

PHP是当前应用非常广泛的一门语言,从国外的Facebook、Twitter到国内的淘宝、腾讯、百度再到互联网上林林总总的各种大中小型网站都能见到它的身影。PHP的成功,应该说很大程度上依赖于其开放的扩展API机制和丰富的扩展组件(PHP Extension),正是这些扩展组件使得PHP从各种数据库操作到XML、JSON、加密、文件处理、图形处理、Socket等领域无所不能。有时候开发人员可能需要开发自己的PHP扩展,当前PHP5的扩展机制是基于Zend API的,Zend API提供了丰富的接口和宏定义,加上一些实用工具,使得PHP扩展开发起来难度并不算特别大。本文将介绍关于PHP扩展组件开发的基本知识,并通过一个实例展示开发PHP扩展的基本过程。

阅读全文 »


HTTP Server开发相关学习资料整理推介

Posted: 十月 20th, 2011 | Author: | Filed under: Nginx | Tags: , , , ,

本文整理了我在学习过程中接触到的一些与HTTP Server有关的资料、文章及书籍,在这里分享给大家,希望对大家有所帮助。
阅读全文 »


使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

Posted: 十月 18th, 2011 | Author: | Filed under: Nginx | Tags: , , ,

为了提高性能,几乎所有互联网应用都有缓存机制,其中Memcache是使用非常广泛的一个分布式缓存系统。众所周知,LAMP是非常经典的Web架构方式,但是随着Nginx的成熟,越来越多的系统开始转型为LNMP(Linux+Nginx+MySQL+PHP with fpm),这是因为Nginx采用基于事件机制的I/O多路复用思想设计,在高并发情况下其性能远远优于默认采用prefork模式的Apache,另外,相对于Apache,Nginx更轻量,同时拥有大量优秀的扩展模块,使得在Nginx上可以实现一些美妙的功能。

传统上,PHP中使用memcache的方法是使用php-memcachephp-memached扩展操作memcache,然而在Nginx上有构建更高效缓存机制的方法,本文将首先介绍这种机制,然后介绍具体的操作步骤方法,最后将对这种机制和传统的PHP操作memcache的性能进行一个benchmark。

阅读全文 »