项目分为Linux下和Window下,因为系统跑在Linux下所以Demo为Linux版,官网http://www.workerman.net/上有Window的版本。 入门级Demo: 项目目录,将workerman依赖包放在Workerman下 ws_test.php:
<?php use Workerman\Worker; require_once '../Workerman/Autoloader.php'; require_once '../utils/logUtils.php'; // 注意:这里与上个例子不同,使用的是websocket协议 $ws_worker = new Worker ( "websocket://192.168.209.202:2000" ); // 启动4个进程对外提供服务 $ws_worker->count = 4; // 连接信息 $userInfo = array (); //子进程启动时的回调函数 $ws_worker->onWorkerStart = function($worker) { print_log("启动一个子进程"); }; //客户端与Workerman建立连接时(TCP三次握手完成后)触发的回调函数 $worker->onConnect = function($connection) { print_log("用户连接进来,IP:"+$connection->getRemoteIp()); }; // 当收到客户端发来的数据后返回hello $data给客户端 $ws_worker->onMessage = function ($connection, $data) { print_log ( $data ); $userInfo [$data] = $connection; send_message_to_all($userInfo,$connection->getRemoteIp()); }; // 客户端连接与Workerman断开时触发的回调函数 $ws_worker->onClose = function ($connection) { print_log ( $connection."关闭连接"); remove_user ($userInfo, $connection ); }; // 客户端的连接上发生错误的回调方法 $ws_worker->onError = function ($connection, $code, $msg) { print_log($connection."连接发送错误 $code:".$code.'-'."$msg:".$msg); remove_user ($userInfo, $connection ); }; //移除 function remove_user($userInfo,$connection) { foreach ($userInfo as $id => $conn ) { if ($conn == $connection) { unset ( $userInfo [$id] ); } } } //给所有的人发送消息 function send_message_to_all($userInfo,$msg){ foreach ($userInfo as $id => $conn ) { $conn->send($msg); } } // 运行worker Worker::runAll (); ?>页面端:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <body> </body> <script type="text/javascript"> //判断当前浏览器是否支持WebSocket if ('WebSocket' in window) { ws = new WebSocket("ws://192.168.209.202:2000"); //连接建立是触发 ws.onopen = function() { console.log("连接成功"); ws.send(Math.random()); console.log("给服务端发送一个字符串:tom"); }; //接收数据事件 ws.onmessage = function(e) { console.log("收到服务端的消息:" + e.data); }; //通信异常事件 ws.onerror=function(e){ console.log("通信异常。。。"); }; //关闭触发事件 ws.onclose = function() { console.log("连接已关闭。。。"); }; }else{ console.log("浏览器不支持"); } </script> </html>将项目放在Linux下随意目录下,不必非要放在apache和Nginx下。 切换到ws_test.php目录下(必须要,否则启动会报错)。 启动
php ws_test.php start将html页面放在apache下。在浏览器端打开即可。
踩坑: 启动时会报:
PHP Fatal error: Call to undefined function Workerman\posix_getpid() in /var/temp/WebSocket03/Workerman/Worker.php on line 1908 Fatal error: Call to undefined function Workerman\posix_getpid() in /var/temp/WebSocket03/Workerman/Worker.php on line 1908检查系统是否满足workerman:curl -Ss http://www.workerman.net/check.php | php 安照workman官网http://doc.workerman.net/315116的说明一步步排查即可。 参考:http://doc.workerman.net/315116
