KalonDaemon - 守护进程PHP版

news/2024/5/19 1:49:40 标签: php, function, file, signal, string, extension

声明:这篇文章是我09年的时候发表在自己之前的BLOG上的,属于原创内容,现在将文章转移到这里。

守护进程也称精灵进程(daemon),是生存期较长的一种进程。它们常常用在系统自举时启动,仅在系统关闭时才终止。因为它们没有控制终端,所以说它们是在后台运行的。UNIX类操作系统有很多的守护进程,它们执行日常事务活动。

目前有大量的web站点基与PHP开发,业务逻辑都是由PHP来实现,很多时候我们也需要一个PHP的daemon来做一些日常事务,例如我们想每隔一个小时统计一下数据库中的某项数据,每天定期的执行一些备份或则监控任务。这些任务在apache模块的web环境下实现比较困难而且容易引发很多问题。
这里我介绍一款我自己写的PHP5版的daemon类 - KalonDaemon.   ^_^  现在和大家一起分享。

概要:
    KalonDaemon是一款PHP5的daemon类,我们在PHP代码中可以直接包含并且使用,KalonDaemon工作在cli sapi下( command line interface),它能把一个普通的PHP进程变成一个守护进程。
使用方式:
  在PHP脚本中包含了KalonDaemon设置好参数然后调用start()方法。然后我们在命令行下用PHP cli执行脚本,比如cli sapi路径为 /usr/local/bin/php,   我们编写的程序路径 /home/test/mydaemon.php,那么我们用以下方式运行程序:          /usr/local/bin/php  /home/test/mydaemon.php   根据需要可以在后面添加别的参数。
工作流程:
KalonDaemon遵循大部分unix类系统下的守护进程编程规则,主要工作流程如下:
1. 调用pcntl_fork,然后使父进程退出(exit).这样做实现如下几点:第一,如果该守护进程是作为一条shell命令启动,那么父进程终止使得 shell认为这条命令已经执行完毕;第二,子进程继承父进程的进程组ID,但是具有一个新的进程ID,这就保证了子进程不是一个进程组的组长,这对于下面要做的posix_setsid调用是必要的前提条件。
2.调用posix_setsid以创建一个新的会话,这样新进程就成为了新会话的首进程,同时是新进程组的组长进程,而且没有控制终端。
3.设置进程信号回调函数,方便我们用其它进程对守护进程进行控制。

 

以下是mydaemon.php的源码:

 

 

在命令行下执行:

/path/to/phpcli/php  mydaemon.php start

 

输出如下信息:

Daemon started with pid 8976...
running.

说明守护进程已经开始运行,进程号为8976,当然一般情况进程号每次都会不一样。

 

由于mydaemon.php中有一个死循环,每次循环会睡眠1000秒,所以进程永远不会终止。

mydaemon.php中为守护进程注册了两个信号句柄,信号SIGUSR1对应函数myHandler1(), 信号SIGUSR2对应myHandler2(),我们可以通过kill命令给进程发送这两个信号来唤醒进程。

 

kill -SIGUSR2 8976

输出信息如下:

This handler2 works.
running.

说明睡眠中的进程被唤醒,并且执行了myHandler2()函数,然后再次进入了循环。

 

 

当我们需要终止守护进程的时候,可以用以下命令:

/path/to/phpcli/php  mydaemon.php stop

输出信息如下:

Daemon stopped with pid 8976...

这样守护进程就终止了。

 

这样的特性可以在某些应用场景非常有用,比如服务器在接受到一些上传的数据之后,需要唤醒守护进程来处理这些数据。守护进程可以长期出去睡眠状态等待,当数据到来之后,发送信号唤醒守护进程,守护进程马上开始处理这些数据。这样要比定期的轮询效率高很多,而且不会有延迟现象。

 

 

KalonDaemon.php

 


http://www.niftyadmin.cn/n/1353825.html

相关文章

KalonQue文档

1.关于KalonQue KalonQue一款完全基于PHP语言开发的队列软件产品。 队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的…

PHP多线程版本HASH漏洞攻击工具

漏洞相关信息: http://www.laruence.com/2011/12/30/2435.html 系统要求:linux操作系统,PHP版本5及以上cli模式,多进程模式需要pctnl扩展支持。 使用方式: 下载附件并解压,例如解压到 /usr/local/kalondos…

zend_execute: op执行过程详解

解释器引擎最终执行op的函数是zend_execute,实际上zend_execute是一个函数指针,在引擎初始化的时候zend_execute默认指向了execute,这个execute定义在{PHPSRC}/Zend/zend_vm_execute.h: ZEND_API void execute(zend_op_array *op_array TSRML…

图像缩放双线性插值算法

插值算法对于缩放比例较小的情况是完全可以接受的,令人信服的。一般的,缩小0.5倍以上或放大3.0倍以下,对任何图像都是可以接受的。 最邻近插值(近邻取样法):  最临近插值的的思想很简单。对于通过反向变…

向其他进程注入代码的三种方法

本文章翻译自Robet Kuster的Three Ways to Inject Your Code into Another Process一文,原版地址见下面。本文章版权归原作者所有。如果转载该译文,请保证文章的完整性,并注明来自 www.farproc.com 袁晓辉 2005/5/20 原版地址:http://www…

用 SEH 技术实现 API Hook

用 SEH 技术实现 API Hook(作者:罗聪) 下载本节例子程序和源代码 (5.21 KB) 阅读本文之前,我先假设读者已经知道了 SEH 和 API Hook 的基本概念,因为我不打算在此进行扫盲工作。什么?你不懂什么叫 SEH 和 API Hook ?那…

在NT系统中让自己消失

[ 在NT系列操作系统里让自己“消失”]SoBeIt作者&#xff1a;Holy_Father <holy_fatherphreaker.net>版本&#xff1a;1.2 english日期&#xff1a;05.08.2003[ 1. 内容 ]1. 内容 2. 介绍 3. 文件3.1 NtQueryDirectoryFile3.2 NtVdmControl 4. 进程 5. 注册表5.1 NtEnume…

INT 01 检测SOFTICE的代码

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; INT 1 检测SOFTICE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;start:call f mov ,[esp0ch]add [ecx000000b8h],02xor ,eaxret:push [fs…