سلام
من نیاز دارم یک در یک حالت خاص یک تابع در پس زمینه اجرا بشه و مقادیری رو تغییر بده. به شکل چند نخی
ممنون میشم اگر کسی اطلاعاتی در این زمینه داره به من کمک کنه.
با تشکر
دوست عزیز php یک زبان اسکریپتی و multithread هستش به معنای این که n تا در خواست رو میتونه به صورت مجزا از هم دیگه handle بکنه یعنی برای هر درخواست یک thread تنها کاری که شما میتونید بکنید اینه که درخواست رو بفرستید و شما تعیین نمیکنید که multithread اجرا بشه یا single thread !
البته میتونید چندین تابع و عملیات رو در یک درخواست اجرا کنید تا موقعی که از keyword های مثل return (در اولین متد) یا die یا exit استفاده نکردین میتونید در هر متد یک متد دیگه رو صدا بزنید محدودیتی هم نداره مگه این که به timeout یا max recursive یا max_memory_limit سیستم بخورید که اونها رو هم میتونید در php.ini زیاد کنید تا اونجایی که سرورتون پاسخگو باشه.
@hhp14111
ممنون من یه تابع رو در یک درخواست ایجکس فراخوانی میکنم و نیاز هست در طی همون فرآیند ایجکس یک سری کارهای دیگه هم انجام بشه حالا وقتی تابع اجرا میشه فرآیند های ایجکسی که بعد ارسال میشه متوقف میشه تا اون تابع تموم بشه حالا من میخوام در حال اجرای این تابع فرآیند ها متوقف نشن.
ممنون میشم برای ایکه میگید تعیین کنم multithread اجرا بشه یا نه بیشتر توضیح بدید که چطور باید مشخص کنم؟
@haghft با event ها نشد میشه درباره Queues بیشتر توضیح بدید؟
یا اگر آموزشی تو سایت هست توضیح بدید.
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);
@hhp14111
ممنون از پیام شما
میشه یه shell اسکریپت رو چندبار فراخوانی کرد؟
میشه که در این دستور
exec("doTask.php $arg1 $arg2 $arg3 >/dev/null 2>&1 &");
یه روت رو فراخوانی کرد؟
و آیا این دستور منتظر میمونه که تموم بشه بعد کدهای بعدش رو اجرا میکنه؟
میشه دقیق تر در رابطه با مورد دوم توضیح بدید؟ چه Endpoint با چه مقادیر تعریف کنم؟
ممنون میشم اگر یکم بیشتر راهنمایی کنید
از 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 آدرس کامل هستش.
@hhp14111
مشکل هنوز هست به این شکل که وقتی من روت یا آدرس رو به شکلی که شما گفتید فراخوانی میکنم
کل سرور منتظر میمونه تا کد تموم بشه و بعد دستورات دیگه اجرا میشن یعنی حتی تا قبل از تموم شدن دستور روت های سایت رو هم اجرا نمیکنه
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 بذارید
متاسفانه هیچ کدوم از روش ها برام کارآمد نشد.
اگر کسی آموزشی در رابطه با Queues در لاراول داره ممنون میشم راهنمایی کنه
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