项目分为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