initialize(); function app_redis() { static $redis = null; static $conn = false; if (!$conn) { connect: //定义标签 $redis = new Redis(); try { //建立的Redis短连接,在请求结束后不会自动关闭,相当于持久连接. $conn = $redis->connect(HOST, PORT); $conn = $redis->auth(PASSWORD); $conn = $redis->select(DATABASE); // 连接成功,返回$redis对象,连接失败,返回false. return ($conn === true) ? $redis : false; } catch (Exception $e) { return false; } } else { // 这里假设PHP-FPM在处理一个请求的时间内,Redis连接都是可用的. // 所以只在PHP-CLI下检查Redis连接的状态,进行断线重连. if (php_sapi_name() === 'cli') { try { // ping用于检查当前连接的状态,成功时返回+PONG,失败时抛出一个RedisException对象. // ping失败时警告: // Warning: Redis::ping(): connect() failed: Connection refused // var_dump('AAAAAAAAA', $redis); // echo 'Redis 连接状态' . $redis->ping() . PHP_EOL; @$redis->ping(); if (!$redis->ping()) { goto connect; //跳转到标签出继续执行连接操作 } } catch (Exception $e) { // 信息如 Connection lost 或 Redis server went away echo $e->getMessage(); echo 'Redis 连接失败 重新连接:' . PHP_EOL; // 断线重连 goto connect; } } return $redis; } } //{"from":"thing/product/8UUXN4U00A0725/osd","val":{"tid":"ef607005-2064-4395-b8bf-0ce5d9f4955d","bid":"fc6361a7-d976-4293-97ff-bb6f1a33a91d","timestamp":1755054098667,"data":{"network_state":{"type":2,"quality":0,"rate":3},"drone_charge_state":{"state":0,"capacity_percent":94},"drone_in_dock":1,"rainfall":0,"wind_speed":0.9,"environment_temperature":27.5,"temperature":22.9,"humidity":63,"heading":-61.36431884765625,"home_position_is_valid":1,"latitude":40.625679110649273,"longitude":109.93171708476122,"height":1025.981201171875,"alternate_land_point":{"latitude":40.62565450446364,"longitude":109.93164994308087,"height":0,"safe_land_height":30,"is_configured":1},"first_power_on":1631945855969,"position_state":{"is_calibration":1,"is_fixed":2,"quality":4,"gps_number":4,"rtk_number":26},"storage":{"total":53082240,"used":0},"mode_code":0,"cover_state":0,"silent_mode":0,"supplement_light_state":0,"emergency_stop_state":0,"air_conditioner":{"air_conditioner_state":0,"switch_time":0},"battery_store_mode":2,"alarm_state":0,"putter_state":0,"sub_device":{"device_sn":"1581F8HGX254V00A0BPZ","device_online_status":0,"device_paired":1}},"gateway":"8UUXN4U00A0725"}} while (1) { $jsonData= app_redis()->rpop("OSD_DOCK_LIST"); if(!$jsonData){ sleep(3); continue; } $redis_data=json_decode($jsonData,true); $topic=$redis_data['from']; $data=$redis_data['val']; // 使用 `/` 作为分隔符拆分字符串 $parts = explode('/', $topic); // 提取设备号 $device_sn = $parts[2]; var_dump($data['data']['latitude']); var_dump($data['data']['longitude']); var_dump($data['timestamp']); var_dump($device_sn); $save_data=[ 'longitude'=>$data['data']['longitude'], 'latitude'=>$data['data']['latitude'], 'login_time'=>$data['timestamp'], ]; try { $res = Db::connect('uav')->name('manage_device')->where('device_sn',$device_sn)->update($save_data); var_dump($res); } catch (\Exception $e) { // 错误日志或重新连接逻辑 echo "错误: " . $e->getMessage().PHP_EOL; // 重新连接逻辑(示例): Db::connect('uav')->close(); // 关闭现有连接 Db::connect('uav')->connect(); // 重新连接 $res = Db::connect('uav')->name('manage_device')->where('device_sn',$device_sn)->update($save_data); var_dump($res); } }