一,写了一个小聊天程序,还想继续学习,先扫一遍文档把。
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'];
}
}
网友评论