pengyu / server
一个由PHP编写的紧凑型网络通信服务器
dev-master
2019-09-02 02:52 UTC
Requires
- php: >= 7.0.0
This package is auto-updated.
Last update: 2024-09-29 05:22:03 UTC
README
PyServer是一款纯PHP编写的网络通信框架,架构简单易上手
简介
传统PHP编写的Web应用通常使用LNMP架构,Nginx+PHP-FPM的经典组合可以帮助开发者快速搭建一套用于自身业务的Web服务器。随着业务的发展,功能需求变得更加多样化,单一的“请求-回复”响应模式已经不够用,例如,使用原有的架构实现一些长连接业务将会变得非常困难。尽管Swoole的出现提供了一种解决方案,但对于习惯了CURD操作的PHPer来说,学习门槛较高,有一定的学习成本。PyServer实际上是一个简化版的Workerman,在代码和功能上进行了缩减,同时保证了业务的完整性,框架默认实现了HTTP协议,使得开发者可以脱离Nginx作为独立的Server,自定义协议可以方便地适应业务需求。
功能特色
- 架构简单(Master-Worker模型)
- 使用composer快速安装引入项目
- 守护进程模式
- 工作进程数可调整
- 毫秒级定时器
- 多种调度器可供选择(在安装了event扩展时,默认是Event调度器)
- Tcp长连接
- 协议可自定义
- 可作为Http服务器
- 可作为WebSocket服务器
安装
使用git方式安装
git clone https://github.com/herepy/PyServer.git cd PyServer && composer install
使用composer方式安装
composer require pengyu/server
示例
配置
require_once "vendor/autoload.php"; use Pengyu\Server\Worker\Server; $worker=new Server("http://0.0.0.0:8080"); $worker->config([ "workerCount" => 4, //工作进程数 "deamon" => true //守护进程模式 "logFile" => "/log/xx.log" //日志文件地址 "accessFile" => "/log/access.log" //http访问记录文件地址 ]); //设置工作进程启动时的回调 $worker->on('workerStart',function ($worker){ //do something }); $worker->run();
Http
require_once "vendor/autoload.php"; use Pengyu\Server\Worker\Server; $worker=new Server("http://0.0.0.0:8080"); //设置接收到客户端请求时的回调 $worker->on('request',function ($content,$response){ var_dump($content); //相关设置 $response->status(200); $response->header("Content-Type","text/html;charset=utf-8"); $response->cookie("name","py",3600); //响应数据 $response->end("hello world"); }); $worker->run();
Websocket
require_once "vendor/autoload.php"; use Pengyu\Server\Worker\Server; $worker=new PyServer("ws://0.0.0.0:8888"); $worker->on('message',function ($connection,$fd,$content){ //发送数据 $connection->send($fd,"received:".$content); }); $worker->run();
定时器
require_once "vendor/autoload.php"; use Pengyu\Server\Worker\Server; use Pengyu\Server\Util\Timer; $worker=new PyServer("http://0.0.0.0:8080"); $worker->on('workerStart',function (){ //持续性定时器 $timerA=new Timer(2,function(){ echo "persist timer"; },true); //一次性定时器 $timerB=new Timer(5,function()use($timerA){ echo "once timer"; //取消定时器 $timerA->cancel(); }); }); $worker->run();