美文网首页
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 文档扫描

    一,写了一个小聊天程序,还想继续学习,先扫一遍文档把。http://doc.workerman.net/这个是wo...

  • workerman 一 环境搭建

    一,前言workerman官方文档 http://doc.workerman.net/ workmen要用到ph...

  • Laravel 5.4 结合 Workerman 实现 TCP

    没有听说过或者没有用过 workerman 的童鞋建议先去官网看下文档。 一、安装 workerman 在项目根目...

  • Workerman实现文件上传

    谈到文件上传,就需要看workerman的文档,文档资料比较丰富,但是我觉得还是有些问题,比如PHP的Pack函数...

  • 工具

    1、全能扫描王 将纸质笔记扫描成PDF文档,保存。 2、扫描宝 将纸质->PDF文档->印象笔记。 举个例子: 做...

  • 深入理解GatewayWorker框架

    序言 本文只是结合GatewayWorker和Workerman的官方文档和源码,深入了解执行过程。以便更深入的了...

  • workman 和swoole 区别 和异同

    workerman workerman是一个高性能的PHP socket 服务器框架,workerman基于PHP...

  • 2019-11-20 TP5自己的项目整合workman时遇到的

    composer require workerman/workerman-for-win composer req...

  • GatewayWorker 文档扫描

    前言:今天不错,workerman文档扫了一遍,现在开始扫GatewayWorker,以下是网址,这篇文章是我的文...

  • swoole 文档扫描

    udp我们试过了,这个不太熟悉,我们试下http协议 我只把端口改了,我docker没映射9501端口。直接访问h...

网友评论

      本文标题:workerman 文档扫描

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