## Workerman
> Workermanæ¯ä¸æ¬¾çº¯PHPå¼åçå¼æºé«æ§è½çPHP socket æå¡å¨æ¡æ¶ã被广æ³çç¨äºææºappãæ游æå¡ç«¯ãç½ç»æ¸¸ææå¡å¨ãè天室æå¡å¨ã硬件é讯æå¡å¨ãæºè½å®¶å±
ã车èç½ãç©èç½çé¢åçå¼åã æ¯æTCPé¿è¿æ¥ï¼æ¯æWebsocketãHTTPçåè®®ï¼æ¯æèªå®ä¹åè®®ãåºäºworkermanå¼åè
å¯ä»¥æ´ä¸æ³¨äºä¸å¡é»è¾å¼åï¼ä¸å¿
å为PHP Socketåºå±å¼åèç¦æ¼ã
## å®è£
é¦å
éè¿ composer å®è£
~~~
composer require topthink/think-worker
~~~
## 使ç¨
### 使ç¨`Workerman`ä½ä¸º`HttpServer`
å¨å½ä»¤è¡å¯å¨æå¡ç«¯
~~~
php think worker
~~~
ç¶åå°±å¯ä»¥éè¿æµè§å¨ç´æ¥è®¿é®å½ååºç¨
~~~
http://localhost:2346
~~~
linuxä¸é¢å¯ä»¥æ¯æä¸é¢æ令
~~~
php think worker [start|stop|reload|restart|status]
~~~
`workerman`çåæ°å¯ä»¥å¨åºç¨é
ç½®ç®å½ä¸ç`worker.php`éé¢é
ç½®ã
> ç±äº`onWorkerStart`è¿è¡çæ¶å没æ`HTTP_HOST`ï¼å æ¤æ好å¨åºç¨é
ç½®æ件ä¸è®¾ç½®`app_host`
### SocketServer
å¨å½ä»¤è¡å¯å¨æå¡ç«¯ï¼éè¦`2.0.5+`çæ¬ï¼
~~~
php think worker:server
~~~
é»è®¤ä¼å¨0.0.0.0:2345å¼å¯ä¸ä¸ª`websocket`æå¡ã
å¦æéè¦èªå®ä¹åæ°ï¼å¯ä»¥å¨`config/worker_server.php`ä¸è¿è¡é
ç½®ï¼å
æ¬ï¼
| é
ç½®åæ° | æè¿° |
| --- | --- |
| protocol | åè®® |
| host | çå¬å°å |
| port | çå¬ç«¯å£ |
| socket | å®æ´çsocketå°å |
并ä¸æ¯æ`workerman`ææçåæ°ï¼å
æ¬å
¨å±éæåæ°ï¼ã
ä¹æ¯æ使ç¨éå
æ¹å¼å®ä¹ç¸å
³äºä»¶åè°ã
~~~
return [
'socket' => 'http://127.0.0.1:8000',
'name' => 'thinkphp',
'count' => 4,
'onMessage' => function($connection, $data) {
$connection->send(json_encode($data));
},
];
~~~
ä¹æ¯æ使ç¨èªå®ä¹ç±»ä½ä¸º`Worker`æå¡å
¥å£æ件类ãä¾å¦ï¼æ们å¯ä»¥å建ä¸ä¸ªæå¡ç±»ï¼å¿
é¡»è¦ç»§æ¿ `think\worker\Server`ï¼ï¼ç¶å设置å±æ§åæ·»å åè°æ¹æ³
~~~
<?php
namespace app\http;
use think\worker\Server;
class Worker extends Server
{
protected $socket = 'http://0.0.0.0:2346';
public function onMessage($connection,$data)
{
$connection->send(json_encode($data));
}
}
~~~
æ¯æ`workerman`ææçåè°æ¹æ³å®ä¹ï¼åè°æ¹æ³å¿
é¡»æ¯publicç±»åï¼
ç¶åå¨`worker_server.php`ä¸å¢å é
ç½®åæ°ï¼
~~~
return [
'worker_class' => 'app\http\Worker',
];
~~~
å®ä¹è¯¥åæ°åï¼å
¶å®é
ç½®åæ°åä¸åææã
å¨å½ä»¤è¡å¯å¨æå¡ç«¯
~~~
php think worker:server
~~~
ç¶åå¨æµè§å¨éé¢è®¿é®
~~~
http://localhost:2346
~~~
å¦æå¨Linuxä¸é¢ï¼åæ ·æ¯æreload|restart|stop|status æä½
~~~
php think worker:server reload
~~~
> 注æ:使ç¨é»è®¤workeråæå¡å¨æ¶,`dump`ä¼æå°å°å½ä»¤è¡.
### å
³äºä¸ä¼ æ件
å½æç
§é»è®¤çworkeråhttpæå¡å¨æ¶,并ä¸è½ç´æ¥ä½¿ç¨`request()->file('image')`æ¥è·å¾ä¸ä¼ çæ件,å
·ä½å¯ä»¥åè[workermançä¸ä¼ æ件第6ç¹](http://doc.workerman.net/web-server.html).å æ¤åªè½è¿åç使ç¨`Filesystem`.æ 论ææ ·,ä¸å½±åå
¶`getMime()`çæ¹æ³çæ£ç¡®æ§.
```
// $file = request()->file('image');
$file_data = $_FILES[0]['file_data'];
//$tmp_file = tempnam('','tm_'); è¿ç§åæ³æç»ä¿åæ¶æ©å±å为.tmp
$tmp_file = sys_get_temp_dir().'/'.uniqid().'.'.explode('/',$_FILES[0]['file_type'])[1];
file_put_contents($tmp_file,$file);
$file = new File($tmp_file);
$savename = Filesystem::putFile('upload',$file);
echo $savename;
```
### èªå®ä¹workermanæ令
ææ¶åæ们å¸æ使ç¨thinkçå½ä»¤è¡è¿è¡workerman,è¿éåä¸ä¸ªä»ç»,
1:å
æ°å»ºä¸ä¸ªæ令,åèææ¡£:[èªå®ä¹æ令](https://www.kancloud.cn/manual/thinkphp6_0/1037651),æ¯å¦æ°å»ºå½ä»¤:
```
php think make:command Hello hello
```
2:å¤å¶ä¸é¢ç代ç å°æ令é,è¦çåå§ç`configure`å`execute`æ¹æ³
```
protected function configure()
{
// æ令é
ç½®
$this->setName('convert')
->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload|status|connections", 'start')
->addOption('mode', 'm', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.')
->setDescription('the workerman command');
}
protected function execute(Input $input, Output $output)
{
// æ令è¾åº
$output->writeln('convert start');
$action = $input->getArgument('action');
$mode = $input->getOption('mode');
// éæ°æé å½ä»¤è¡åæ°,以便å
¼å®¹workermançå½ä»¤
global $argv;
$argv = [];
array_unshift($argv, 'think', $action);
if ($mode == 'd') {
$argv[] = '-d';
} else if ($mode == 'g') {
$argv[] = '-g';
}
// å¨è¿éæ¾å¿çå®ä¾åworker,
// å°±ååç
§workermanææ¡£åä¸æ ·,
// æ éå¨workermançææ¡£é,代ç æ¯æ°å»ºçº¯phpæ件,ä½å¨è¿é,åå°äºä¸ä¸ªæ¹æ³é.
$worker_1 = new Worker();
$worker_2 = new Worker();
Worker::runAll();
}
```
3:è¿è¡çæ¶å,使ç¨å¦ä¸å½ä»¤:
```
//临æ¶è¿è¡
php think hello start
//åå°è¿è¡
php think hello start --mode d
```
- åºè¨
- åºç¡
- å®è£
- å¼åè§è
- ç®å½ç»æ
- é ç½®
- æ¶æ
- 请æ±æµç¨
- æ¶ææ»è§
- å ¥å£æ件
- å¤åºç¨æ¨¡å¼
- URL访é®
- 容å¨åä¾èµæ³¨å ¥
- æå¡
- é¨é¢
- ä¸é´ä»¶
- äºä»¶
- è·¯ç±
- è·¯ç±å®ä¹
- åéè§å
- è·¯ç±å°å
- è·¯ç±åæ°
- è·¯ç±ä¸é´ä»¶
- è·¯ç±åç»
- èµæºè·¯ç±
- 注解路ç±
- è·¯ç±ç»å®
- ååè·¯ç±
- MISSè·¯ç±
- è·¨å请æ±
- URLçæ
- æ§å¶å¨
- æ§å¶å¨å®ä¹
- åºç¡æ§å¶å¨
- 空æ§å¶å¨
- èµæºæ§å¶å¨
- æ§å¶å¨ä¸é´ä»¶
- 请æ±
- 请æ±å¯¹è±¡
- 请æ±ä¿¡æ¯
- è¾å ¥åé
- 请æ±ç±»å
- HTTP头信æ¯
- 伪éæ
- åæ°ç»å®
- 请æ±ç¼å
- ååº
- ååºè¾åº
- ååºåæ°
- éå®å
- æ件ä¸è½½
- æ°æ®åº
- è¿æ¥æ°æ®åº
- åå¸å¼æ°æ®åº
- æ¥è¯¢æé å¨
- æ¥è¯¢æ°æ®
- æ·»å æ°æ®
- æ´æ°æ°æ®
- å é¤æ°æ®
- æ¥è¯¢è¡¨è¾¾å¼
- é¾å¼æä½
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- èåæ¥è¯¢
- å页æ¥è¯¢
- æ¶é´æ¥è¯¢
- é«çº§æ¥è¯¢
- è§å¾æ¥è¯¢
- JSONå段
- åæ¥è¯¢
- åçæ¥è¯¢
- æ¥è¯¢äºä»¶
- è·åå¨
- äºå¡æä½
- åå¨è¿ç¨
- æ°æ®é
- æ°æ®åºé©±å¨
- 模å
- å®ä¹
- 模åå段
- æ°å¢
- æ´æ°
- å é¤
- æ¥è¯¢
- æ¥è¯¢èå´
- JSONå段
- è·åå¨
- ä¿®æ¹å¨
- æç´¢å¨
- æ°æ®é
- èªå¨æ¶é´æ³
- åªè¯»å段
- 软å é¤
- ç±»å转æ¢
- 模åè¾åº
- 模åäºä»¶
- 模åå ³è
- ä¸å¯¹ä¸å ³è
- ä¸å¯¹å¤å ³è
- è¿ç¨ä¸å¯¹å¤
- è¿ç¨ä¸å¯¹ä¸
- å¤å¯¹å¤å ³è
- å¤æå ³è
- å ³èé¢è½½å ¥
- å ³èç»è®¡
- å ³èè¾åº
- è§å¾
- 模æ¿åé
- è§å¾è¿æ»¤
- 模æ¿æ¸²æ
- 模æ¿å¼æ
- è§å¾é©±å¨
- é误åæ¥å¿
- å¼å¸¸å¤ç
- æ¥å¿å¤ç
- è°è¯
- è°è¯æ¨¡å¼
- Traceè°è¯
- SQLè°è¯
- åéè°è¯
- è¿ç¨è°è¯
- éªè¯
- éªè¯å¨
- éªè¯è§å
- é误信æ¯
- éªè¯åºæ¯
- è·¯ç±éªè¯
- å ç½®è§å
- 表å令ç
- 注解éªè¯
- æ项
- ç¼å
- Session
- Cookie
- å¤è¯è¨
- ä¸ä¼
- å½ä»¤è¡
- å¯å¨å ç½®æå¡å¨
- æ¥ççæ¬
- èªå¨çæåºç¨ç®å½
- å建类åºæ件
- æ¸ é¤ç¼åæ件
- çææ°æ®è¡¨å段ç¼å
- çæè·¯ç±æ å°ç¼å
- è¾åºè·¯ç±å®ä¹
- èªå®ä¹æ令
- æ©å±åº
- æ°æ®åºè¿ç§»å·¥å ·
- Workerman
- thinkå©æå·¥å ·åº
- éªè¯ç
- Swoole
- éå½
- å©æå½æ°
- å级æ导
- æ´æ°æ¥å¿