我的逻辑是:python采集数据,扔进redis队列,然后消费者扔给控制器,返回数据库数据,再扔给其它队列去消费,现在是返回的数据一直错误,json_decode 出来的是空的,打印出来的是对象,但是不是一般的对象。["_body":protected] ,这里我看 Response 里面有这个方法,但好像不是针对这个对象的?我尝试了,没效果。但我在控制器,同样的model返回的,都直接可以用数组返问到?这又是为何?
* Get http raw body.
*
* @return string
*/
public function rawBody() {
return $this->_body;
}
<?php
namespace app\queue\redis;
use support\Requests;
use support\Response;
use Webman\RedisQueue\Redis;
use Webman\RedisQueue\Consumer;
use Webman\RedisQueue\Client;
use app\api\controller\GameController;
class LotterySend implements Consumer
{
// 要消费的队列
public $queue = 'lottery_queue_1010'; // 一千零一夜
public $connection = 'default';
// 消费者进程数
public function consume($data)
{
$gameController = new GameController();
$lottery_Data = $gameController->lotteryInsert($data);
var_dump($lottery_Data); //这里打印出来的数据如下
$result = json_decode($lottery_Data);
var_dump($result); //这里打印出来的是空的
// if($result['code'] == 200)
// {
// $sendData = ['data' => $result['data']];
// // 同步投递消息
// // Redis::send($sub_queue, $sendData);
// // 异步投递消息 // 将结果发送到其他消费者
// Client::send('push-to-app', $sendData); // 推送给前端APP消费者
// Client::send('push-to-settlement', $sendData); // 推送给后端结算消费者
// }else{
// return json(['code'=>400,'data'=>'', 'msg' => '入库返回数据有误']);
// }
}
}
var_dump($lottery_Data); //这里打印出来的数据如下
#12 {main}object(support\Response)#103 (7) {
["exception":protected]=>
NULL
["_header":protected]=>
array(1) {
["Content-Type"]=>
string(16) "application/json"
}
["_status":protected]=>
int(200)
["_reason":protected]=>
NULL
["_version":protected]=>
string(3) "1.1"
["_body":protected]=>
string(310) "{"code":200,"data":{"id":224,"created_at":"2023-08-21 03:13:50","updated_at":"2023-08-21 03:13:50","typeid":1,"typename":"星座","game_itemid":7,"game_itemname":"狮子","issue":"1223","dimension":"1692558780","num":7,"xmm":"10","colorcode":"#FFDAB9"},"msg":"入库成功"}"
["file"]=>
NULL
}
NULL
$lottery_Data = $gameController->lotteryInsert($data); 这里是控制器
控制器最后的代码就是查询最后的插入ID,返回一些数据:
// 通过事务确保数据一致性
$last_id = Game::GetId($insertData);
if ($last_id) {
$res_data = Game::getGameById($last_id);
return json(['code' => 200, 'data' => $res_data, 'msg' => '入库成功']);
}
下面是GAME model,用的是TPROM,
/**
* 获取指定ID的游戏记录
*/
public static function getGameById($id){
$query = self::where(['id'=>$id])->find();
return $query;
}
在消费端new 一个controller是什么操作?直接队列处理逻辑即可?为何还要走一到控制器?
你把GameController里的lotteryInsert的处理逻辑放倒LotterySend里不行吗?
return json返回的是一个Response, 你要获得这个response需要用curl之类http client去获取
原来这样,谢谢大佬~也是可以的,只不过,那个GameController对外开放的api接口而己~