关于workerman:高性能-PHP-应用容器之-Workerman

39次阅读

共计 2921 个字符,预计需要花费 8 分钟才能阅读完成。

介绍
Workerman 是一款纯 PHP 开发的开源高性能的 PHP 利用容器。能够用它开发 tcp 代理、梯子代理、做游戏服务器、邮件服务器、ftp 服务器、甚至开发一个 php 版本的 redis、php 版本的数据库、php 版本的 nginx、php 版本的 php-fpm 等等。Workerman 能够说是 PHP 畛域的一次翻新,让开发者彻底解脱了 PHP 只能做 WEB 的解放。

实际上 Workerman 相似一个 PHP 版本的 nginx,外围也是多过程 + Epoll + 非阻塞 IO。Workerman 每个过程能维持上万并发连贯。因为自身常驻内存,不依赖 Apache、nginx、php-fpm 这些容器,领有超高的性能。同时反对 TCP、UDP、UNIXSOCKET,反对长连贯,反对 Websocket、HTTP、WSS、HTTPS 等通信协定以及各种自定义协定。领有定时器、异步 socket 客户端、异步 Redis、异步 Http、异步音讯队列等泛滥高性能组件。

装置与操作
设置阿里云镜像

composer config -g repo.packagist composer https://mirrors.aliyun.com/co…

装置 workerman

composer require workerman/workerman

启动

调试模式

php start.php start

守护过程模式

php start.php start -d

进行

php start.php stop

重启

php start.php restart

平滑重启:不同于一般的重启,平滑重启能够做到在不影响用户的状况下重启服务,实现业务代码更新。

php start.php reload

查看状态

php start.php status

查看连贯状态

php start.php connections

Http 服务器

workerman 提供了 get、post、cookie、session 等组件,能够很不便的进行 http 相干操作。

<?php
use Workerman\Worker;
require_once DIR . ‘/vendor/autoload.php’;
// 开启 http 服务,端口号为 2345
$http_worker = new Worker(‘http://0.0.0.0:2345’);
// 启动 4 个过程解决申请
$http_worker->count = 4;
// 接管申请
$http_worker->onMessage = function ($connection, $request) {

# 获取整个 get 数组  
$request->get();  
# 获取 get 数组的某一个值  
$name = $request->get('name');  
# 发送 hello 返回给浏览器客户端  
$connection->send("hello");  

};
// 运行 worker
Worker::runAll();

  • 启动后,在浏览器拜访 http://127.0.0.1:2345 会看到 Hello World,一个根底的 http 服务器就实现了。

websocket 服务器
服务端

<?php

use Workerman\Worker;

require_once DIR . ‘/vendor/autoload.php’;

// 创立 websocket 服务,端口号为 2346
$ws_worker = new Worker(‘websocket://0.0.0.0:2346’);

// 当客户端与 Workerman 建设连贯时触发,每个连贯只会触发一次 onConnect 回调。
$ws_worker->onConnect = function ($connection) {

echo "New connection\n";  

};

// 当客户端通过连贯发来数据时触发
$ws_worker->onMessage = function ($connection, $data) {

// 和客户端发送音讯  
$connection->send('msg:' . $data);  

};

// 当客户端连贯与 Workerman 断开时触发的回调
$ws_worker->onClose = function ($connection) {

echo "Connection closed\n";  

};

// 运行 worker
Worker::runAll();
客户端

var ws = new WebSocket(“ws://localhost:2346”);
ws.onopen = function()
{

// Web Socket 已连贯上,应用 send () 办法发送数据  
ws.send("customer");  

};

ws.onmessage = function (evt)
{

console.log("接收数据...");  
console.log(evt.data)  

};

ws.onclose = function()
{

// 敞开 websocket  
console.log("连贯已敞开...");   

};

  • 关上控制台,能够看到服务端发送的 msg:customer,一个简略的聊天服务器就搭建起来了。

Timer 定时器
Timer::add(float $time_interval, callable $callback [$args = array(), bool $persistent = rue])

time_interval: 多长时间执行一次,单位秒,反对小数,能够准确到 0.001,即准确到毫秒级别。

callback: 回调函数

args: 回调函数的参数,必须为数组,数组元素为参数值

persistent: 是否是长久的,如果只想定时执行一次,则传递 false,执行一次后主动销毁。

示例

<?php

use Workerman\Worker;
use Workerman\Timer;

require_once DIR . ‘/vendor/autoload.php’;

$task = new Worker();

// 开启 1 个过程运行定时工作
$task->count = 1;

$task->onWorkerStart = function(Worker $task)
{

// 每 2.5 秒执行一次  
$time_interval = 2.5;  
Timer::add($time_interval, function()  
{echo "timer run\n";});  

};

// 运行 worker
Worker::runAll();
定时工作示例

定时器能够很不便的实现定时工作的性能,例如和 ThinkPHP 框架的事件相结合,通过事件来触发主动收货、勾销订单、统计等性能,上面是。

创立自定义命令

php think make:command crmeb\command\Timer timer

配置 config/console.php 文件

我的项目根目录执行:

php think timer start

源码附件曾经打包好上传到百度云了,大家自行下载即可~

链接: https://pan.baidu.com/s/14G-b…
提取码: yu27
百度云链接不稳固,随时可能会生效,大家放松保留哈。

如果百度云链接生效了的话,请留言通知我,我看到后会及时更新~

开源地址
码云地址:
http://github.crmeb.net/u/defu

Github 地址:
http://github.crmeb.net/u/defu

正文完
 0