m.dhosseini
6 سال پیش توسط m.dhosseini مطرح شد
11 پاسخ

background worker یا multi theread در لاراول

سلام
من نیاز دارم یک در یک حالت خاص یک تابع در پس زمینه اجرا بشه و مقادیری رو تغییر بده. به شکل چند نخی
ممنون میشم اگر کسی اطلاعاتی در این زمینه داره به من کمک کنه.
با تشکر


ثبت پرسش جدید
مهدی طهرانی
تخصص : cloud architect
@mtehrani 6 سال پیش مطرح شد
1

@mz.dhosseini
از Events و Queues استفاده کنید


حسین حسین پور
تخصص : طراح رابط کاربری، برنامه‌نویس
@hhp14111 6 سال پیش مطرح شد
1

دوست عزیز php یک زبان اسکریپتی و multithread هستش به معنای این که n تا در خواست رو میتونه به صورت مجزا از هم دیگه handle بکنه یعنی برای هر درخواست یک thread تنها کاری که شما میتونید بکنید اینه که درخواست رو بفرستید و شما تعیین نمیکنید که multithread اجرا بشه یا single thread !
البته میتونید چندین تابع و عملیات رو در یک درخواست اجرا کنید تا موقعی که از keyword های مثل return (در اولین متد) یا die یا exit استفاده نکردین میتونید در هر متد یک متد دیگه رو صدا بزنید محدودیتی هم نداره مگه این که به timeout یا max recursive یا max_memory_limit سیستم بخورید که اونها رو هم میتونید در php.ini زیاد کنید تا اونجایی که سرورتون پاسخگو باشه.


m.dhosseini
@m.dhosseini 6 سال پیش مطرح شد
0

@hhp14111
ممنون من یه تابع رو در یک درخواست ایجکس فراخوانی میکنم و نیاز هست در طی همون فرآیند ایجکس یک سری کارهای دیگه هم انجام بشه حالا وقتی تابع اجرا میشه فرآیند های ایجکسی که بعد ارسال میشه متوقف میشه تا اون تابع تموم بشه حالا من میخوام در حال اجرای این تابع فرآیند ها متوقف نشن.
ممنون میشم برای ایکه میگید تعیین کنم multithread اجرا بشه یا نه بیشتر توضیح بدید که چطور باید مشخص کنم؟


m.dhosseini
@m.dhosseini 6 سال پیش مطرح شد
0

@haghft با event ها نشد میشه درباره Queues بیشتر توضیح بدید؟
یا اگر آموزشی تو سایت هست توضیح بدید.


حسین حسین پور
تخصص : طراح رابط کاربری، برنامه‌نویس
@hhp14111 6 سال پیش مطرح شد
0

php به صورت ذاتی اینجوری کار نمیکنه مگه این که socket بنویسی براش ولی خوب چند تا راه راحت تر میگم برات:
1- بیای از shell اسکریپت رو اجرا کنی که در این صورت برنامه متوقف نمیشه

exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");

2- بیای یه Endpoint با route برای task مورد نظرت بنویسی و با curl به اون درخواست بدی مثل وب سرویس ها.

http://domain/tasks/t1
$service->addTask('t1', $data); 

m.dhosseini
@m.dhosseini 6 سال پیش آپدیت شد
0

@hhp14111
ممنون از پیام شما
میشه یه shell اسکریپت رو چندبار فراخوانی کرد؟
میشه که در این دستور
exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");
یه روت رو فراخوانی کرد؟
و آیا این دستور منتظر میمونه که تموم بشه بعد کدهای بعدش رو اجرا میکنه؟
میشه دقیق تر در رابطه با مورد دوم توضیح بدید؟ چه Endpoint با چه مقادیر تعریف کنم؟
ممنون میشم اگر یکم بیشتر راهنمایی کنید


حسین حسین پور
تخصص : طراح رابط کاربری، برنامه‌نویس
@hhp14111 6 سال پیش آپدیت شد
1

از shell فکر نمیکنم بشه url رو فراخونی کرد باید آدرس فایل مورد نظرتون رو به صورت absolute بدین . شایدم بشه خودتون سرچ کنید. دیگه ربطی به php نداره برنامه نویسی shell هستش. ولی تا موقعی که خروجی تابع exec() رو مساوی چیزی قرار ندادید برنامه منتظر تموم شدنش نمیمونه و عبور میکنه.
ولی با curl خیلی راحت میتونید route مد نظرتون رو با هر نوع درخواستی که هست فراخونی کنید

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
     curl_exec($ch);

البته منظورم از route آدرس کامل هستش.


مهدی طهرانی
تخصص : cloud architect
@mtehrani 6 سال پیش مطرح شد
0

mz.dhosseini@gmail.com
@hhp14111
برای فراخوانی روت از guzzlehttp استفاده کنید


m.dhosseini
@m.dhosseini 6 سال پیش مطرح شد
0

@hhp14111
مشکل هنوز هست به این شکل که وقتی من روت یا آدرس رو به شکلی که شما گفتید فراخوانی میکنم
کل سرور منتظر میمونه تا کد تموم بشه و بعد دستورات دیگه اجرا میشن یعنی حتی تا قبل از تموم شدن دستور روت های سایت رو هم اجرا نمیکنه


حسین حسین پور
تخصص : طراح رابط کاربری، برنامه‌نویس
@hhp14111 6 سال پیش آپدیت شد
0
 ob_start();
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$size = ob_get_length();
header("Content-Length: $size");
header('Connection: close');
ob_end_flush();
ob_flush();
flush();

باید درخواست رو در buffer بذارید


m.dhosseini
@m.dhosseini 6 سال پیش مطرح شد
0

متاسفانه هیچ کدوم از روش ها برام کارآمد نشد.
اگر کسی آموزشی در رابطه با Queues در لاراول داره ممنون میشم راهنمایی کنه


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام