利用workerman可以常駐進程的特性,我們可以寫一個簡單的定時任務。
*****
**## 邏輯代碼中,請不要使用`exit `、`die `、`sleep`語句**
*****
## 1、安裝workerman
workerman是一個通用的socket服務器框架。怎么去理解這句話呢?你不能把workerman和thinkphp等同起來,雖然都是php框架,但做的事情不一樣。
我們可以把workerman看做一個容器,對外提供基于指定協議或者自定義協議的網絡服務。某種意義上,workerman和apache、nginx干的事情一樣。
為了區分workerman和thinkphp,我們此例子中,并未部署thinkphp。
進入自己的項目目錄,或者新建一個空目錄`TimerExample`:
```
composer require workerman/workerman
```
然后我們的目錄就會有以下文件或目錄:
```
TimerExample目錄(或者你的項目目錄)
├─vendor
│ ├─composer
│ ├─workerman workerman核心代碼
│ ├─autoload.php
├─composer.json
├─composer.lock
```
## 2、新建邏輯處理類
這些目錄或者文件,我們基本不用做任何改動,然后我們在新建`TimerExample/app/`目錄和新建一個`app/Job`的類
```
class Job
{
public function curlUrl($url)
{
$data = [];
return $data;
}
protected function saveData()
{
return true;
}
}
```
## 3、新建入口文件
我們在項目跟目錄,新建一個文件`Timer.php`:
```
<?php
use Workerman\Worker;
use \Workerman\Lib\Timer;
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/app/Job.php';
// 創建一個Worker監聽2345端口,使用http協議通訊
$task = new Worker("http://0.0.0.0:2345");
//進程數,如果沒有$task->id === 0則會執行兩次
$task->count = 2;
$task->onWorkerStart = function($task)
{
//第一個任務進程
if($task->id === 0)
{
Timer::add(5, function(){//每5秒執行一次
$job = new \app\Job();
$job->curlUrl('http://www.baidu.com');
});
}
};
// 運行worker
Worker::runAll();
```
## 4、命令行啟動服務
以debug(調試)方式啟動
`php Timer.php start`
以daemon(守護進程)方式啟動
`php Timer.php start -d`
這樣我們就完成了一個簡單的定時任務。
## 5、擴展:多個不同任務
`Timer.php`代碼,第一個任務進程每5秒執行一次,第二個進程每10秒執行一次,進程之間相互獨立,非阻塞模式。
```
<?php
use Workerman\Worker;
use \Workerman\Lib\Timer;
require_once __DIR__ . '/vendor/autoload.php';
require_once __DIR__ . '/app/Job.php';
require_once __DIR__ . '/app/Job2.php';
// 創建一個Worker監聽2345端口,使用http協議通訊
$task = new Worker("http://0.0.0.0:2345");
//進程數,如果沒有$task->id === 0則會執行兩次
$task->count = 2;
$task->onWorkerStart = function($task)
{
//第一個任務進程,每5秒執行一次
if($task->id === 0)
{
Timer::add(5, function(){
$job = new \app\Job();
$job->curlUrl('http://www.baidu.com');
});
}
//第二個任務進程,每十秒執行一次
if($task->id === 1)
{
Timer::add(10, function(){
$job2 = new \app\Job2();
$job2->curlUrl('http://www.baidu.com');
});
}
};
// 運行worker
Worker::runAll();
```
## 6、擴展:數據庫操作
workerman官方文檔:[Workerman/MySQL](http://doc.workerman.net/components/workerman-mysql.html)