
竖立一个一般的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();
竖立一个定时使命(支撑秒级)
<?php use \Workerman\Worker; use \Workerman\Lib\Timer; require_once './Workerman/Autoloader.php'; $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给客户端及时发送音讯
1、竖立一个websocket Worker,用来保持客户端长衔接
2、websocket Worker内部竖立一个text Worker
3、websocket Worker 与 text Worker是同一个历程,能够轻易的同享客户端衔接
4、某个自力的php背景体系经由过程text协定与text Worker通信
5、text Worker操纵websocket衔接完成数据推送
push.php
<?php use Workerman\Worker; require_once './Workerman/Autoloader.php'; // 初始化一个worker容器,监听1234端口 $worker = new Worker('websocket://0.0.0.0:1234'); /* * 注重这里历程数必需设置为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('text://0.0.0.0:5678'); $inner_text_worker->onMessage = function($connection, $buffer) { // $data数组花样,内里有uid,示意向谁人uid的页面推送数据 $data = json_decode($buffer, true); $uid = $data['uid']; // 经由过程workerman,向uid的页面推送数据 $ret = sendMessageByUid($uid, $buffer); // 返回推送效果 $connection->send($ret ? 'ok' : 'fail'); }; // ## 实行监听 ## $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();
启动后端效劳
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背景代码
// 竖立socket衔接到内部推送端口 $client = stream_socket_client('tcp://127.0.0.1:5678', $errno, $errmsg, 1); // 推送的数据,包括uid字段,示意是给这个uid推送 $data = array('uid'=>'uid1', 'percent'=>'88%'); // 发送数据,注重5678端口是Text协定的端口,Text协定须要在数据末端加上换行符 fwrite($client, json_encode($data)."\n"); // 读取推送效果 echo fread($client, 8192);
竖立一个简朴的webserver
use \Workerman\Worker; use \Workerman\WebServer; require_once __DIR__ . '/Workerman/Autoloader.php'; // 这里监听8080端口,假如要监听80端口,须要root权限,而且端口没有被别的顺序占用 $webserver = new WebServer('http://0.0.0.0:8080'); // 相似nginx设置中的root选项,增加域名与网站根目次的关联,可设置多个域名多个目次 $webserver->addRoot('www.example.com', '/your/path/of/web/'); $webserver->addRoot('blog.example.com', '/your/path/of/blog/'); // 设置开启若干历程 $webserver->count = 4; Worker::runAll();
ki4网,有大批免费的workerman入门教程,迎接人人进修!
以上就是workerman运用步骤是什么的细致内容,更多请关注ki4网别的相干文章!