pengyu/server

一个由PHP编写的紧凑型网络通信服务器

dev-master 2019-09-02 02:52 UTC

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();