Home  >  Article  >  PHP Framework  >  How to use workerman?

How to use workerman?

青灯夜游
青灯夜游Original
2019-12-23 12:13:552742browse

Workerman is an asynchronous event-driven PHP framework with high performance, making it easy to build fast, scalable web applications. Supports HTTP, Websocket, SSL and other custom protocols.

How to use workerman?

How to use workerman?

Requires

PHP 5.3 or higher

Installation

After downloading, unzip it

Address: https://www.workerman.net/download

How to use workerman?

##workerman usage steps

Create an ordinary DAEMON

$worker = new Worker();
$worker::$pidFile = $config['pid'];
$worker::$logFile = $config['log'];
$worker->name = $config['title'];
$worker->count = $config['num'];
$worker->onWorkerStart = function($worker){
    //执行一个回调函数
    call_user_func('******');
};
Worker::runAll();

Create a scheduled task (supports second level)

<?php  
use \Workerman\Worker;  
use \Workerman\Lib\Timer;  
require_once &#39;./Workerman/Autoloader.php&#39;;  
$task = new Worker();  
// 开启多少个进程运行定时任务,注意多进程并发问题  
$task->count = 1;  
$task->onWorkerStart = function($task)  
{  
    // 每1秒执行一次 支持小数,可以精确到0.001,即精确到毫秒级别  
    $time_interval = 1;  
    Timer::add($time_interval, function()  
    {  
        echo "****\n";  
    });  
};  
Worker::runAll();

PHP sends messages to the client in real time

1. Create a websocket Worker to maintain a long client connection

2. Create a text Worker inside the websocket Worker

3. Websocket Worker and text Worker are the same process and can easily share client connections

4. An independent php backend system communicates with text Worker through text protocol

5. text Worker operates websocket connection to complete data push

push.php

<?php
use Workerman\Worker;
require_once &#39;./Workerman/Autoloader.php&#39;;
// 初始化一个worker容器,监听1234端口
$worker = new Worker(&#39;websocket://0.0.0.0:1234&#39;);
/*
* 注意这里进程数必须设置为1,否则会报端口占用错误
* (php 7可以设置进程数大于1,前提是$inner_text_worker->reusePort=true)
*/
$worker->count = 1;
// worker进程启动后创建一个text Worker以便打开一个内部通讯端口
$worker->onWorkerStart = function($worker)
{
// 开启一个内部端口,方便内部系统推送数据,Text协议格式 文本+换行符
$inner_text_worker = new Worker(&#39;text://0.0.0.0:5678&#39;);
$inner_text_worker->onMessage = function($connection, $buffer)
{
// $data数组格式,里面有uid,表示向那个uid的页面推送数据
$data = json_decode($buffer, true);
$uid = $data[&#39;uid&#39;];
// 通过workerman,向uid的页面推送数据
$ret = sendMessageByUid($uid, $buffer);
// 返回推送结果
$connection->send($ret ? &#39;ok&#39; : &#39;fail&#39;);
};
// ## 执行监听 ##
$inner_text_worker->listen();
};
// 新增加一个属性,用来保存uid到connection的映射
$worker->uidConnections = array();
// 当有客户端发来消息时执行的回调函数
$worker->onMessage = function($connection, $data)
{
global $worker;
// 判断当前客户端是否已经验证,既是否设置了uid
if(!isset($connection->uid))
{
// 没验证的话把第一个包当做uid(这里为了方便演示,没做真正的验证)
$connection->uid = $data;
/* 保存uid到connection的映射,这样可以方便的通过uid查找connection,
* 实现针对特定uid推送数据
*/
$worker->uidConnections[$connection->uid] = $connection;
return;
}
};
listen

// 当有客户端连接断开时
$worker->onClose = function($connection)
{
global $worker;
if(isset($connection->uid))
{
// 连接断开时删除映射
unset($worker->uidConnections[$connection->uid]);
}
};
// 向所有验证的用户推送数据
function broadcast($message)
{
global $worker;
foreach($worker->uidConnections as $connection)
{
$connection->send($message);
}
}
// 针对uid推送数据
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker->uidConnections[$uid]))
{
$connection = $worker->uidConnections[$uid];
$connection->send($message);
return true;
}
return false;
}
// 运行所有的worker
Worker::runAll();

Start back-end service

php push.php start -d

Front-end code

var ws = new WebSocket(&#39;ws://127.0.0.1:1234&#39;);
ws.onopen = function(){
var uid = &#39;uid1&#39;;
ws.send(uid);
};
ws.onmessage = function(e){
alert(e.data);
};

php backend code

// 建立socket连接到内部推送端口
$client = stream_socket_client(&#39;tcp://127.0.0.1:5678&#39;, $errno, $errmsg, 1);
// 推送的数据,包含uid字段,表示是给这个uid推送
$data = array(&#39;uid&#39;=>&#39;uid1&#39;, &#39;percent&#39;=>&#39;88%&#39;);
// 发送数据,注意5678端口是Text协议的端口,Text协议需要在数据末尾加上换行符
fwrite($client, json_encode($data)."\n");
// 读取推送结果
echo fread($client, 8192);

Build a simple webserver

use \Workerman\Worker;
use \Workerman\WebServer;
require_once __DIR__ . &#39;/Workerman/Autoloader.php&#39;;
// 这里监听8080端口,如果要监听80端口,需要root权限,并且端口没有被其它程序占用
$webserver = new WebServer(&#39;http://0.0.0.0:8080&#39;);
// 类似nginx配置中的root选项,添加域名与网站根目录的关联,可设置多个域名多个目录
$webserver->addRoot(&#39;www.example.com&#39;, &#39;/your/path/of/web/&#39;);
$webserver->addRoot(&#39;blog.example.com&#39;, &#39;/your/path/of/blog/&#39;);
// 设置开启多少进程
$webserver->count = 4;
Worker::runAll();

Features supported by Workerman

  1. Pure PHP development, multi-process support, support php7, support hhvm

  2. Support TCP/UDP, stand-alone Supports more than millions of TCP persistent connections

  3. Supports distributed deployment, and the cluster can support millions or even higher concurrent TCP connections

  4. Supports libevent event-triggered network library

  5. Supports hot updates and smooth server restart

  6. Has many high-performance components such as asynchronous Mysql, Redis, Dns, etc.

PHP Chinese website has a large number of free

workerman introductory tutorials, everyone is welcome to learn!

The above is the detailed content of How to use workerman?. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn