description

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

- 3 هفته پیش
توسط mz.dhosseini@gmail.com آپدیت شد
mz.dhosseini@gmail.com ( 218 تجربه )
3 هفته پیش

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

مهدی طهرانی ( 6512 تجربه )
3 هفته پیش

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

حسین حسین پور ( 1787 تجربه )
3 هفته پیش

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

mz.dhosseini@gmail.com ( 218 تجربه )
3 هفته پیش

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

mz.dhosseini@gmail.com ( 218 تجربه )
3 هفته پیش

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

حسین حسین پور ( 1787 تجربه )
3 هفته پیش

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); 
mz.dhosseini@gmail.com ( 218 تجربه )
3 هفته پیش

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

حسین حسین پور ( 1787 تجربه )
3 هفته پیش

از 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 آدرس کامل هستش.

مهدی طهرانی ( 6512 تجربه )
3 هفته پیش

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

mz.dhosseini@gmail.com ( 218 تجربه )
3 هفته پیش

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

حسین حسین پور ( 1787 تجربه )
3 هفته پیش
 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 بذارید

mz.dhosseini@gmail.com ( 218 تجربه )
3 هفته پیش

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

برای ارسال پاسخ باید وارد سایت شوید