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中检查PHP文件是否有语法错误的方法
Dec 23 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
Yii不依赖Model的表单生成器用法实例
Dec 04 PHP
php字符串按照单词进行反转的方法
Mar 14 PHP
php实现的网络相册图片防盗链完美破解方法
Jul 01 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
Jul 15 PHP
PHP实现的json类实例
Jul 28 PHP
利用PHP抓取百度阅读的方法示例
Dec 18 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
PHP实现打包zip并下载功能
Jun 12 PHP
PHP迭代器和生成器用法实例分析
Sep 28 PHP
PHP 计算两个时间段之间交集的天数示例
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
摩卡咖啡
2021/03/03 咖啡文化
Cakephp 执行主要流程
2010/03/24 PHP
PHP 下载文件时自动添加bom头的方法实例
2014/01/10 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
jsp网页搜索结果中实现选中一行使其高亮
2014/02/17 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
2015/09/04 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
2015/12/22 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
JSON 数据格式详解
2017/09/13 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
Echarts动态加载多条折线图的实现代码
2019/05/24 Javascript
微信小程序实现点击空白隐藏的方法示例
2019/08/13 Javascript
Vuejs中的watch实例详解(监听者)
2020/01/05 Javascript
[01:06]DOTA2亚洲邀请赛专属珍藏-荧煌之礼
2017/03/24 DOTA
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
Python多线程threading和multiprocessing模块实例解析
2018/01/29 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
python验证码识别教程之利用投影法、连通域法分割图片
2018/06/04 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
通过代码实例了解Python3编程技巧
2020/10/13 Python
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
简述进程的启动、终止的方式以及如何进行进程的查看
2014/02/20 面试题
最新计算机专业自荐信
2013/10/16 职场文书
高二学生评语大全
2014/04/25 职场文书
2014年实习期工作总结
2014/11/27 职场文书
2016中秋节问候语
2015/11/11 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
MySQL中你可能忽略的COLLATION实例详解
2021/05/12 MySQL
python 制作一个gui界面的翻译工具
2021/05/14 Python
python 单机五子棋对战游戏
2022/04/28 Python