ホームページ > 記事 > PHPフレームワーク > Laravel で Observer イベントを使用すると、Redis キュー例外の問題が発生する
Laravel の次のチュートリアル コラムでは、Laravel Observer によって発生した Redis キュー例外に関する記録を共有します。
<pre class="brush:php;toolbar:false"> public function store(User $user)
{
\DB::beginTransaction();
try{
$input = request()->validated();
$user->fill($input);
$user->save();
//do something......
//其他数据表操作
\DB::commit();
} catch ($e \Exception) {
\DB::rollBack();
}
}</pre>
<pre class="brush:php;toolbar:false">class UserObserver{
public function created (User $user)
{
dispatch(new SmsQueue($user));
}}</pre>
入力できません はい、モデルを作成した後にキュー呼び出しを行いました...その後、ビジネス コードを注意深く確認し、トランザクションの影響を受けるはずだと推測しました。
推測を検証します: public function store(User $user)
{
\DB::beginTransaction();
try{
$input = request()->validated();
$user->fill($input);
$user->save();
//do something......
//其他数据表操作
sleep(3); //三秒之后再提交事务
\DB::commit();
} catch ($e \Exception) {
\DB::rollBack();
}
}
案の定、3 秒待機すると、送信キュー例外が 100% トリガーされます。
私のバージョンは 6.x なので、この新機能は使用しないでください[泣いています]~~
分離レベルを READ UNCOMMITTED に切り替えるとこの問題は解決できますが、より大きな問題を防ぐために、この方法は使用しないことをお勧めします~
class TransactionHandler{ public array $handlers; public function __construct() { $this->handlers = []; } public function add(\Closure $handler) { $this->handlers[] = $handler; } public function run() { foreach ($this->handlers as $handler) { $handler(); } $this->handlers = []; }}
補助関数の作成if (! function_exists('after_transaction')) { /* * 事务结束之后再进行操作 * */ function after_transaction(Closure $job) { app()->singletonIf(\App\Handlers\TransactionHandler::class, function (){ return new \App\Handlers\TransactionHandler(); }); app(\App\Handlers\TransactionHandler::class)->add($job); }}
リスナーの作成 namespace App\Listeners;use App\Handlers\TransactionHandler;class TransactionListener{ public function handle() { app(TransactionHandler::class)->run(); }}
# #バインド リスニングApp\Providers\EventServiceProvidernamespace App\Providers;use App\Listeners\TransactionListener;use Illuminate\Database\Events\TransactionCommitted;use Illuminate\Database\Events\TransactionRolledBack;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;;class EventServiceProvider extends ServiceProvider{ /** * The event listener mappings for the application. * * @var array */ protected $listen = [ TransactionCommitted::class => [ TransactionListener::class ], TransactionRolledBack::class => [ TransactionListener::class ] ];}
呼び出しメソッドの変更
# #
class UserObserver{ public function created (User $user) { after_transaction(function() use ($user) { dispatch(new SmsQueue($user)); }); }}
OK、洗練されたソリューションが完成しました~~
関連する推奨事項: 以上がLaravel で Observer イベントを使用すると、Redis キュー例外の問題が発生するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。