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 相关文章推荐
跟我学小偷程序之成功偷取首页(第三天)
Oct 09 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
PHP flush()与ob_flush()的区别详解
Jun 03 PHP
浅析php fwrite写入txt文件的时候用 \r\n不能换行的问题
Aug 06 PHP
YII中assets的使用示例
Jul 31 PHP
PHP动态柱状图实现方法
Mar 30 PHP
学习php设计模式 php实现享元模式(flyweight)
Dec 07 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
Apr 07 PHP
PHP实现的简单异常处理类示例
May 04 PHP
PHP 布尔值的自增与自减的实现方法
May 03 PHP
php提高脚本性能的4个技巧
Aug 18 PHP
微信小程序和php的登录实现
Apr 01 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 strstr 函数判断字符串是否否存在的实例代码
2013/09/28 PHP
php检查字符串中是否包含7位GSM字符的方法
2015/03/17 PHP
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
向当前style sheet中插入一个新的style实现方法
2013/04/01 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
node.js集成百度UE编辑器
2015/02/05 Javascript
js+canvas绘制矩形的方法
2016/01/28 Javascript
浅析javascript异步执行函数导致的变量变化问题解决思路
2016/05/13 Javascript
JavaScript 值类型和引用类型的初次研究(推荐)
2017/07/19 Javascript
使用JavaScript进行表单校验功能
2017/08/01 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
JavaScript禁用右键单击优缺点分析
2019/01/20 Javascript
快速了解Node中的Stream流是什么
2019/02/13 Javascript
vue中实现Monaco Editor自定义提示功能
2019/07/05 Javascript
JS 设计模式之:工厂模式定义与实现方法浅析
2020/05/06 Javascript
Openlayers实现扩散的动态点(水纹效果)
2020/08/17 Javascript
vue插件--仿微信小程序showModel实现模态提示窗功能
2020/08/19 Javascript
virtualenv实现多个版本Python共存
2017/08/21 Python
numpy中索引和切片详解
2017/12/15 Python
取numpy数组的某几行某几列方法
2018/04/03 Python
python机器学习之KNN分类算法
2018/08/29 Python
在Pycharm中对代码进行注释和缩进的方法详解
2019/01/20 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Python3列表内置方法大全及示例代码小结
2019/05/10 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
一文读懂Python 枚举
2020/08/25 Python
耐克中国官方商城:Nike中国
2018/10/18 全球购物
《大海那边》教学反思
2014/04/09 职场文书
个人考核材料
2014/05/15 职场文书
机关作风建设自查报告及整改措施
2014/10/21 职场文书
2014年设计师工作总结
2014/11/25 职场文书
综合测评个人总结
2015/03/03 职场文书
英文辞职信范文
2015/05/13 职场文书