多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
利用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)