Zend Signal in PHP 5.4

 

在PHP5.4中, 根据由Rasmus提交的RFC, 引入了一套新的信号处理机制, 目的是为了使得信号屏蔽机制可以应用到任何SAPI中, 并且提高在这个过程中的PHP性能.

新的机制, 叫做zend signal, 它的理念, 来自Yahoo的”延迟信号处理”(Yahoo signal deferring mechanism), 而后, facebook把这套理念加入了PHP中, 为了提升PHP+Apache 1.X下PHP调用ap_block/ap_unblock的性能.

在详细介绍之前, 我想还是先介绍下引入这个新机制的背景:

之前我写过俩篇blog, 介绍过因为超时信号导致PHP crash的案例:深入理解PHP内存管理之一个低概率Core的分析和一个低概率的PHP Core dump , 在其中, 我说过, 其实PHP在关键操作的时候, 是预留了信号屏蔽机制的:HANDLE_BLOCK和UNBLOCK_INTERRUPTIONS. 但是, 这俩个宏只是Hook, 需要SAPI自己去实现, 目前来说, 也只有Apache 1.x的SAPI实现了这俩个宏, 也就是使用ap_block和ap_unblock.

而对于”一个低概率的PHP Core dump “中所描述的情况, 如果我们为了解决它, 而在每次有错误发生的时刻, 都引入一对屏蔽/取消屏蔽的系统调用, 那么这个性能损失将会很明显, 所以一直没有很好的解决这个问题.

那么zend signal的做法是:

1. 在zend engine启动时刻, 会为下面的信号注册信号处理函数: SIGALRM, SIGHUP, SIGINT, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2, SIGPROF(*nix下), 如果这些信号已经有了处理函数, 那么会把旧的处理函数保存下来.

2. 当有信号发生时候, zend_signal_handler_defer会首先判断, 当前是否处于block区域, 如果不是, 则信号对应的旧的处理函数将会被调用. 如果是, 那么信号处理函数不会被立即调用, 而是一直等到HANDLE_UNBLOCK_INTERRUPTIONS以后, 退出block区域, 才调用信号处理函数. 如果有多个信号发生, 则信号将会排队等候.

3. zend signal使用zend_signal_globals_t.depth计数, 来判断是否处于block区域, HANDLE_BLOCK递增, HANDLE_UNBLOCK_INTERRUPTIONS递减.当 zend_signal_globals_t.depth大于0, 则表示在block中, 否则就表示不在. 这样就保证了性能(避免以前调用sigaction来屏蔽信号).

另外, zend signal为PHP提供了新的信号处理注册接口: zend_signal.

更加详细的信息, 可以参看[RFC]Zend Singal

在zend signal引入的大背景下, 我终于解决了文章开头所说的超时信号可能导致crash的问题:#60038. (only in 5.4)

不过, 还是要提醒下: PHP 5.4还处于开发阶段, 在最终release之前, 任何新特性都可能被调整或者更改. 如果大家有任何建议, 也欢迎反馈, 帮助我们使得PHP变得更好.

时间: 2024-09-19 11:06:37

Zend Signal in PHP 5.4的相关文章

我遇到一个奇怪的问题,php代码里面凡是含有//这样的注释,include 失败

问题描述 我遇到一个奇怪的问题,php代码里面凡是含有//这样的注释,include 失败 我遇到一个奇怪的问题,php代码里面凡是含有//这样的注释,就无法include 我是二次开发的,服务器上面原来的程序带//注释的就没有问题 但是我从服务器上面下载的代码到本地,所有的程序,导入eclipse后,每一行下面都会带一个空行 后来我把//的注释换成/*** /这样的就好了 下面是我贴出来的phpinfo信息,望大神指导 PHP Version 5.5.25 System Linux iZ238

Zend Framework教程之路由功能Zend_Controller_Router详解_php实例

本文实例讲述了Zend Framework教程之路由功能Zend_Controller_Router用法.分享给大家供大家参考,具体如下: Zend Framework的路由提供了两个主要功能路由和创建路由. Zend_Controller_Router的Route类和相应Route目录下的类定义常见的路由操作. 接口Zend_Controller_Router_Interface,类Zend_Controller_Router_Abstract和Zend_Controller_Router_R

