PHP--Workerman入门

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

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值