56 lines
2.1 KiB
PHP
56 lines
2.1 KiB
PHP
<?php
|
|
|
|
namespace App\Commands;
|
|
|
|
use CodeIgniter\CLI\BaseCommand;
|
|
use CodeIgniter\CLI\CLI;
|
|
|
|
class NaverWorker extends BaseCommand
|
|
{
|
|
protected $group = 'Workers';
|
|
protected $name = 'naver:worker';
|
|
protected $description = 'Redis에서 데이터를 꺼내 DB에 저장하고 네이버 API를 호출합니다.';
|
|
|
|
public function run(array $params)
|
|
{
|
|
$redis = new \Redis();
|
|
try {
|
|
$redis->connect('redis', 6379);
|
|
$redis->select(9);
|
|
CLI::write(CLI::color('🟢 Naver Worker running...', 'green'));
|
|
} catch (\Exception $e) {
|
|
CLI::error("Redis 연결 불가: " . $e->getMessage());
|
|
return;
|
|
}
|
|
|
|
while (true) {
|
|
try {
|
|
// 'brPop'은 [큐이름, 데이터] 형태의 배열을 반환합니다.
|
|
$result = $redis->brPop(['naver:raw_queue'], 30);
|
|
|
|
$result = $redis->brPop(['naver:raw_queue'], 30);
|
|
if ($result) {
|
|
try {
|
|
$payload = json_decode($result[1], true);
|
|
$this->processTask($payload); // 실제 DB 저장 등
|
|
} catch (\Exception $e) {
|
|
// 처리 실패 시 다시 큐에 넣어서 나중에 재시도하게 함
|
|
$redis->lPush('naver:raw_queue', $result[1]);
|
|
CLI::error("처리 실패로 데이터를 큐에 다시 넣었습니다.");
|
|
}
|
|
}
|
|
} catch (\Exception $e) {
|
|
CLI::error("Worker Loop Error: " . $e->getMessage());
|
|
// 루프가 너무 빨리 돌며 에러를 뿜는 것을 방지
|
|
sleep(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
private function processTask($payload)
|
|
{
|
|
// 여기서 DB 모델(ConfirmModel)을 불러와 저장하고
|
|
// CURL을 사용하여 네이버 API를 호출하는 로직을 작성합니다.
|
|
CLI::write("Processing: " . ($payload['request_data']['articleNumber'] ?? 'Unknown'));
|
|
}
|
|
} |