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 相关文章推荐
动易数据转成dedecms的php程序
Apr 07 PHP
PHP多线程抓取网页实现代码
Jul 22 PHP
PHP学习之数组的定义和填充
Apr 17 PHP
计算php页面运行时间的函数介绍
Jul 01 PHP
PHP依赖倒置(Dependency Injection)代码实例
Oct 11 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
Mar 25 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
PHP Yii框架之表单验证规则大全
Nov 16 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
Jul 14 PHP
PHP简单检测网址是否能够正常打开的方法
Sep 04 PHP
laravel model 两表联查示例
Oct 24 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文件上传的例子及参数详解
2013/12/12 PHP
php过滤HTML标签、属性等正则表达式汇总
2014/09/22 PHP
php编写的一个E-mail验证类
2015/03/25 PHP
PHP使用FFmpeg获取视频播放总时长与码率等信息
2016/09/13 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
IE与Firefox下javascript getyear年份的兼容性写法
2007/12/20 Javascript
js中的布尔运算符使用介绍
2013/11/20 Javascript
利用javascript数组长度循环数组内所有元素
2013/12/27 Javascript
express的中间件bodyParser详解
2014/12/04 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
JavaScript代码实现左右上下自动晃动自动移动
2016/04/08 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
获取今天,昨天,本周,上周,本月,上月时间(实例分享)
2017/01/04 Javascript
JS匹配日期和时间的正则表达式示例
2017/05/12 Javascript
vue实现全选和反选功能
2017/08/31 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
微信小程序实现多图上传
2020/06/19 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
vue-cli4.0多环境配置变量与模式详解
2020/12/30 Vue.js
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
Python基于列表list实现的CRUD操作功能示例
2018/01/05 Python
python写一个md5解密器示例
2018/02/23 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
python 基于卡方值分箱算法的实现示例
2020/07/17 Python
Python plt 利用subplot 实现在一张画布同时画多张图
2021/02/26 Python
Forever 21美国官网:美国标志性快时尚品牌
2017/02/20 全球购物
Becextech新西兰:数码单反相机和手机在线商店
2018/04/27 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
创意活动策划书
2014/01/15 职场文书
幼儿园教师工作感言
2014/02/15 职场文书
2016反腐倡廉警示教育心得体会
2016/01/13 职场文书
2016年小学感恩节活动总结
2016/04/01 职场文书
2019企业文化管理制度范本!
2019/08/06 职场文书