溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

workerman如何使用

發(fā)布時(shí)間:2021-01-16 12:43:59 來(lái)源:億速云 閱讀:151 作者:小新 欄目:編程語(yǔ)言

這篇文章給大家分享的是有關(guān)workerman如何使用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

建立一個(gè)普通的DAEMON

$worker = new Worker();
$worker::$pidFile = $config['pid'];
$worker::$logFile = $config['log'];
$worker->name = $config['title'];
$worker->count = $config['num'];
$worker->onWorkerStart = function($worker){
    //執(zhí)行一個(gè)回調(diào)函數(shù)
    call_user_func('******');
};
Worker::runAll();

建立一個(gè)定時(shí)任務(wù)(支持秒級(jí))

<?php  
use \Workerman\Worker;  
use \Workerman\Lib\Timer;  
require_once './Workerman/Autoloader.php';  
$task = new Worker();  
// 開(kāi)啟多少個(gè)進(jìn)程運(yùn)行定時(shí)任務(wù),注意多進(jìn)程并發(fā)問(wèn)題  
$task->count = 1;  
$task->onWorkerStart = function($task)  
{  
    // 每1秒執(zhí)行一次 支持小數(shù),可以精確到0.001,即精確到毫秒級(jí)別  
    $time_interval = 1;  
    Timer::add($time_interval, function()  
    {  
        echo "****\n";  
    });  
};  
Worker::runAll();

php給客戶端實(shí)時(shí)發(fā)送消息

1、建立一個(gè)websocket Worker,用來(lái)維持客戶端長(zhǎng)連接

2、websocket Worker內(nèi)部建立一個(gè)text Worker

3、websocket Worker 與 text Worker是同一個(gè)進(jìn)程,可以方便的共享客戶端連接

4、某個(gè)獨(dú)立的php后臺(tái)系統(tǒng)通過(guò)text協(xié)議與text Worker通訊

5、text Worker操作websocket連接完成數(shù)據(jù)推送

push.php

<?php
use Workerman\Worker;
require_once './Workerman/Autoloader.php';
// 初始化一個(gè)worker容器,監(jiān)聽(tīng)1234端口
$worker = new Worker('websocket://0.0.0.0:1234');
/*
* 注意這里進(jìn)程數(shù)必須設(shè)置為1,否則會(huì)報(bào)端口占用錯(cuò)誤
* (php 7可以設(shè)置進(jìn)程數(shù)大于1,前提是$inner_text_worker->reusePort=true)
*/
$worker->count = 1;
// worker進(jìn)程啟動(dòng)后創(chuàng)建一個(gè)text Worker以便打開(kāi)一個(gè)內(nèi)部通訊端口
$worker->onWorkerStart = function($worker)
{
// 開(kāi)啟一個(gè)內(nèi)部端口,方便內(nèi)部系統(tǒng)推送數(shù)據(jù),Text協(xié)議格式 文本+換行符
$inner_text_worker = new Worker('text://0.0.0.0:5678');
$inner_text_worker->onMessage = function($connection, $buffer)
{
// $data數(shù)組格式,里面有uid,表示向那個(gè)uid的頁(yè)面推送數(shù)據(jù)
$data = json_decode($buffer, true);
$uid = $data['uid'];
// 通過(guò)workerman,向uid的頁(yè)面推送數(shù)據(jù)
$ret = sendMessageByUid($uid, $buffer);
// 返回推送結(jié)果
$connection->send($ret ? 'ok' : 'fail');
};
// ## 執(zhí)行監(jiān)聽(tīng) ##
$inner_text_worker->listen();
};
// 新增加一個(gè)屬性,用來(lái)保存uid到connection的映射
$worker->uidConnections = array();
// 當(dāng)有客戶端發(fā)來(lái)消息時(shí)執(zhí)行的回調(diào)函數(shù)
$worker->onMessage = function($connection, $data)
{
global $worker;
// 判斷當(dāng)前客戶端是否已經(jīng)驗(yàn)證,既是否設(shè)置了uid
if(!isset($connection->uid))
{
// 沒(méi)驗(yàn)證的話把第一個(gè)包當(dāng)做uid(這里為了方便演示,沒(méi)做真正的驗(yàn)證)
$connection->uid = $data;
/* 保存uid到connection的映射,這樣可以方便的通過(guò)uid查找connection,
* 實(shí)現(xiàn)針對(duì)特定uid推送數(shù)據(jù)
*/
$worker->uidConnections[$connection->uid] = $connection;
return;
}
};
listen

// 當(dāng)有客戶端連接斷開(kāi)時(shí)
$worker->onClose = function($connection)
{
global $worker;
if(isset($connection->uid))
{
// 連接斷開(kāi)時(shí)刪除映射
unset($worker->uidConnections[$connection->uid]);
}
};
// 向所有驗(yàn)證的用戶推送數(shù)據(jù)
function broadcast($message)
{
global $worker;
foreach($worker->uidConnections as $connection)
{
$connection->send($message);
}
}
// 針對(duì)uid推送數(shù)據(jù)
function sendMessageByUid($uid, $message)
{
global $worker;
if(isset($worker->uidConnections[$uid]))
{
$connection = $worker->uidConnections[$uid];
$connection->send($message);
return true;
}
return false;
}
// 運(yùn)行所有的worker
Worker::runAll();

啟動(dòng)后端服務(wù)

php push.php start -d

前端代碼

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

php后臺(tái)代碼

// 建立socket連接到內(nèi)部推送端口
$client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1);
// 推送的數(shù)據(jù),包含uid字段,表示是給這個(gè)uid推送
$data = array('uid'=>'uid1', 'percent'=>'88%');
// 發(fā)送數(shù)據(jù),注意5678端口是Text協(xié)議的端口,Text協(xié)議需要在數(shù)據(jù)末尾加上換行符
fwrite($client, json_encode($data)."\n");
// 讀取推送結(jié)果
echo fread($client, 8192);

建立一個(gè)簡(jiǎn)單的webserver

use \Workerman\Worker;
use \Workerman\WebServer;
require_once __DIR__ . '/Workerman/Autoloader.php';
// 這里監(jiān)聽(tīng)8080端口,如果要監(jiān)聽(tīng)80端口,需要root權(quán)限,并且端口沒(méi)有被其它程序占用
$webserver = new WebServer('http://0.0.0.0:8080');
// 類(lèi)似nginx配置中的root選項(xiàng),添加域名與網(wǎng)站根目錄的關(guān)聯(lián),可設(shè)置多個(gè)域名多個(gè)目錄
$webserver->addRoot('www.example.com', '/your/path/of/web/');
$webserver->addRoot('blog.example.com', '/your/path/of/blog/');
// 設(shè)置開(kāi)啟多少進(jìn)程
$webserver->count = 4;
Worker::runAll();

感謝各位的閱讀!關(guān)于“workerman如何使用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI