🎉 سال نو، مهارت نو، مشاوره رایگان نقشه راه برنامه نویسی (آفر ویژه ثبت نام قبل از افزایش قیمت 🔥)
۰ ثانیه
۰ دقیقه
۰ ساعت
۳ علی
queue workers
جامعه لاراول ایجاد شده در ۲۹ اردیبهشت ۱۴۰۱

سلام

ممنون میشم کمی درمورد بخش زیر توضیح بدید

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‌ها رو در پس زمینه و به صورت موازی با اجرای برنامه پردازش کنه


این چیزی که درک کردم درسته؟

علی ۲۹ اردیبهشت ۱۴۰۱، ۱۷:۱۷