PHP编写daemon process详解及实例代码


Posted in PHP onSeptember 30, 2016

今天下午在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 删除cookie和浏览器重定向
Mar 16 PHP
php程序的国际化实现方法(利用gettext)
Aug 14 PHP
php数组函数序列之sort() 对数组的元素值进行升序排序
Nov 02 PHP
浅析PHP Socket技术
Aug 02 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
php单文件版在线代码编辑器
Mar 12 PHP
php仿微信红包分配算法的实现方法
May 13 PHP
php metaphone()函数的定义和用法
May 15 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
PHP利用递归函数实现无限级分类的方法
Mar 22 PHP
php实现银联商务公众号+服务窗支付的示例代码
Oct 12 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
Dec 04 PHP
PHP 极验验证码实例讲解
Sep 29 #PHP
php自定义函数转换html标签示例
Sep 29 #PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 #PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 #PHP
分享一个漂亮的php验证码类
Sep 29 #PHP
你不知道的文件上传漏洞php代码分析
Sep 29 #PHP
PHP的Json中文处理解决方案
Sep 29 #PHP
You might like
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP 面向对象实现代码
2009/11/11 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
2017/09/01 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
探讨在JQuery和Js中,如何让ajax执行完后再继续往下执行
2013/07/09 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
JS实现3D图片旋转展示效果代码
2015/09/22 Javascript
JavaScript html5 canvas画布中删除一个块区域的方法
2016/01/26 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
Javascript之面向对象--封装
2016/12/02 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
discuz表情的JS提取方法分析
2017/03/22 Javascript
微信小程序开发图片拖拽实例详解
2017/05/05 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
JS阻止事件冒泡的方法详解
2019/08/26 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
JavaScript ES6 Class类实现原理详解
2020/05/08 Javascript
[01:07:34]DOTA2-DPC中国联赛定级赛 RNG vs Aster BO3第二场 1月9日
2021/03/11 DOTA
python 上下文管理器使用方法小结
2017/10/10 Python
python中for循环输出列表索引与对应的值方法
2018/11/07 Python
如何使用Python进行OCR识别图片中的文字
2019/04/01 Python
对python 调用类属性的方法详解
2019/07/02 Python
python绘制多个子图的实例
2019/07/07 Python
python之pymysql模块简单应用示例代码
2019/12/16 Python
Python判断字符串是否为合法标示符操作
2020/09/03 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
意大利网上购书网站:Libraccio.it
2021/02/03 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
给老婆的搞笑检讨书
2014/01/12 职场文书
优秀家长自荐材料
2014/08/26 职场文书
合伙开公司协议书范本
2014/10/28 职场文书
python运行脚本文件的三种方法实例
2022/06/25 Python