開發需求:在一套老項目中(fastadmin)實現一個定時任務,每分鐘訪問幾十個接口,拿到數據。
使用的swoole,在thinkphp5中實現協程。
啟動命令php swoole.php
<?php
//chdir(__DIR__);
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE', 'admin');
require __DIR__ . '/thinkphp/start.php';use think\Db;
use app\admin\controller\Urls;
use app\admin\controller\Cloudbypass;Swoole\Runtime::enableCoroutine();Swoole\Coroutine\run(function() {for ($i = 1; $i <= 10; $i++) {go(function() use ($i) {$data = ['name' => 'ming','age' => mt_rand(20, 28),'tags' => ['php', 'swoole'],];$info = new Cloudbypass();$response = $info->runTask($data);$now = microtime(true);$millisecond = sprintf("%.3f", $now); // 保留3位小數,相當于毫秒echo "[$i] " . $response->getContent() . " 時間: {$millisecond}" . PHP_EOL;});}
});
<?phpnamespace app\admin\controller;use app\common\controller\Backend;
use think\Log;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;class Cloudbypass extends Backend
{public function runTask($data){// 這里你可以直接使用數組$name = $data['name'] ?? '未知';$age = $data['age'] ?? '未知';$tags = implode(',', $data['tags'] ?? []);return json(['code' => 1,'msg' => "調用成功: 姓名:{$name}, 年齡:{$age}, 標簽:{$tags}",]);}
}
邏輯就是并發調用runTask
接口。
可以加入sql
Swoole\Coroutine\run(function() {$list = Db::name('urls')->where('status', 1)->field('id')->select();foreach ($list as $v) {go(function() use ($v) {$urlsController = new Urls();$urlsController->updUrls($v['id']);echo "ID: {$v['id']} 本地調用完成" . PHP_EOL;});}
});
實現協程調用。在調用的方法內寫curl。