이 글은 Think-queue를 사용하여 Redis 메시지 큐를 구현하는 것과 관련된 문제를 주로 정리한 thinkphp에 대한 관련 지식을 제공합니다. 모두에게 도움이 되기를 바랍니다.
추천 학습: "PHP 비디오 튜토리얼"
메시지 큐 미들웨어는 대규모 시스템에서 중요한 구성 요소이며 점차 기업 시스템에서 내부 통신의 핵심 수단이 되었습니다. 느슨한 결합, 비동기 메시징, 트래픽 피크 감소, 안정적인 전달, 브로드캐스트, 흐름 제어 및 최종 일관성과 같은 일련의 기능을 가지며 비동기 RPC의 주요 수단 중 하나가 되었습니다.
메시지 대기열에는 두 가지 역할과 컨테이너가 있습니다. 역할은 생산자(작업 게시 담당)와 소비자(작업 실행 담당)입니다. 컨테이너는 생산자가 게시한 작업을 별도로 저장/누적하는 데 사용됩니다. 서로 영향을 주지 않고 게시와 실행의 두 단계를 수행합니다.
생산자가 해제한 작업은 메시지 대기열에 저장/축적되고, 소비자는 주도적으로 메시지 대기열에서 작업을 꺼내 실행합니다. 먼저 실행됩니다(큐: 선입선출). 소비자가 없으면 작업은 실행을 위해 대기하면서 대기열에 쌓이게 됩니다.
메시지 대기열은 동시성이 크거나 처리 시간이 길고 일괄 작업이 필요한 타사 인터페이스에 적합합니다. SMS 전송, 이메일 전송, 앱 푸시 등에 사용할 수 있지만 이에 국한되지는 않습니다. -시스템, 즉 이 시스템에서 게시한 메시지입니다. 대기열은 자체적으로 또는 다른 시스템을 위해 작업을 수행할 수 있습니다. 마찬가지로 시스템은 자체적으로 또는 다른 시스템에서 게시한 메시지 대기열 작업을 수행하는 소비자 역할을 할 수도 있습니다.
ThinkPHP의 Queue에는 Redis, Database, Topthink, Sync의 4가지 드라이버가 내장되어 있으며 여기서는 Redis도 권장됩니다
think-queue queue 메시지 작업 해제, 획득, 실행, 삭제, 재 해제, 지연 해제, 시간 제한 제어 및 기타 작업을 처리할 수 있습니다
추가 디렉터리에 queue.php 구성 파일을 생성합니다
<?phpreturn [ 'connector' => 'Redis', 'expire' => null, // 任务过期时间,默认为60秒,若要禁用,则设置为 null 'default' => 'REDIS_QUEUE', // 默认的队列名 'host' => '127.0.0.1', // redis 主机ip 'port' => 6379, // redis 端口 'password' => '', // redis 密码 'select' => 0, // 使用哪里一个 db,默认为 db0 'timeout' => 0, // redis 连接的超时时间 'persistent' => false, // 是否是长连接];
그 이유는 여기에 배치된 것은 대기열 때문입니다. 기본적으로 소스 코드는 구성 정보를 얻기 위해 extra에서 큐 파일을 읽습니다. 구성 파일을 다른 곳에 배치하려면 이에 따라 소스 코드의 기본 획득 구성을 수정해야 합니다. , 아래 그림과 같이
테스트 클래스, 생산자 메서드 작성
<?phpnamespace app\api\controller;use think\Controller;use think\Queue;class Test extends Controller{ // 生产者,添加消息队列 public function addQueue() { // 参数 $data = [ 'id' => rand(0, 99), 'userName' => '一起摸鱼' ]; // 消息队列名 $queueName = 'testQueue'; // 推入消息队列,注意这里的 ::class 是PHP5.5才有的写法 $isPushed = Queue::push(TestQueue::class, $data, $queueName); // PHP5.5以下的可以直接写命名空间 // $isPushed = Queue::push('app\common\queue\TestQueue', $data, $queueName); if ($isPushed !== false) { // 成功之后的业务 echo '队列加入成功'; } else { // 失败之后的业务 echo '队列加入失败'; } }}
Consumer로 사용되는 TestQueue 클래스를 생성하여 메시지 대기열에서 작업을 실행합니다
<?phpnamespace app\common\queue;use think\Log;use think\queue\Job;class TestQueue{ // 消费者执行入口 public function fire(Job $job, $data) { // 具体执行业务 $isJobDone = $this->doJob($data); if ($isJobDone) { // 消息队列执行成功,删除队列,否则会一直执行 $job->delete(); } else { // 消息队列执行失败 // 获取消息队列已经重试了几遍 $attempts = $job->attempts(); if ($attempts == 0 || $attempts == 1) { // 重新发布,参数 delay 是延时发布的时间 $job->release(2); } } } // 消息队列执行失败后会自动执行该方法 public function failed($data) { Log::error('消息队列达到最大重复执行次数后失败:' . json_encode($data)); } // 消息队列执行方法 public function doJob($data) { // 具体执行业务 $data = json_encode($data); echo '消息队列:' . $data; // 这里的判断条件以具体业务是否执行成功进行判断 if ($data) { echo "执行成功"; return true; } else { echo "执行失败"; return false; } }}
요청 인터페이스, 생산자가 작업 게시
redis 대기열은 작업을 저장합니다
다음 단계는 대기열의 수신 모드를 활성화하는 것입니다. 대기열을 수동으로 실행할 수 없기 때문입니다. 작업이 추가될 때마다. 대기열에는 두 가지 청취 모드가 있습니다. 구성 매개변수는 다음과 같습니다.
프로젝트 루트 디렉터리에서 실행
php think queue:work --queue 대기열 이름
소비자를 시작하고 작업을 실행합니다.
redis in the queue 작업은 실행 후에도 삭제됩니다
그러나 필요에 따라 소비자 데몬 프로세스의 실행도 일시 중지하여 대기열을 닫은 후에도 대기열을 시작할 수 있도록 해야 합니다. 단말기.
nohup php think queue:listen --queue queue name&
PS: 터미널을 종료하려면 셸에 exit를 입력하세요
PS: 터미널을 종료하려면 셸에 exit를 입력하세요
PS: 터미널을 종료하려면 쉘에 exit를 입력하세요
nohup이 성공적으로 실행된 후 프로그램 닫기 버튼을 직접 클릭하여 터미널을 닫으면 해당 명령에 해당하는 세션의 연결이 끊어지기 때문에 nohup에 해당하는 프로세스를 함께 종료해야 한다는 알림을 받습니다.
이 시점에서 전체 메시지 대기열 프로세스가 끝났습니다.
추천 학습: "PHP 비디오 튜토리얼"
위 내용은 이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!