一、WorkerMan开发与普通PHP开发的不同之处

除了与HTTP协议相关的变量函数无法直接使用外,WorkerMan开发与普通PHP开发并没有很大不同。

1、应用层协议不同

  • 普通PHP开发一般是基于HTTP应用层协议,WebServer已经帮开发者完成了协议的解析
  • WorkerMan支持各种协议,目前内置了HTTP、WebSocket等协议。WorkerMan推荐开发者使用更简单的自定义协议通讯

由于非HTTP协议的应用,所以header()setcookie()session_start等函数无法直接使用,需要使用WorkerMan提供的方法,具体参考高级应用-WebServer部分

2、请求周期差异

  • PHP在Web应用中一次请求过后会释放所有的变量与资源
  • WorkerMan开发的应用程序在第一次载入解析后便常驻内存,使得类的定义、全局对象、类的静态成员不会释放,便于后续重复利用

3、注意避免类和常量的重复定义

  • 由于WorkerMan会缓存编译后的PHP文件,所以要避免多次require/include相同的类或者常量的定义文件。建议使用require_once/include_once加载文件。

4、注意单例模式的连接资源的释放

  • 由于WorkerMan不会在每次请求后释放全局对象及类的静态成员,在数据库等单例模式中,往往会将数据库实例(内部包含了一个数据库socket连接)保存在数据库静态成员中,使得WorkerMan在进程生命周期内都复用这个数据库socket连接。需要注意的是当数据库服务器发现某个连接在一定时间内没有活动后可能会主动关闭socket连接,这时再次使用这个数据库实例时会报错,(错误信息类似mysql gone away)。WorkerMan提供了数据库类,有断开重连的功能,开发者可以直接使用。

5、注意不要使用exit、die出语句

  • WorkerMan运行在PHP命令行模式下,当调用exit、die退出语句时,会导致当前进程退出。虽然子进程退出后会立刻重新创建一个的相同的子进程继续服务,但是还是可能对业务产生影响。

二、需要了解的基本概念

1、TCP传输层协议

TCP是一种面向连接的、可靠的、基于IP的传输层协议。TCP传输层协议一个重要特点是TCP是基于数据流的,客户端的请求会源源不断的发送给服务端,服务端收到的数据可能不是一个完整的请求,也有可能是多个请求连在一起。这就需要我们在这源源不断的数据流中区分每个请求的边界。而应用层协议主要是为请求边界定义一套规则,避免请求数据混乱。

2、应用层协议

应用层协议(application layer protocol)定义了运行在不同端系统上(客户端、服务端)的应用程序进程如何相互传递报文,例如HTTP、WebSocket都属于应用层协议。例如一个简单的应用层次协议可以如下{"module":"user","action":"getInfo","uid":456}\n"。此协议是以"\n"(注意这里"\n"代表的是回车)标记请求结束,消息体是字符串。

3、短连接

短连接是指通讯双方有数据交互时,就建立一个连接,数据发送完成后,则断开此连接,即每次连接只完成一项业务的发送。像WEB网站的HTTP服务一般都用短连接。

短连接应用程序开发可以参考基本开发流程一章

4、长连接

长连接,指在一个连接上可以连续发送多个数据包。

注意:长连接应用必须加心跳,否则连接可能由于长时间不活跃而被路由节点防火墙断开。

长连接多用于操作频繁,点对点的通讯的情况。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多。所以长连接在每个操作完后都不断开,下次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接,如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

当需要主动向客户端推送数据时,例如聊天类、即时游戏类、手机推送等应用需要长连接。
长连接应用程序开发可以参考Gateway/Worker开发流程

5、平滑重启

一般的重启的过程是把所有进程全部停止后,再开始创建全新的服务进程。在这个过程中会有一个短暂的时间内是没有进程对外提供服务的,这就会导致服务暂时不可用,这在高并发时势必会导致请求失败。

而平滑重启则不是一次性的停止所有进程,而是一个进程一个进程的停止,每停止一个进程后马上重新创建一个新的进程顶替,直到所有旧的进程都被替换为止。

平滑重启WorkerMan可以使用 php your_file.php reload命令,能够做到在不影响服务质量的情况下更新应用程序。

注意:只有在on{...}回调中载入的文件平滑重启后才会自动更新,启动脚本中直接载入的文件或者写死的代码运行reload不会自动更新。

三、代码

模仿事例代码:

服务器端代码:index.php

<?php
require "work.php";//启动监听当前服务器的9005端口,提供的服务是9005
$worker = new Worker("tcp://0.0.0.0:9501");//接收到了客户端发送的消息,回调执行(网络事件:消息可读)
$worker->onMessage = function ($fd,$connection,$message){var_dump($message);//写业务逻辑的地方$connection->send($fd,"我是workerman"); //给客户端发送消息
};$worker->runAll(); //启动服务

work.php

