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 FLEA中二叉树数组的遍历输出
Sep 26 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
Mar 19 PHP
ThinkPHP之getField详解
Jun 20 PHP
PHP连接和操作MySQL数据库基础教程
Sep 29 PHP
写一段简单的PHP建立文件夹代码
Jan 06 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP文件上传、客户端和服务器端加限制、抓取错误信息、完整步骤解析
Jan 12 PHP
利用laravel搭建一个迷你博客实战教程
Aug 13 PHP
Laravel中的Auth模块详解
Aug 17 PHP
phpStudy配置多站点多域名和多端口的方法
Sep 01 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 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实现中文字符截取防乱码方法汇总
2015/04/29 PHP
PHP实现删除多重数组对象属性并重新赋值的方法
2017/06/07 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
javascript 拖放效果实现代码
2010/01/22 Javascript
基于jquery的让页面控件不可用的实现代码
2010/04/27 Javascript
javascript简单事件处理和with用法介绍
2013/09/16 Javascript
Js 去掉字符串中的空格(实现代码)
2013/11/19 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
javascript异步编程代码书写规范Promise学习笔记
2015/02/11 Javascript
JS实现将数字金额转换为大写人民币汉字的方法
2016/08/02 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)
2017/07/07 Javascript
Angular 1.x个人使用的经验小结
2017/07/19 Javascript
详解VUE调用本地json的使用方法
2019/05/15 Javascript
angularjs自定义过滤器demo示例
2019/08/24 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
json解析大全 双引号、键值对不在一起的情况
2019/12/06 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
解决Pycharm中import时无法识别自己写的程序方法
2018/05/18 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Python使用正则实现计算字符串算式
2019/12/29 Python
python实现逢七拍腿小游戏的思路详解
2020/05/26 Python
Python bisect模块原理及常见实例
2020/06/17 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
Python实现京东抢秒杀功能
2021/01/25 Python
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
意大利婴儿产品网上商店:Mukako
2018/10/14 全球购物
初一生物教学反思
2014/01/18 职场文书
法人授权委托书范本
2014/04/04 职场文书
房屋租赁协议书
2014/04/10 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
幼儿园毕业致辞
2015/07/29 职场文书
反邪教学习心得体会
2016/01/15 职场文书
python套接字socket通信
2022/04/01 Python