>PHP 프레임워크 >ThinkPHP >이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

WBOY
WBOY앞으로
2022-06-28 15:33:143998검색

이 글은 Think-queue를 사용하여 Redis 메시지 큐를 구현하는 것과 관련된 문제를 주로 정리한 thinkphp에 대한 관련 지식을 제공합니다. 모두에게 도움이 되기를 바랍니다.

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

추천 학습: "PHP 비디오 튜토리얼"

간단한 소개:

메시지 큐 미들웨어는 대규모 시스템에서 중요한 구성 요소이며 점차 기업 시스템에서 내부 통신의 핵심 수단이 되었습니다. 느슨한 결합, 비동기 메시징, 트래픽 피크 감소, 안정적인 전달, 브로드캐스트, 흐름 제어 및 최종 일관성과 같은 일련의 기능을 가지며 비동기 RPC의 주요 수단 중 하나가 되었습니다.

언어:

메시지 대기열에는 두 가지 역할과 컨테이너가 있습니다. 역할은 생산자(작업 게시 담당)와 소비자(작업 실행 담당)입니다. 컨테이너는 생산자가 게시한 작업을 별도로 저장/누적하는 데 사용됩니다. 서로 영향을 주지 않고 게시와 실행의 두 단계를 수행합니다.

메시지 대기열의 일반적인 프로세스는 다음과 같습니다.

생산자가 해제한 작업은 메시지 대기열에 저장/축적되고, 소비자는 주도적으로 메시지 대기열에서 작업을 꺼내 실행합니다. 먼저 실행됩니다(큐: 선입선출). 소비자가 없으면 작업은 실행을 위해 대기하면서 대기열에 쌓이게 됩니다.

장점:

메시지 대기열은 동시성이 크거나 처리 시간이 길고 일괄 작업이 필요한 타사 인터페이스에 적합합니다. SMS 전송, 이메일 전송, 앱 푸시 등에 사용할 수 있지만 이에 국한되지는 않습니다. -시스템, 즉 이 시스템에서 게시한 메시지입니다. 대기열은 자체적으로 또는 다른 시스템을 위해 작업을 수행할 수 있습니다. 마찬가지로 시스템은 자체적으로 또는 다른 시스템에서 게시한 메시지 대기열 작업을 수행하는 소비자 역할을 할 수도 있습니다.


다음은 think-queue의 사용법을 주로 소개합니다

ThinkPHP의 Queue에는 Redis, Database, Topthink, Sync의 4가지 드라이버가 내장되어 있으며 여기서는 Redis도 권장됩니다

think-queue queue 메시지 작업 해제, 획득, 실행, 삭제, 재 해제, 지연 해제, 시간 제한 제어 및 기타 작업을 처리할 수 있습니다

메시지 대기열의 기본 구성

추가 디렉터리에 queue.php 구성 파일을 생성합니다

<?phpreturn  [
    &#39;connector&#39;  => '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에서 큐 파일을 읽습니다. 구성 파일을 다른 곳에 배치하려면 이에 따라 소스 코드의 기본 획득 구성을 수정해야 합니다. , 아래 그림과 같이

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

created by producer

테스트 클래스, 생산자 메서드 작성

<?phpnamespace  app\api\controller;use think\Controller;use think\Queue;class Test extends Controller{
    // 生产者,添加消息队列
    public function addQueue()
    {
        // 参数
        $data = [
            &#39;id&#39; => 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

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;
        }
    }}

실행 결과

요청 인터페이스, 생산자가 작업 게시

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

redis 대기열은 작업을 저장합니다

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

다음 단계는 대기열의 수신 모드를 활성화하는 것입니다. 대기열을 수동으로 실행할 수 없기 때문입니다. 작업이 추가될 때마다. 대기열에는 두 가지 청취 모드가 있습니다. 구성 매개변수는 다음과 같습니다.

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

프로젝트 루트 디렉터리에서 실행

php think queue:work --queue 대기열 이름

소비자를 시작하고 작업을 실행합니다.
이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

redis in the queue 작업은 실행 후에도 삭제됩니다

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

그러나 필요에 따라 소비자 데몬 프로세스의 실행도 일시 중지하여 대기열을 닫은 후에도 대기열을 시작할 수 있도록 해야 합니다. 단말기.

nohup php think queue:listen --queue queue name&

이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.

PS: 터미널을 종료하려면 셸에 exit를 입력하세요
PS: 터미널을 종료하려면 셸에 exit를 입력하세요
PS: 터미널을 종료하려면 쉘에 exit를 입력하세요

nohup이 성공적으로 실행된 후 프로그램 닫기 버튼을 직접 클릭하여 터미널을 닫으면 해당 명령에 해당하는 세션의 연결이 끊어지기 때문에 nohup에 해당하는 프로세스를 함께 종료해야 한다는 알림을 받습니다.

이 시점에서 전체 메시지 대기열 프로세스가 끝났습니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 이 기사에서는 think-queue를 사용하여 ThinkPHP를 사용하여 Redis 메시지 큐를 구현하는 방법을 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제