<?php
class  Worker{public $onMessage; //绑定一个消息触发的事件回调private $_mainSocket; //保存socket服务端资源public function __construct($addr){$this->_mainSocket = stream_socket_server($addr);}public  function  runAll(){$this->listen();}//监听服务端发送的请求protected  function  listen(){while(true){//阻塞获取客户端的请求$clientSocket = stream_socket_accept($this->_mainSocket);$message=fread($clientSocket,65535);var_dump($clientSocket,$message);if(is_callable($this->onMessage)){call_user_func($this->onMessage,$clientSocket,$this,$message);}}}public  function  send($fd,$message){$http_resonse = "HTTP/1.1 200 OK\r\n";$http_resonse .= "Content-Type: text/html;charset=UTF-8\r\n";$http_resonse .= "Connection: keep-alive\r\n";$http_resonse .= "Server: php socket server\r\n";$http_resonse .= "Content-length: ".strlen($message)."\r\n\r\n";$http_resonse .= $message;fwrite($fd,$http_resonse);//fclose($fd); //直接关闭掉}
}

浏览器访问结果

注意事项:

云服务器需要配置入和出的规则里必须添加端口,否则workman无法和php正常通信

workman与php通信相关推荐

  1. RPC 笔记(05)— socket 通信(单线程服务器)

    1. Python 标准库 1.1 socket 提供 RPC 服务的网络通信功能,方便用户编写 tcp/udp 相关的代码.两个不同机器的进程需要通信时,可以通过 socket 来传输数据. ​ 客 ...

  2. Python 多进程笔记 — 启动进程的方式、守护进程、进程间通信、进程池、进程池之间通信、多进程生产消费模型

    1 面向过程启动多进程 Python 操作进程的类都定义在 multiprocessing 模块,该模块提供了一个 Process 类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另 ...

  3. HTTP 协议入门 — (TCP/IP协议族、通信传输流、URI 与 URL 的区别、Cookie 状态管理、HTTP 支持的方法、状态码类别、HTTP 首部字段)

    TCP/IP协议族 在介绍 HTTP 协议之前,我们先对 TCP/IP 协议族有个大概的了解,TCP/IP 协议从上到下主要分为应用层.传输层.网络层和数据链路层,各层的主要功能如下表所示: 协议层 ...

  4. python第三方库之学习pyserial库--串口通信

    pyserial串口通信库 1.安装pyserial库 2.填写串口参数的注意事项 3.简单封装一下 4.碰到的bug 1.安装pyserial库 pip install pyserial versi ...

  5. python 网络编程之Socket通信案例消息发送与接收

    背景 网络编程是python编程中的一项基本技术.本文将实现一个简单的Socket通信案例消息发送与接收 正文 在python中的socket编程的大致流程图如上所示 我们来首先编写客户端的代码: # ...

  6. NVIDIA空中导航SDK改造5G通信

    NVIDIA空中导航SDK改造5G通信 Transforming Next-Generation Wireless with 5T for 5G and the NVIDIA Aerial SDK N ...

  7. tp5+workman

    tp5+workman composer require topthink/think-worker=1.0.*   可能会存在版本问题 转载于:https://www.cnblogs.com/wxt ...

  8. 十五天精通WCF——第六天 你必须要了解的3种通信模式

    十五天精通WCF--第六天 你必须要了解的3种通信模式 原文:十五天精通WCF--第六天 你必须要了解的3种通信模式 wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦 ...

  9. C# Socket系列三 socket通信的封包和拆包

    通过系列二 我们已经实现了socket的简单通信 接下来我们测试一下,在时间应用的场景下,我们会快速且大量的传输数据的情况! 1 class Program 2 { 3 static void Mai ...

  10. flex java socket通信

    引用:http://developer.51cto.com/art/201003/189791.htm Java socket通信如何进行相关问题的解答呢?还是需要我们不断的学习,在学习的过程中会遇到 ...

最新文章

  1. hdu 1828 pku 1177 Picture
  2. 为何要使用docker
  3. 读《我们终将逝去的青春》
  4. Mysql 更改密码详解及设置免密登录
  5. 论MySQL的监控和调优
  6. typora字体颜色及字体背景颜色快捷方式(亲测实用有效)
  7. UTF-8 Unicode ANSI网页编码的区别
  8. C3模块-空洞可分离卷积存在的问题及轻量化语义分割模型架构技巧
  9. Teamviewer远程,应用界面显示空白
  10. Cisco 路由器作业1.1 路由器初始化配置
  11. android 手机 瘦身,手机瘦身 Android系统程序精简教程(1)
  12. 剑指offer-二叉树中值等于某个数的路径
  13. 增加对ARM64和X86的硬件预取控制驱动的支持
  14. 真实骑手数据:73万大学毕业生在送外卖
  15. UVa:10105 Polynomial Coefficients(多项式定理)
  16. 好全的前端只是体系(前端架构师来找找有木有你想要的) 五
  17. 火车头如何下载附件文件
  18. task03 python自动化之word操作
  19. Spring 5 详细教程 IDEA版本 复习笔记 狂神笔记 面试宝典
  20. 谭浩强C语言程序设计代码示例第6章(笔记)

热门文章

  1. AcWing120 防线
  2. php 公众平台开发教程,微信公众平台开发入门教程
  3. 如何用微信小程序,每天给自己赚个鸡腿?
  4. java获取本机ip的方法
  5. MATLAB 8.1 R2013a license.lic 问题
  6. springboot前后端分离图片上传接口
  7. 超声波传感器(CHx01) 学习笔记 Ⅳ- 程序移植
  8. 【修真院“善良”系列之二】产品经理应该懂哪些术语?
  9. python第三方库汇总
  10. windows7初次使用