php级差,韩天峰(Rango)的博客

很多纯PHP开发的后端框架中都使用了pcntl扩展提供的信号处理函数pcntl_signal,实际上这个函数的性能是很差的。首先看一段示例代码:

declare(ticks = 1);

pcntl_signal(SIGINT, 'signalHandler');

这段代码在执行pcntl_signal前,先加入了declare(ticks = 1)。因为PHP的函数无法直接注册到操作系统信号设置中,所以pcntl信号需要依赖tick机制。通过查看pcntl.c的源码实现发现。pcntl_signal的实现原理是,触发信号后先将信号加入一个队列中。然后在PHP的ticks回调函数中不断检查是否有信号,如果有信号就执行PHP中指定的回调函数,如果没有则跳出函数。

PHP_MINIT_FUNCTION(pcntl)

{

php_register_signal_constants(INIT_FUNC_ARGS_PASSTHRU);

php_pcntl_register_errno_constants(INIT_FUNC_ARGS_PASSTHRU);

php_add_tick_function(pcntl_signal_dispatch TSRMLS_CC);

return SUCCESS;

}

pcntl_signal_dispatch 函数的实现:

void pcntl_signal_dispatch()

{

//.... 这里略去一部分代码,queue即是信号队列

while (queue) {

if ((handle = zend_hash_index_find(&PCNTL_G(php_signal_table), queue->signo)) != NULL) {

ZVAL_NULL(&retval);

ZVAL_LONG(&param, queue->signo);

/* Call php signal handler - Note that we do not report errors, and we ignore the return value */

/* FIXME: this is probably broken when multiple signals are handled in this while loop (retval) */

call_user_function(EG(function_table), NULL, handle, &retval, 1, &param TSRMLS_CC);

zval_ptr_dtor(&param);

zval_ptr_dtor(&retval);

}

next = queue->next;

queue->next = PCNTL_G(spares);

PCNTL_G(spares) = queue;

queue = next;

}

}

这样就存在一个比较严重的性能问题,大家都知道PHP的ticks=1表示每执行1行PHP代码就回调此函数。实际上大部分时间都没有信号产生,但ticks的函数一直会执行。如果一个服务器程序1秒中接收1000次请求,平均每个请求要执行1000行PHP代码。那么PHP的pcntl_signal,就带来了额外的 1000 * 1000,也就是100万次空的函数调用。这样会浪费大量的CPU资源。

比较好的做法是去掉ticks,转而使用pcntl_signal_dispatch,在代码循环中自行处理信号。而swoole中因为底层是C实现的,信号处理不受PHP的影响。swoole使用了目前Linux系统中最先进的signalfd来处理信号,几乎是没有任何额外消耗的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
进云JYS社区团长级差分红是一个基于进云jys系统进行开发的社区团长分红软件,主要用于团长,社区团长的变现分红! 团队长级差分红-分润逻辑说明: 举例:以成为预选团队长条件,设置自购订单总金额300元; 举例订单总分红:按百分比总分红为30%,按商品独立总分红为90元; ①、举例团队长等级身份:团队长A、团队长B、团队长C、团队长D、团队长E 说明:团队长A为最低等级,团队长E为最高等级;也可以少设置团队长等级和多设置团队长等级; ②、团队长等级权重:1、2、3、4、5 填写一百以内的数字,数字越大表示等级越高!不同等级的等级权重不得相等! ③、团队长分红按百分比:3.33%、10%、16.66%、23.33%、30% ④、团队长按商品独立分红:10元、30元、50元、70元、90元 ⑤、以团队长按商品独立分红为例-分润逻辑详细说明 a、自购总金额399元成为预选团队长,直推6名预选团队长升级团队长A,团队长A拿直推分红10元,团队长E拿名下所有分销订单级差总分红80元【没人达到团队长E,80元沉淀公司】; b、团队长直推中有3名团队长A升级团队长B,团队长B拿直推分红30元,团队长E拿名下所有分销订单级差总分红60元【没人达到团队长E,60元沉淀公司】; c、团队长直推中有3名团队长B升级团队长C,团队长C拿直推分红50元,团队长E拿名下所有分销订单级差总分红40元【没人达到团队长E,40元沉淀公司】; d、团队长直推中有3名团队长C升级团队长D,团队长D拿直推分红70元,团队长E拿名下所有分销订单级差总分红20元【没人达到团队长E,20元沉淀公司】; e、团队长直推中有3名团队长D升级团队长E,团队长E拿名下所有分销订单级差总分红90元;【注:团队长E平级团队长E,上级团队长E不分红】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值