Lajur tutorial Laravel berikut akan berkongsi dengan anda rekod tentang pengecualian baris gilir Redis yang disebabkan oleh Laravel Observer, saya harap ia akan membantu semua orang!
Selepas mencipta model baharu, gunakan acara model Observer Created untuk menolak ke dalam baris gilir penghantaran SMS tak segerak
AppHttpControllersUsersController
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(); } }
AppObserversUserObserver
class UserObserver{ public function created (User $user) { dispatch(new SmsQueue($user)); }}
Jabatan perniagaan melaporkan bahawa kadangkala pengguna tidak dapat menerima pemberitahuan SMS. , jadi saya menyemak Log mendapati terdapat ralat dan pengecualian sekali-sekala: Tiada hasil pertanyaan untuk model [AppModelsUser]. selepas mencipta model..., jadi saya membetulkan Kod perniagaan telah diperiksa dengan teliti dan meneka bahawa ia sepatutnya dipengaruhi oleh transaksi.
Sahkan sangkaan:Sudah tentu, selepas menunggu selama tiga saat, pengecualian baris gilir penyerahan 100% dicetuskan.
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(); } }
Memandangkan versi saya ialah 6.x, saya tidak boleh menggunakan yang baharu ini ciri [ Menangis]~~
Menukar tahap pengasingan kepada READ UNCOMMITTED boleh menyelesaikan masalah ini, tetapi untuk mengelakkan masalah yang lebih besar, saya menasihati anda untuk tidak menggunakan kaedah ini~
AppHandlersTransactionHandler
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 = []; }}
app/helpers.php
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); }}
AppListenersTransactionListener
namespace App\Listeners;use App\Handlers\TransactionHandler;class TransactionListener{ public function handle() { app(TransactionHandler::class)->run(); }}
AppProvidersEventServiceProvider
namespace 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 ] ];}
AppObserversUserObserver
class UserObserver{ public function created (User $user) { after_transaction(function() use ($user) { dispatch(new SmsQueue($user)); }); }}
Cadangan berkaitan:
Video Five Laravel terkini tutorialAtas ialah kandungan terperinci Menggunakan peristiwa Pemerhati dalam Laravel menyebabkan masalah pengecualian baris gilir Redis. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!