Zend Optimizer 配置指南

Zend Optimizer是由PHP核心引擎"Zend"创建者Zend技术公司所开的免费PHP优化软件.据Zend公司透露使用这个软件某些情况下至少可以提高性能30%以上!这么好的免费大餐当然要用,现在我们来谈谈如何配置这套软件. Zend Opt的安装是傻瓜化的,安装向导会自动根据你的选择来修改php.ini帮助你启动这个引擎.下面我们来介绍下Zend Opt的配置选项,帮助你最大化自定义合理的配置.下边是我所用的配置文件,看不懂也不要着急,看完本文你就会完全明白. [Zend]z

C标准库<signal.h>实现

背景知识 signal.h是C标准函数库中的信号处理部分, 定义了程序执行时如何处理不同的信号.信号用作进程间通信, 报告异常行为(如除零).用户的一些按键组合(如同时按下Ctrl与C键,产生信号SIGINT).信号是程序执行过程中发生的异常事件,同步信号的产生 是因为程序自身的某些动作,例如除零或不正当的访问存储器,异步信号是由程序外部的行为引起的,比如有人敲击了提示键或者另外一个程序(异步地执行)给你 的程序发信号,都会引发一个异步信号.程序不能屏蔽的信号要求立即得到处理.如果不对发生的信号

Zend的Captcha机制

如何生成验证码图片?使用php的GD? ok,right.其实Zend的Captcha模块已经封装好了.这篇文章就说一下如何使用Zend的Captcha模块.   环境安装 首先Zend的Captcha需要安装GD.查看有没有安装GD需要去phpinfo()中看是否有GD模块.(注意,有可能出现php -m里面的模块有gd但phpInfo()里面的模块没有gd,这个问题是说明你的PHP和Apache没有安装对.具体请去google之) (如果在安装gd的过程中提示Missing Dependen

laravel安装zend opcache加速器教程

 以文章页为例,通过chrome抓包,waiting的时间达到147ms,实际上未作缓存优化前,这个页面大概有4条sql语句,速度也只是152ms左右,差别不大,所以我决定安装zend opcache加速php. 当我在服务器上安装了zend opcache后,再测试,waiting已经下降到68ms,效果明显. so,laravel项目还是有必要安装此类php加速器的. 附安装教程: zend opcache(ZendOptimizerPlus) 项目目前托管在github,项目地址为: ht

如何在Zend Studio中使用Zend Debugger调试PHP

在介绍完PHP5环境下Zend Debugger安装配置教程后,今天来说说如何在Zend Studio中使用Zend Debugger调试PHP程序,使用Zend Debugger还是比较方便,我使用的是Zend Studio7,Zend Studio7的Debug配置界面与早期的Zend Studio还是略有不同. 在使用Zend Debugger在Zend Studio中调试PHP之前,请先安装Zend Debugger,如果对Zend Studio的使用比较陌生,推荐先学习PHP开发工具Z

PHP开发工具Zend Studio7入门使用教程

对于PHP网站开发者来说,选择一款好用的PHP开发工具是很重要的,目前比较有名的PHP开发工具有zend studio.Eclipse.Editplus等,当初我刚入门学习PHP的时候,使用的PHP开发工具是Editplus,后来才慢慢过渡到更多使用zend studio,相对来说Editplus是一个轻量级的PHP开发工具,适合PHP入门学习者使用,zend studio功能更强大,但你要说哪个是最好的PHP开发工具,那可真说不清道不明了,只有最合适,没有最好,对于有一定PHP基础知识的童鞋我

PHP 5/Zend Engine 2.0的改进

近两年没有使用PHP写过程序了,今天要用PHP,就在网上查了查,看到了PHP5,一时之间兴趣又大了起来,于是翻译了这篇文章. 文章来源于http://www.php.net/. 新的对象模型 PHP中的对象处理部分已完全重写,具有更佳的性能和更多的功能.在先前的PHP版本中,对象被当做原始的简单类型 (如integer和string)来处理,这种方法的缺点是当变量被赋值或作为参数传递时,得到的是对象拷贝.而在新版本中, 对象是通过句柄来引用的,而不是通过对象的值(句柄想象为对象的标识符). 很多