利用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)