[Linux]使用PHP编写Gearman的Worker守护进程
<?php declare( ticks = 1 ); // This case will check the config file regularly, if the config file changed, it will restart it self // If you want to restart the daemon gracefully, give it a HUP signal // by shiqiang<cocowool@gmail.com> at 2011-12-04 $init_md5 = md5_file( 'config.php'); // register signal handler pcntl_signal( SIGALRM, "signal_handler", true ); pcntl_signal( SIGHUP, 'signal_handler', TRUE ); $job_flag = FALSE; //Job status flag, to justify if the job has been finished $signal_flag = FALSE; //Signal status flag, to justify whether we received the kill -1 signal while( 1 ){ $job_flag = FALSE; //Job status flag print "Worker start running ... \n"; sleep(5); print "Worker's task done ... \n"; $flag = TRUE; //Job status flag AutoStart( $signal_flag ); } function signal_handler( $signal ) { global $job_flag; global $signal_flag; switch( $signal ){ case SIGQUIT: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGQUIT - No : $signal \n"; exit(0); break; case SIGSTOP: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGSTOP - No : $signal \n"; break; case SIGHUP: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGHUP - No : $signal \n"; if( $flag === TRUE ){ AutoStart( TRUE ); }else{ $signal_flag = TRUE; } break; case SIGALRM: print date('y-m-d H:i:s', time() ) . " Caught Signal : SIGALRM - No : $signal \n"; //pcntl_exec( '/bin/ls' ); pcntl_alarm( 5 ); break; default: break; } } function AutoStart( $signal = FALSE, $filename = 'config.php' ){ global $init_md5; if( $signal || md5_file( $filename ) != $init_md5 ){ print "The config file has been changed, we are going to restart. \n"; $pid = pcntl_fork(); if( $pid == -1 ){ print "Fork error \n"; }else if( $pid > 0 ){ print "Parent exit \n"; exit(0); }else{ $init_md5 = md5_file( $filename ); print "Child continue to run \n"; } } }
<?php function handle_http_request($address, $port){
$max_backlog = 16;
$res_content = "HTTP/1.1 200 OK \n".
"Content-Length: 15 \n".
"Content-Type: text/plain; charset=UTF-8 \n".
"PHP HTTP Server Hello World!!";
$res_len = strlen($res_content); //Create, bind and listen to socket
if(($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === FALSE){
echo "Create socket failed!\n";
exit;
} if((socket_bind($socket, $address, $port)) === FALSE)
{
echo "Bind socket failed!\n";
exit;
} if((socket_listen($socket, $max_backlog)) === FALSE)
{
echo "Listen to socket failed!\n";
exit;
} //loop
while (true) {
if( ($accept_socket = socket_accept($socket)) === FALSE ){
continue;
}else{
socket_write($accept_socket, $res_content, $res_len);
socket_close($accept_socket);
}
} } //Run as daemon process.
function run(){ if(($pid1 = pcntl_fork()) === 0){ posix_setsid();//Set first child process as the session leader. if(($pid2 = pcntl_fork()) === 0){
handle_http_request('192.168.255.131', 10101);
}else{
exit;
}
}else{
pcntl_wait($status);
}
} run();
?>
[Linux]使用PHP编写Gearman的Worker守护进程的更多相关文章
- Linux Rsync备份服务介绍及部署守护进程模式
rsync介绍 rsync是一款开源的.快速的.多功能的.可实现全量及增量的本地或远程数据同步备份工具 在常驻模式(daemon mode)下,rsync默认监听TCP端口873,以原生rsync传输 ...
- linux分享六:nohup与&,守护进程
contab每秒执行脚本,然后将把标准错误重定向到标准输出(2>&1)以追加的方式写入log_cronjob.txt.补充:试想2>1代表什么,2与>结合代表错误重定向,而1 ...
- linux下为.net core应用创建守护进程
1.Supervisor 安装 yum install python-setuptools easy_install supervisor 2.配置 Supervisor mkdir /etc/sup ...
- 编写Linux/Unix守护进程
原文: http://www.cnblogs.com/haimingwey/archive/2012/04/25/2470190.html 守护进程在Linux/Unix系统中有着广泛的应用.有时,开 ...
- linux系统编程之进程(八):守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
- 创建守护进程步骤与setsid() -- linux deamon进程
原创:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且 ...
- Linux 下Qt实现守护进程实例(转)
原文地址:Linux守护进程的编程方法(含实例) 作者:lingdxuyan 参考文献 Linux信号列表(zz) Linux 守护进程的编程方法 linux上编写守护进程的例程 Linux下后台守 ...
- Linux系统编程之--守护进程的创建和详解【转】
本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...
- linux系统编程:守护进程详解及创建,daemon()使用
一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.它不需要用户输入就能运行而且提供某种服务,不是对整个 ...
随机推荐
- flask+sqlite3+echarts3+ajax 异步数据加载
结构: /www | |-- /static |....|-- jquery-3.1.1.js |....|-- echarts.js(echarts3是单文件!!) | |-- /templates ...
- 20145208 《Java程序设计》第0周学习总结
20145208 <Java程序设计>第0周学习总结 阅读心得 读了老师推荐的几个文章,虽然第四个文章"为什么一定要自学"报告资源不存在而无法阅读,其他的三篇文章都言之 ...
- 详解 Android Activity 生命周期
从以下几个方面详细说一下Activity的生命周期: 1.回到主屏幕再打开和退出程序的时候. 2.屏幕旋转的时候. 3.打开其它的Activity的情况. 4.打开一个Layou透明的Activity ...
- EF批量添加数据性能慢的问题的解决方案
//EF批量添加数据性能慢的问题的解决方案 public ActionResult BatchAdd() { using (var db = new ToneRoad.CEA.DbContext.Db ...
- InetAddress类
InetAddress类是Java对IP地址(包括IPv4和IPv6)的高层表示.大多数其他网络类都要用到这个类,包括Socket,ServerSocket,URL,DatagramSocket,Da ...
- php特殊用法
1.将字符串转换成可执行的php代码(简单的代码)--eval() <?php $str="echo phpinfo();"; echo eval( $str);
- [转]Extjs combo数据绑定与获取
原文地址:http://www.cnblogs.com/loveme123/archive/2012/05/10/2494466.html 1. 配置combo: { ...
- iOS地图 -- 定位初使用
iOS的定位服务用到的框架是#import <CoreLocation/CoreLocation.h> 定位中用到的类是CLLocationManager 一.iOS8.0之前的定位 向用 ...
- Thinking in java学习笔记之迭代器
Map<String,String> map = new HashMap<String,String>(); List list = new ArrayList(); list ...
- oracle---jdbc--laobai
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...