您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
thinkphp5 (tp5)实现命令行的swoole携程批量获取远端接口并入本地库(优雅入)
发布时间:2022-06-09 21:28:13编辑:雪饮阅读()
最近同事有个需求是批量获取n个远端接口拿来数据然后入本地库,参考了之前我所实现的swoole携程http的代码。
当时他没有太注意到,只发现了速度的确快了,之前同事自己直接用循环请求的方式对于成千上万的数据获取实在是太慢了。
但是这里我当时这个http携程实例仅仅考虑了批量获取,并没有考虑到在获取后的数据的入库问题。
那么今天帮忙折腾后发现swoole自带的mysql操作太过于原生sql了,而用了那个所谓的hyper-f框架好像直接Db操作也比较原生,除非自己建立模型。
最后查看了下swoft框架,文档上面虽然在分类里面让人看不出来能原生支持像tp那样直接Db开箱即用的操作,但是好像是在模型文档里面有看到。
对于hyper-f或许我了解的不够全面,反正初步判断是不能原生Db那样链式操作。
对于直接用tp,在12点之前也折腾过,可能是心浮气躁,加上又是以http携程服务器运行方式的,所以一直没有成功使用优雅的入库操作。
到了下午虽然我看swoft框架貌似不错,应该也能实现上面我的那个swoole携程的业务。
但是后来想想还是直接tp5上面做应该才会更优雅。
那么我就直接在tp5的命令行方式上实现,也是我第一次真正意义上使用tp5的命令行,之前是同事问我,我直接借着文档,在他那里实现了,自己没有真正用过。
那么tp5,thinkphp5的命令行使用方式可参考
那么这里借助这个以及swoole(具体好像是4.x),则很容易优雅的入库,且不用像之前那样要先命令行中开启携程http,然后浏览器访问才行。
这次可以直接执行命令行命令直接就在命令行中就批量请求接口并优雅的入库了。
那么实现的核心如:
Test.php:
<?php
namespace app\home\command;
use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;
use function Swoole\Coroutine\run;
use function Swoole\Coroutine\go;
use Swoole\Coroutine\Channel;
class Test extends Command
{
protected function configure()
{
$this->setName('test')->setDescription('Here is the remark ');
}
protected function execute(Input $input, Output $output)
{
\Swoole\Coroutine\run(function(){
$len=20000;
$chan = new Channel($len);
$host='cha.191.cn';
for($i=1;$i<=$len;$i++){
go(function () use ($chan,$i,$host) {
$cli = new \Swoole\Coroutine\Http\Client($host, 443,true);
$cli->set(['timeout' => 10]);
$cli->setHeaders([
'Host' => $host,
"User-Agent" => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36',
'Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
'Accept-Encoding' => 'gzip, deflate, br',
]);
$url="/api3/company/detail?companyId=".$i."&p=1&page_size=1000&token=3c36dd31b02f216dbd31e7961d7d6aee1ac8680d1654668599199&version=2.4.0&sys=android&deviceId=HKL59YKE&channleId=";
$cli->get($url);
$body=$cli->body;
if(!$body){
$body="empty";
}
$key="k_".$i;
$val=$body;
$chan->push([$key=>$val]);
});
}
for ($i = 0; $i <$len; $i++)
{
$current_result=$chan->pop();
$keys=array_keys($current_result);
$json_to_arr=json_decode($current_result[$keys[0]],true);
$content=$json_to_arr["data"]["info"]["id"].$json_to_arr["data"]["info"]["name"];
Db::name("test")->insert(["content"=>$content]);
}
});
}
}
然后完整实例如:
然后需要注意这里实现的这个需要php7.4之前的版本执行,比如php7.3
在项目根路径而非站点根目录执行命令如:
/www/server/php/73/bin/php -c /www/server/php/73/etc/php.ini think test
即可。
关键字词:thinkphp5,tp5,swoole,携程,命令行,command
相关文章
- swoole携程风格http服务器带来的问题chrome浏览器重复
- thinkphp5 php redis实现锁机制 setnx并一起设置key有
- swoole系列-在携程风格http服务器中实现异步"file_ge
- 基于GuzzleHttp(thinkphp5实现原生获取獲取微信公衆平
- workerman系列之tp5(thinkphp5)日志结合workerman使用
- java如何编译有jar依赖的java文件(纯命令行)java使用red
- Redis Command 命令
- Redis Command Info 命令
- Redis Command Getkeys 命令
- Redis Command Count 命令