PHP

PHP的执行原理/执行流程

更深入的学习和了解可以查看下面:

风雨的博客http://www.laruence.com/2008/08/12/180.html

百度研发中心的博客http://stblog.baidu-tech.com/?p=763

王兴宾的博客http://blog.csdn.net/wanghao72214/article/details/3916825

简介
  先看看下面这个过程:

  • 我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;
  • PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);
  • PHP总共有三个模块:内核、Zend引擎、以及扩展层;
  • PHP内核用来处理请求、文件流、错误处理等相关操作;
  • Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;
  • 扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;
  • 当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;
  • 最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。

PHP扩展段错误调试

Linux下的C程序常常会因为内存访问错误等原因造成segment fault(段错误)此时如果系统core dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdb对core文件进行分析,还原系统发生段错误时刻的堆栈情况。这对于我们发现程序bug很有帮助。
使用ulimit -a可以查看系统core文件的大小限制;使用ulimit -c [kbytes]可以设置系统允许生成的core文件大小。…

    

Socket 深度探究 4 PHP (三)

看过前两篇文章《Socket深度探究4PHP(一)》和《Socket深度探究4PHP(二)》,大家应该对目前 Socket 技术的底层有了一定的了解。本文我们会对 PHP-5.3.6 的源码中的 Socket 模块进行一定的分析,然后再简单介绍一下目前比较热门的一些相关技术,比如 Node.js 等。

自 PHP4 之后,越来越多的模块都被作为扩展提取出来(可单独编译),都在 PHP 源码的 ext 目录下面,因此我们我需要先进入 ext/sockets/ 目录,做过 PHP 扩展的同学应该都很熟悉下面的一些文件了,这次我们主要分析的是 php_sockets.h 和 sockets.c 这两个 C 源码文件。…

    

Socket 深度探究 4 PHP (二)

上一篇《Socket深度探究4PHP(一)》中,大家应该对 poll/select/epoll/kqueue 这几个 IO 模型有了一定的了解,为了让大家更深入的理解 Socket 的技术内幕,在这个篇幅,我会对这几种模式做一个比较详细的分析和对比;另外,大家可能也同说过 AIO 的概念,这里也会做一个简单的介绍;最后我们会对两种主流异步模式 Reactor 和 Proactor 模式进行对比和讨论。

首先,然我们逐个介绍一下 2.6 内核(2.6.21.1)中的 poll/select/epoll/kqueue 这几个 IO 模型。…

    

Socket 深度探索 4 PHP (一)

Socket(套接字)一直是网络层的底层核心内容,也是 TCP/IP 以及 UDP 底层协议的实现通道。随着互联网信息时代的爆炸式发展,当代服务器的性能问题面临越来越大的挑战,著名的 C10K 问题(http://www.kegel.com/c10k.html)也随之出现。幸亏通过大牛们的不懈努力,区别于传统的 select/poll 的 epoll/kqueue 方式出现了,目前 linux2.6 以上的内核都普遍支持,这是 Socket 领域一项巨大的进步,不仅解决了 C10K 问题,也渐渐成为了当代互联网的底层核心技术。libevent 库就是其中一个比较出彩的项目(现在非常多的开源项目都有用到,包括 Memcached),感兴趣的朋友可以研究一下。…

    

php deamon 后台服务 php http server

[php]
<?php
//Accpet the http client request and generate response content.
//As a demo, this function just send "PHP HTTP Server" to client.</pre>
<!--more-->
<pre>

function handle_http_request($address,$port)
{
$max_backlog=16;
$res_content="HTTP/1.1 200 OK"."\r\n".
"Content-Length:15"."\r\n".
"Content-Type:text/plain;charset=UTF-8"."\r\n\r\n".
"PHP HTTP Server";

$res_len=strlen($res_content);
//Create, bind …

    

PHP设计模式(三)

  • 注册器模式

这种模式比较简单好理解,在PHP框架中会经常用到,在某些比较大的PHP框架中,会在初始化时将一些常用的类实例放在注册器中,实际是存在注册器类中的一个静态数组中,以后想去用它的话,直接根据名称就可以获取到注册器中保存的实例。而不需要再次去new这个类、getInstance或者工厂方法获得。我感觉这种模式有点像是把单例模式和简单工厂模式结合起来了,实例化之后保存在一个静态数组中(类似单例模式的静态变量),然后可以根据不同的参数去获取注册过的实例,这里跟简单工厂模式相比较的话,他可以动态的添加实例进去,而不需要去修改代码,但这里要注意的就是必须先注册才可以获取。

这个模式要注意几个要点:

1. 首先就是要一个管理要注册的实例的类(例如:Register),我们就加他注册类吧。

2. 这个注册类必须有一个静态数组变量,采用键值数组(哈希)方式存储这些注册的实例,其中键对应实例名,值对应实例。

3. 当然了,_set、_get、_unset(采用下划线开始仅仅是因为unset是关键字,然后为了统一,就都加上了)这些方法都不能少,用来设置、获取、和销毁注册器中的内容。

PHP设计模式(二)

从最近开始我给自己定了个目标,每周至少更新2篇博客,用来记录自己在上一周里面遇到的问题或者想出的新点子,一方面对自己掌握的知识进行记录,免得时间久了忘得一干二净,二来我的博文虽然不怎么好但也许会对一小部分读者产生一定的影响,而且我相信随着我原创博文写的次数越来越多,肯定水平会越来越高,深度也会越来越深(哈哈,我也很羡慕那些出名的博主,不但专业知识很棒,而且文笔也棒的很)。一周两篇我发现完全记录不完我想记录的东西,就像这周,我还有日志系统、二进制数据缓存(其实叫low一点的数据库比较合适)、QQwry.dat数据解读、zip压缩文件增量生成这几个方面的都没有进写,在以后的时间里我会慢慢更新到我的博客的,好了不扯了,这次我来介绍另外一种模式。…