PHP后台守护进程的实现

使用场景:用户触发守护进程,并以守护进程的方式在后台执行一些计划任务。

定义与用法:

主要使用PHP内置ignore_user_abort函数来完成,函数设置与客户机断开是否会终止脚本的执行函数返回 user-abort 设置的之前的值(一个布尔值);

语法

ignore_user_abort(setting)

参数 描述
setting

可选。如果设置为 true,则忽略与用户的断开,如果设置为 false,会导致脚本停止运行。

如果未设置该参数,会返回当前的设置。


提示和注释

注释:PHP 不会检测到用户是否已断开连接,直到尝试向客户机发送信息为止。简单地使用 echo 语句无法确保信息发送,参阅 flush() 函数。

示例:

<?php
//忽略用户的停止信号,并一直执行
ignore_user_abort(true);
set_time_limit(0);


while(1)
{
    //连接失败
    if(connection_status() != CONNECTION_NORMAL)
    {
        break;//停止守护进程
    }


    //...do something...
    
    //十秒钟执行一次
    sleep(10);
}
?>

查看函数源码,发现只是改变了变量ignore_user_abort的值,代码如下:

PHP_FUNCTION(ignore_user_abort)
{
	char *arg = NULL;
	int arg_len = 0;
	int old_setting;


	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &arg, &arg_len) == FAILURE) {
		return;
	}


	old_setting = PG(ignore_user_abort);

        
	if (arg) {
                 //设置ignore_user_abort的值
		zend_alter_ini_entry_ex("ignore_user_abort", sizeof("ignore_user_abort"), arg, arg_len, PHP_INI_USER, PHP_INI_STAGE_RUNTIME, 0 TSRMLS_CC);
	}


	RETURN_LONG(old_setting);
}

继续跟踪到main.c,找到函数php_handle_aborted_connection,发现ignore_user_abort为false时,则调用zend_bailout退出当前执行的代码,反之则继续执行

PHPAPI void php_handle_aborted_connection(void)
{
	TSRMLS_FETCH();

	PG(connection_status) = PHP_CONNECTION_ABORTED;
	php_output_set_status(0 TSRMLS_CC);

	//没有设置ignore_user_abort变量为true,则中止执行
	if (!PG(ignore_user_abort)) {
		zend_bailout();
	}
}

同样,在mod_php5API函数接口中可以找到sapi_apache_ub_write,其中ub是unbuffer的意思,此函数是apache在向客户端写数据超时的调用的

static int sapi_apache_ub_write(const char *str, uint str_length TSRMLS_DC)
{
	int ret=0;
		
	if (SG(server_context)) {
		ret = rwrite(str, str_length, (request_rec *) SG(server_context));
	}
	if (ret != str_length) {
		php_handle_aborted_connection();
	}
	return ret;
}

所以从ignore_user_abort的函数定义一层层深入进来,不难发现其中的实现其中的实现
参考资料: http://cn.php.net/manual/zh/function.ignore-user-abort.php

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
thinkPHP开发的后台管理系统 主要针对PHP入门级程序员开发适用,主要特点集成了AUTH多对多权限管理控制, 比较细分明确了 权限控制=》权限节点 、角色=》角色权限、管理员=》角色 的管理结构。 后台布局主要应用了Layuid的简明小清新,还支持5种风格切换、全屏浏览、锁屏等炫酷功能。 相信AndPHP.admin 能让你的后台开发也能舒爽起来,另外补充一点,对于目前大多的共享后台都集成封装了如表单、 列表等主要构件方法,说是为了方便快速布置后台,当对于入门来说,学习成本也是有的,阅读性也有牺牲,仁者见仁吧, 就是想告诉大家AndPHP.admin没有这样做,主要好处,多查阅ThinkPHP5.1及Layui2.x文档根据已有文件基本就能活学应用啦!! ( 打脸了,admin2.0对于FORM\LIST进行了方法集成,但保留了1.0的部分硬编输出,你可以更好的应对,快速的开发!) //============= AndPHP内容管理系统基于ThinkPHP、结合Layui等优秀开源项目开发; 将包含系统设置,权限管理,模型管理,数据库管理,栏目管理,会员管理,网站功能,模版管理,微信管理等相关模块。 官网在线演示: http://andphp.com 测试账号:test 测试密码:123456 admin2.0纯净版发布了 ThinkPHP核心框架更新至5.1.12, 精简后台功能模块,极简方便开发者 =)基于后台管理员登录/AUTH权限管理/系统配置及后台FORM、LIST公共方法 =)基于前台用户登录/AUTH权限管理/会员中心(集成积分管理、签到等)基本用户操作属性 =) 集成一键安装,localhost/install/index.php 轻度强迫症的我对代码规范有这一定的要求,所以一定程度上做好了备注标示,目前文档整理中,有问题请进QQ群交流学习! About, AndPHP采用ThinkPHP5.15开发,ThinkPHP5.15采用全新的目录结构、架构思想,引入了 很多 的PHP新特性,优化了核心,减少了依赖,实现了真正的惰性加载。 正因为ThinkPHP的 这些新特性, 从而使得ANDPHP的执行速度成倍提高。 UI方面,AndPHP采用了最受欢迎的Layui,Layui用于开发响应式布局、移动设备优先的 WEB 项目。 简洁、直观、强悍的前端开发框架,让ANDPHP后台界面更加美观,前台布局 更加爽快,开发更迅速、简单。 Tell U, 我们的目标:致力于为个人和中小型企业打造全方位的PHP企业级开发解决方案。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值