検索
ホームページPHPフレームワークLaravelLaravelが同じキュータスクを繰り返し実行する理由を知っていますか?

次のチュートリアルコラムでは、Laravel が同じキュータスクを繰り返し実行する理由を紹介します。

#Laravel が同じキュータスクを繰り返し実行するのはなぜですか? Laravelが同じキュータスクを繰り返し実行する理由を知っていますか?

まず理由について説明します。Laravel では、キュー (タスク) の実行時間が 60 秒を超えると、失敗したとみなされ、キューに再度追加されます。その結果、同じタスクが繰り返し実行されることになります。

このタスクのロジックは、コンテンツをユーザーにプッシュすることです。ユーザーは、キューのコンテンツに基づいて取得および走査され、リクエスト バックエンド HTTP インターフェイスを通じて送信される必要があります。たとえば、ユーザーが 10,000 人いる場合、ユーザー数が多かったり、インターフェースの処理速度がそれほど速くない場合、実行時間は確実に 60 秒を超えるため、タスクは再びキューに追加されます。

状況はさらに悪く、前のタスクが 60 秒以内に実行されなかった場合、それらのタスクは再びキューに追加され、同じタスクが 1 回だけでなく複数回実行されることになります。

Laravel のソースコードから犯人を見つけてみましょう。 ソースコードファイル:vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php

/**
 * The expiration time of a job.
 *
 * @var int|null
 */
protected $expire = 60;

この$expireメンバー変数は固定値であり、Laravelはキューは関係ないと考えていますどのように 60 数秒以内に完了する必要があります。キューの取得方法:

public function pop($queue = null)
{
    $original = $queue ?: $this->default;
 
    $queue = $this->getQueue($queue);
 
    $this->migrateExpiredJobs($queue.':delayed', $queue);
 
    if (! is_null($this->expire)) {
        $this->migrateExpiredJobs($queue.':reserved', $queue);
    }
 
    list($job, $reserved) = $this->getConnection()->eval(
        LuaScripts::pop(), 2, $queue, $queue.':reserved', $this->getTime() + $this->expire
    );
 
    if ($reserved) {
        return new RedisJob($this->container, $this, $job, $reserved, $original);
    }
}

キューを取得するにはいくつかの手順があります。キューの実行が失敗するか、実行がタイムアウトになるため、キューは別のコレクションに入れられ、再試行のために保存されます。処理は次のとおりです。

1 .遅延収集から実行に失敗したキューを現在実行中のキューに再プッシュします。

2. 実行タイムアウトのため、予約されたコレクションから現在実行されているキューにキューを再プッシュします。

3. 次に、キューからタスクを取得して実行を開始し、予約された順序付きコレクションにキューを入れます。

ここでは eval コマンドを使用してこの処理を実行し、いくつかの lua スクリプトを使用します。

実行するキューからタスクを取得します:

local job = redis.call('lpop', KEYS[1])
local reserved = false
if(job ~= false) then
    reserved = cjson.decode(job)
    reserved['attempts'] = reserved['attempts'] + 1
    reserved = cjson.encode(reserved)
    redis.call('zadd', KEYS[2], ARGV[1], reserved)
end
return {job, reserved}

Laravel が Redis によって実行されるキューを取得すると、順序付けされたキューにコピーも配置されることがわかります。 collection. を使用し、有効期限のタイムスタンプをスコアとして使用します。

タスクが完了した場合にのみ、タスクは順序付けセットから削除されます。この順序付けされたコレクションからキューを削除するコードは省略されていますが、実行時間が 60 秒を超えるキューを Laravel がどのように処理するかを見てみましょう。 これは、この Lua スクリプトによって実行される操作です:

local val = redis.call('zrangebyscore', KEYS[1], '-inf', ARGV[1])
if(next(val) ~= nil) then
    redis.call('zremrangebyrank', KEYS[1], 0, #val - 1)
    for i = 1, #val, 100 do
        redis.call('rpush', KEYS[2], unpack(val, i, math.min(i+99, #val)))
    end
end
return true

ここで、zrangebyscore は、スコアが無限小から現在のタイムスタンプまでの範囲にある要素、つまり 60 秒前にコレクションに追加されたタスクを検索します。これらの要素は、zremrangebyrank を介してセットから削除され、キューにプッシュされます。

これを見たらハッと気づくはずです。

キューが 60 秒以内に実行されなかった場合、プロセスはキューをフェッチするときに予約セットからタスクを再度キューにプッシュします。

関連する推奨事項:
最新の 5 つの Laravel ビデオ チュートリアル

以上がLaravelが同じキュータスクを繰り返し実行する理由を知っていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
共同ドキュメント編集:分散チームのワークフローの合理化共同ドキュメント編集:分散チームのワークフローの合理化Apr 27, 2025 am 12:21 AM

コラボレーティブドキュメント編集は、分散チームがワークフローを最適化するための効果的なツールです。リアルタイムのコラボレーションとフィードバックループを通じてコミュニケーションとプロジェクトの進捗を改善し、一般的なツールにはGoogleドキュメント、Microsoftチーム、概念が含まれます。使用時のバージョン制御や学習曲線などの課題に注意してください。

前のLaravelバージョンはどのくらいサポートされますか?前のLaravelバージョンはどのくらいサポートされますか?Apr 27, 2025 am 12:17 AM

PreviousVersionOflAravelisSupportedededSedesixmonthsandSecurityFixesseSeCurityfixesseSearaheearAfterAnewMajorversion'sRelease.Surstanding understanding understanding untinding for PlanningUpgrades、保証されている可能性、およびレバレングリエンジュレーリュアリュアリュアリュアリュアシュリュアケーション

フロントエンド開発とバックエンド開発の両方のLaravelの機能を活用しますフロントエンド開発とバックエンド開発の両方のLaravelの機能を活用しますApr 27, 2025 am 12:16 AM

laravelcanbeefeectivelyは、development.1)backend:utilizelaravel'seloquentormforsimprifiedDatabaseInteractions.2)frontend:cleanhtmlandEgratevue.jsfordynamicspasのレバレッジブラデテンプレーズ、エンサイリングレスレスレスフロレンテンドバッキンティントのためにレバレッジブラデテットを使用します

Laravelは、フルスタック開発(フロントエンドバックエンド)に使用できますか?Laravelは、フルスタック開発(フロントエンドバックエンド)に使用できますか?Apr 27, 2025 am 12:10 AM

laravelcanbeusedfurfullstackdevelopment.1)backendmasterywithlaravel'sexpressivesyntaxandfeatureslikeLoquentormatabasabasabasemanagement.2)frontendintegrationsingingbladeydynamtmltemplates.3)拡張フロントエンドウィットラーラーアセットコンプレイテーション

最新のLaravelバージョンへのアップグレードに役立つツールは何ですか?最新のLaravelバージョンへのアップグレードに役立つツールは何ですか?Apr 27, 2025 am 12:02 AM

回答:Laravelのアップグレードに最適なツールには、Laravelのアップグレードガイド、Laravelshift、Rector、Composer、Laravelpintが含まれます。 1.アップグレードロードマップとして、Laravelのアップグレードガイドを使用してください。 2. LaravelShiftを使用して、ほとんどのアップグレード作業を自動化しますが、手動のレビューが必要です。 3. Rectorを介してコードを自動的にリファクタリングし、ルールを理解し、カスタマイズする必要があります。 4. Composerを使用して依存関係を管理し、依存関係の可能性のある競合に注意を払います。 5.コードスタイルの一貫性を維持するためにlaravelpintを実行しますが、機能的な問題は解決しません。

ズームコールを超えて:分散チームを接続するための創造的な戦略ズームコールを超えて:分散チームを接続するための創造的な戦略Apr 26, 2025 am 12:24 AM

ToenhanceEngagementAndCohesionAmongDistributedTeamSbeyOndzoom、実装してください

最新のLaravelバージョンの壊れた変更は何ですか?最新のLaravelバージョンの壊れた変更は何ですか?Apr 26, 2025 am 12:23 AM

laravel10introducesseveralbreakingchanges:1)itrequirephp8.1orhigher、2)therouteSerseprovidernowuseSabootdododdoddoddoddoddoddoddoddoddoddoddoddod forloadingroutes、3)the withtimestamps()methodoneLoquentrelationshipsissisdedisded and4)andosnowprefrefreferure()

生産性パラドックス:リモート設定での焦点と動機を維持する生産性パラドックス:リモート設定での焦点と動機を維持するApr 26, 2025 am 12:17 AM

WOCUSANDMOTIVERIANCIANGINTIANIVERMOTEWORK、CREATERUCTUREDENVIRONMENT、MANAGEDIGITALDISTRACTIONS、FOSTERMOTIVERIVESTROUGHSOCIAL-INTERACTIONSIONDANDGOALSETTINTING、MANTEMESTECHNOLOGY.1)SetUpAdedicatedWorkStickEndStickToTtoTtoTtoTtoTototine。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール

DVWA

DVWA

Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

WebStorm Mac版

WebStorm Mac版

便利なJavaScript開発ツール

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい