美文网首页
workerman 文档扫描

workerman 文档扫描

作者: 蛐蛐儿阳 | 来源:发表于2020-03-22 12:42 被阅读0次

    一,写了一个小聊天程序,还想继续学习,先扫一遍文档把。
    http://doc.workerman.net/
    这个是workerman文档。
    发现一个有趣的例子,我们都知道定时任务用crontab,扫文档时发现一个有趣的例子。

    <?php
    use \Workerman\Worker;
    use \Workerman\Lib\Timer;
    require_once './Workerman/Autoloader.php';
    
    $task = new Worker();
    $task->onWorkerStart = function($task)
    {
    // 每0.5秒执行一次
    $time_interval = 0.5;
    Timer::add($time_interval, function()
    {
    echo  date("Y-m-d H:i:s")."\n";
    });
    };
    
    // 运行worker
    Worker::runAll();
    

    这个进程挂起,可以用来当定时任务用。坏处是,每个进程只能指定一个固定时间戳,好处是,可以每秒执行一次。crontab里没有秒字段的配置,想实现,得这么写。

    * * * * * /scripts/script.sh
      * * * * *  sleep 30; /scripts/script.sh
    #每30秒执行一下脚本
    

    一, 心得1

    停止脚本别去用
    ps -ef|grep php
    然后
    kill
    人家有现成的命令
    php we.php stop
    php we.php restart
    

    二, 心得2
    现在知道为什么$ws_worker->count = 4;的时候,聊天时好时坏了。

    #你看到了四个进程
    ps -ef |grep websocket
    #查看进程状态
    php webSocket.php status
    #在代码中
    echo $ws_worker->id."\n";
    #能查看进程id
    即不同进程之间,不做设置,信息是不能共享的
    

    贴下测试代码

    <?php
    use Workerman\Worker;
    require_once __DIR__ . '/Workerman/Autoloader.php';
    
    // 注意:这里与上个例子不同,使用的是websocket协议
    $worker = new Worker("websocket://0.0.0.0:2001");
    
    // 启动4个进程对外提供服务
    $worker->count = 4;
    
    // 当收到客户端发来的数据后返回hello $data给客户端
    $worker->onMessage = function($connection, $data)use($worker)
    {
    
        // 测试信息
        echo sys_get_temp_dir();
        echo $worker->id."\n";
        echo $worker->count;
        echo $worker->name;
    //    var_dump($worker->connections);
        foreach($worker->connections as $connection) {
            $connection->send($data);
        }
    };
    
    // 运行worker
    Worker::runAll();
    

    其中读文档,读到最重要的work大类,有好多有意思的地方,比如sys_get_temp_dir();一般是/tmp/路径,查看里面的文件是_usr_share_nginx_html_workman_webSocket.php.status,
    前面一串是路径和文件名。看内容

    a:4:{i:67;a:2:{s:4:"name";s:4:"none";s:6:"listen";s:24:"websocket://0.0.0.0:2001";}i:68;a:2:{s:4:"name";s:4:"none";s:6:"listen";s:24:"websocket://0.0.0.0:2001";}i:69;a:2:{s:4:"name";s:4:"none";s:6:"listen";s:24:"websocket://0.0.0.0:2001";}i:70;a:2:{s:4:"name";s:4:"none";s:6:"listen";s:24:"websocket://0.0.0.0:2001";}}
    ----------------------------------------------GLOBAL STATUS----------------------------------------------------
    Workerman version:4.0.1          PHP version:7.4.3
    start time:2020-03-22 05:11:46   run 0 days 0 hours
    load average: 0, 0, 0            event-loop:\Workerman\Events\Select
    1 workers       4 processes
    worker_name  exit_status      exit_count
    none         0                0
    ----------------------------------------------PROCESS STATUS---------------------------------------------------
    pid memory  listening                worker_name  connections send_fail timers  total_request qps    status
    70  2M      websocket://0.0.0.0:2001 none         1           0         0       1
    67  2M      websocket://0.0.0.0:2001 none         0           0         0       0
    69  2M      websocket://0.0.0.0:2001 none         0           0         0       0
    68  2M      websocket://0.0.0.0:2001 none         0           0         0       0
    

    logFile启动日志,默认名字是workerman.log, 暂时没啥大用,万一你进程挂了,可以去看看这个日志。

    笔记:int Connection::$id

    use Workerman\Worker;
    require_once __DIR__ . '/Workerman/Autoloader.php';
    
    $worker = new Worker('tcp://0.0.0.0:8484');
    $worker->onConnect = function($connection)
    {
        echo $connection->id;
    };
    // 运行worker
    Worker::runAll();
    

    手册信息, 此id是第一次连接就生成的id, 在同一id上才能通信。
    例子

    <?php
    use Workerman\Worker;
    use Workerman\Connection\TcpConnection;
    require_once __DIR__ . '/Workerman/Autoloader.php';
    
    // 注意:这里与上个例子不同,使用的是websocket协议
    $worker = new Worker("websocket://0.0.0.0:2001");
    
    // 启动4个进程对外提供服务
    $worker->count = 1;
    
    $worker->onConnect = function($connection)
    {
        //
        echo "connection->d:".$connection->id."\n";
        echo TcpConnection::$defaultMaxPackageSize."\n";
        echo "new connection from ip " . $connection->getRemoteIp() . "\n";
    echo "客户端端口和ip".$connection->getRemoteIp() . ":". $connection->getRemotePort() ."\n";
    };
    
    // 当收到客户端发来的数据后返回hello $data给客户端
    $worker->onMessage = function($connection, $data)use($worker)
    {
    
        // 测试信息
        echo sys_get_temp_dir()."\n";
        echo "work->id:".$worker->id."\n";
        echo $worker->count."\n";
        echo $worker->name."\n";
    //    var_dump($worker->connections);
        foreach($worker->connections as $connection) {
            $connection->send($data);
        }
    };
    
    // 运行worker
    Worker::runAll();
    

    打印得知, 两个work->id都是0, 两个connection->id,是累加的。
    客户端端口并不知2001,是js随机分配的36342。目前不知道获取客户端口有什么用。

    __construct 方法: 创建异步链接, 就是和其他框架整合时,通过接口访问其他框架。
    启动我docker中的php和nginx,我忘记nginx配置文件映射目录了,查看命令

    docker inspect 7500189f7bd9| grep Mounts -A 50
    

    报404错误,是php-fpm ip换了,改下nginx配置文件。

    fastcgi_pass 172.17.0.3:9000;
    

    所以下次run时还是指定ip, 否则,容器每次重启,都会根据启动顺序重置ip。
    php代码

        public function work() {
            if (!empty($_GET['name'])) {
                return "Hello:".$_GET['name'];
            }
        }
    

    相关文章

      网友评论

          本文标题:workerman 文档扫描

          本文链接:https://www.haomeiwen.com/subject/npwmyhtx.html