开发需求:在一套老项目中(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;
});
}
});
<?php
namespace 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。