Remember, queue workers, are long-lived processes and store the booted application state in memory. As a result, they will not notice changes in your code base after they have been started
سلام علی عزیز. وقت به خیر ?
برای درک این متن پیشنهاد میکنم یک Job درست کنی و صرفا درون متد handle کد زیر قرار بدی:
Log::info('This Is Information Log');
و بعد دستور زیر اجرا کنی:
php artisan queue:work
وقتی اجرا کردی همون Job بالا رو یکبار اجرا کن و نتیجش رو ببین که درون فایل laravel.log اون متن This Is Information Log قرار گرفته باشه.
حالا بدون اینکه queue:work متوقف کنی کدی که در Job نوشتیم که متنی برامون لاگ کنه پاک کن و به جاش این کد بنویس:
Log::critical('Hello From Laravel Job');
و مجددا Job بالا رو یکبار اجرا کن. ولی این دفعه وقتی به سراغ فایل laravel.log میری میبینی هنوز هم داره عبارت This Is Information Log چاپ میشه و نه Hello From Laravel Job.
دلیل این اتفاق دقیقا همون متنی هست که فرستادی. شما وقتی queue worker اجرا میکنی همون موقع از اپلیکیشن شما یک نسخه در رم ذخیره میشه و سیستم برای اجرای Job به سراغ اپلیکیشن داخل رمتون میره و دیگه با سورس کد روی هاردتون کاری نداره تا اینکه خودتون queue worker متوقف کنید و دستور زیر اجرا کنید:
php artisan queue:restart
با این دستور اون اپلیکیشن داخل رمتون حذف میشه و حالا اگه مجدد دستور
php artisan queue:work
اجرا کنید و مجدد Jobتون فراخوانی کنید این دفعه عبارت Hello From Laravel Job میبیند.
حواستون باشه اون متنی که فرستادید و اتفاقات بعدش فقط برای دستور
php artisan queue:work
صدق میکنه و نه دستور
php artisan queue:listen
موفق باشید ??
بهترین پاسخ
محمد حسن عاطفت۲۹ اردیبهشت ۱۴۰۱، ۱۵:۲۹
ممنون از پاسختون
آیا worker موازی با اجرای برناممون اجرا میشه ؟ سوالمو بیشتر توضیح میدم تا منظورمو متوجه بشید.
وقتی ما یک worker رو اجرا میکنیم یک نسخه از کل برنامه در حافظه ذخیره میکنه. وقتی کاربر درخواستی رو به سرور ما میزنه برنامه سمت سرور اجرا میشه همچنان که برنامه در حال اجراست در پس زمینه worker هم در حال اجراست یعنی دوتاشون به صورت موازی در حال اجرا هستن
فرض کنیم در وسطای اجرا برنامه یک job به صف ارسال میشه و همین که job در صف قرار گرفت worker در پس زمینه و موازی با اجرای برناممون اون job رو پردازش میکنه و worker برای اینکه بتونه اون job رو انجام بده نسخه ای از برنامه که تو حافظه ذخیره کرده رو اجرا میکنه
درواقع نتیجه ای که من میگیرم اینکه ، worker به این دلیل یه نسخه از برنامه رو در حافظه ذخیره میکنه که بتونه jobها رو در پس زمینه و به صورت موازی با اجرای برنامه پردازش کنه