PHP编写daemon process 实例详解


Posted in PHP onNovember 13, 2016

PHP编写daemon process

今天下午在segmentfault.com看到一个提问,提问标题是“PHP怎么做服务化”,其中问道php是不是只能以web方式调用。其实很多人对PHP的使用场景都有误解,认为php只能用于编写web脚本,实际上,从PHP4开始,php的使用场景早已不限于处理web请求。 从php的架构体系来说,php分为三个层次:sapi、php core和zend engine。php core本身和web没有任何耦合,php通过sapi与其它应用程序通信,例如mod_php就是为apache编写的sapi实现,同样,fpm是一个基于fastcgi协议的sapi实现,这些sapi都是与web server配合用于处理web请求的。但是也有许多sapi与web无关,例如cli sapi可以使得在命令行环境下直接执行php,embed sapi可以将php嵌入其它语言(如Lua)那样。这里我并不打算详细讨论php的架构体系和sapi的话题,只是说明从架构体系角度目前的php早已被设计为支持各种环境,而非为web独有。 除了架构体系的支持外,php丰富的扩展模块也为php在不同环境发挥作用提供了后盾,例如本文要提到的pcntl模块和posix模块配合可以实现基本的进程管理、信号处理等操作系统级别的功能,而sockets模块可以使php具有socket通信的能力。因此php完全可以用于编写类似于shell或perl常做的工具性脚本,甚至是具有server性质的daemon process。 为了展示php如何编写daemon server,我用php编写了一个简单的http server,这个server以daemon process的形式运行。当然,为了把重点放在如何使用php编写daemon,我没有为这个http server实现具体业务逻辑,但它可以监听指定端口,接受http请求并返回给客户端一条固定的文本,整个过程通过socket实现,全部由php编写而成。

代码实例

下面是这个程序的完整代码:

<?php
 
//Accpet the http client request and generate response content.
//As a demo, this function just send "PHP HTTP Server" to client.
function handle_http_request($address, $port)
{
  $max_backlog = 16;
  $res_content = "HTTP/1.1 200 OK
Content-Length: 15
Content-Type: text/plain; charset=UTF-8
 
PHP HTTP Server";
  $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)
  //First child process
  {
    posix_setsid(); //Set first child process as the session leader.
     
    if(($pid2 = pcntl_fork()) === 0)
    //Second child process, which run as daemon.
    {
      //Replaced with your own domain or address.
      handle_http_request('www.codinglabs.org', 9999); 
    }
    else
    {
      //First child process exit;
      exit;
    }
  }
  else
  {
    //Wait for first child process exit;
    pcntl_wait($status);
  }
}
 
//Entry point.
run();
 
?>

这里我假设各位对Unix环境编程都比较了解,所以不做太多细节的解释,只梳理一下。简单来看,这个程序主要由两个部分组成,handle_http_request函数负责处理http请求,其编写方法与用C编写的tcp server类似:创建socket、绑定、监听,然后通过一个循环处理每个connect过来的客户端,一旦accept到一个连接...

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

PHP 相关文章推荐
PHP.MVC的模板标签系统(五)
Sep 05 PHP
用PHP写的MySQL数据库用户认证系统代码
Mar 22 PHP
php通过文件头检测文件类型通用代码类(zip,rar等)
Oct 19 PHP
PHP中把stdClass Object转array的几个方法
May 08 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
php项目中百度 UEditor 简单安装调试和调用
Jul 15 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
php生成curl命令行的方法
Dec 14 PHP
PHP文件操作实例总结
Sep 27 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
Feb 10 PHP
PHP实现基于状态的责任链审批模式详解
May 31 PHP
详解PHP 7.4 中数组延展操作符语法知识点
Jul 19 PHP
php版微信小店API二次开发及使用示例
Nov 12 #PHP
PHP Mysqli 常用代码集合
Nov 12 #PHP
PHP版微信小店接口开发实例
Nov 12 #PHP
PHP错误和异常处理功能模块示例
Nov 12 #PHP
php版微信小店调用api示例代码
Nov 12 #PHP
php实用代码片段整理
Nov 12 #PHP
php中strlen和mb_strlen用法实例分析
Nov 12 #PHP
You might like
php 生成WML页面方法详解
2009/08/09 PHP
php简单的留言板与回复功能具体实现
2014/02/19 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
php页面跳转session cookie丢失导致不能登录等问题的解决方法
2016/12/12 PHP
JavaScript 动态生成方法的例子
2009/07/22 Javascript
toString()一个会自动调用的方法
2010/02/08 Javascript
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
document.getElementById的简写方式(获取id对象的简略写法)
2010/09/10 Javascript
jquery异步循环获取功能实现代码
2010/09/19 Javascript
轻松创建nodejs服务器(5):事件处理程序
2014/12/18 NodeJs
jQuery实现定时读取分析xml文件的方法
2015/07/16 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
jQuery使用模式窗口实现在主页面和子页面中互相传值的方法
2016/03/01 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
JavaScript面向对象精要(下部)
2017/09/12 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
2018/06/14 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
jquery UI实现autocomplete在获取焦点时得到显示列表功能示例
2019/06/04 jQuery
vue实现路由监听和参数监听
2019/10/29 Javascript
2020淘宝618理想生活列车自动领喵币js脚本的代码
2020/06/02 Javascript
JavaScript中的执行环境和作用域链
2020/09/04 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
使用js原生实现年份轮播选择效果实例
2021/01/12 Javascript
python利用MethodType绑定方法到类示例代码
2017/08/27 Python
基于python解线性矩阵方程(numpy中的matrix类)
2019/10/21 Python
旧时光糖果:Old Time Candy
2018/02/05 全球购物
美国伊甸园兄弟种子公司:Eden Brothers
2018/07/01 全球购物
MYPROTEIN澳大利亚官方网站:欧洲运动营养品牌
2019/06/26 全球购物
电大物流学生的自我评价
2013/10/25 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
回门宴新娘答谢词
2015/09/29 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL