Files
think-worker/README.md
2026-01-06 13:37:07 +08:00

140 lines
3.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ThinkPHP Workerman 扩展
===============
交流群981069000 [![点击加群](https://pub.idqqimg.com/wpa/images/group.png "点击加群")](https://qm.qq.com/q/A8YNpzrzC8)
## 安装
```
composer require topthink/think-worker
```
## 说明
> 由于windows下无法在一个文件里启动多个worker所以本扩展不支持windows平台
## 使用方法
### HttpServer
在命令行启动服务端
~~~
php think worker
~~~
然后就可以通过浏览器直接访问当前应用
~~~
http://localhost:8080
~~~
如果需要使用守护进程方式运行建议使用supervisor来管理进程
## 访问静态文件
> 建议使用nginx来支持静态文件访问也可使用路由输出文件内容下面是示例可参照修改
1. 添加静态文件路由:
```php
Route::get('static/:path', function (string $path) {
$filename = public_path() . $path;
return new \think\worker\response\File($filename);
})->pattern(['path' => '.*\.\w+$']);
```
2. 访问路由 `http://localhost/static/文件路径`
## 队列支持
使用方法见 [think-queue](https://github.com/top-think/think-queue)
以下配置代替think-queue里的最后一步:`监听任务并执行`,无需另外起进程执行队列
```php
return [
// ...
'queue' => [
'enable' => true,
//键名是队列名称
'workers' => [
//下面参数是不设置时的默认配置
'default' => [
'delay' => 0,
'sleep' => 3,
'tries' => 0,
'timeout' => 60,
'worker_num' => 1,
],
//使用@符号后面可指定队列使用驱动
'default@connection' => [
//此处可不设置任何参数,使用上面的默认配置
],
],
],
// ...
];
```
### websocket
> 使用路由调度的方式可以让不同路径的websocket服务响应不同的事件
#### 配置
```
worker.websocket = true 时开启
```
#### 路由定义
```php
Route::get('path1','controller/action1');
Route::get('path2','controller/action2');
```
#### 控制器
```php
use \think\worker\Websocket;
use \think\worker\websocket\Frame;
class Controller {
public function action1(){
return (new \think\worker\response\Websocket())
->onOpen(...)
->onMessage(function(Websocket $websocket, Frame $frame){
...
})
->onClose(...);
}
public function action2(){
return (new \think\worker\response\Websocket())
->onOpen(...)
->onMessage(function(Websocket $websocket, Frame $frame){
...
})
->onClose(...);
}
}
```
## 自定义worker
监听`worker.init`事件 注入`Manager`对象调用addWorker方法添加
~~~php
use think\worker\Manager;
use \think\worker\Worker;
//...
public function handle(Manager $manager){
$worker = $manager->addWorker(function(Worker $worker){
//..其他回调或处理
//动态添加监听可参考 https://www.workerman.net/doc/workerman/worker/listen.html
});
}
//...
~~~