PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : اجرای یک فایل با کرون جاب هر 5 ثانیه



mehran-b
August 15th, 2017, 01:08
سلام بر دوستان و ستون های انجمن

من توی وردپرس یه کرون جاب داخلی تعریف کردم که هر 5 ثانیه اجرا میشه ولی همون طور که میدونید اگر هر 5 ثانیه یه بازدید از سایت انجام نشه از اجرای هر 5 ثانیه هم خبری نیست. بنابراین تصمیم گرفتم اجرای کرون جاب وردپرس با هر بازدید رو با قرار داد ثابت زیر در wp-config.php غیرفعال کنم.




define('DISABLE_WP_CRON', true);

و با خودم گفتم که فایل wp-cron.php رو با کرون جاب اجرا میکنم ولی بی خبر از اینکه کرون جاب ها هر دقیقه اجرا میشن بعد طی یه سری سرچ این صفحه (https://www.mullie.eu/parallel-processing-multi-tasking-php/) رو پیدا کردم اینجا نوشته تابع fopen به صورت موازی با سایر کدها اجرا میشه.

آیا واقعا اینطوریه؟

مثلا کد زیر رو در نظر بگیرید:





fopen('http://doamin.com/wp-cron.php?doing_wp_cron', 'r');
sleep(5);
fopen('http://doamin.com/wp-cron.php?doing_wp_cron', 'r');


اگر کد بالا رو در یک فایل php بذاریم و با کرون جاب اجرا کنیم اجرای فایل 5 ثانیه طول میکشه؟

تشکر بابت پاسخ هاتون

___.Hrs.___
August 15th, 2017, 01:15
اجرای کرون جاب اونم هر ۵ ثانیه امری غیر منطقی هست !

زیرا فشار بسیاری به سرور میاره

اگر امری منطقی بود خود سی پنل در پلن های پیشفرض ثانیه رو هم قرار میداد

mehran-b
August 15th, 2017, 01:21
اجرای کرون جاب اونم هر ۵ ثانیه امری غیر منطقی هست !

زیرا فشار بسیاری به سرور میاره

اگر امری منطقی بود خود سی پنل در پلن های پیشفرض ثانیه رو هم قرار میداد

شما درست میگید فشار زیادی میاره به سرور ولی بنده الان احتیاج دارم که هر 5 ثانیه یک تابع رو اجرا کنم.

___.Hrs.___
August 15th, 2017, 01:27
شما درست میگید فشار زیادی میاره به سرور ولی بنده الان احتیاج دارم که هر 5 ثانیه یک تابع رو اجرا کنم.

نگاهی به اینجا بندازید

https://stackoverflow.com/questions/30295868/how-to-cron-job-every-10-seconds-in-linux

از طریق sleep این کار شدنی هست

T.Toosi
August 15th, 2017, 01:40
سلام، اگر ورودی fopen یک آدرس بدید یک Request به آدرس میفرسته که منتظر پاسخ ـش نمیمونه (با Curl هم میتونید اینکارو بکنید) برای همین میشه برای parallel استفاده کرد. برای اجرای هر 5 ثانیه هم باید یم حلقه بینهایت بزنید سپس یک Request با Curl یا همین Fopen بفرستید و بعدش 5 ثانیه Sleep کنید.

mehran-b
August 15th, 2017, 01:56
سلام، اگر ورودی fopen یک آدرس بدید یک Request به آدرس میفرسته که منتظر پاسخ ـش نمیمونه (با Curl هم میتونید اینکارو بکنید) برای همین میشه برای parallel استفاده کرد. برای اجرای هر 5 ثانیه هم باید یم حلقه بینهایت بزنید سپس یک Request با Curl یا همین Fopen بفرستید و بعدش 5 ثانیه Sleep کنید.

شما مطمئنید fopen منتظر نتیجه نمیمونه؟ نمیشه یه جوری تست کرد؟

حلقه بی نهایت رو اینطوری زدم:





while(true) {
fopen('http://doamin.com/wp-cron.php?doing_wp_cron', 'r');
sleep(5);
}


درسته؟

بعد اصلا این فایلی که توش این حلقه هست رو اصلا باید با کرون جاب اجراش کنم یا خیر؟

T.Toosi
August 15th, 2017, 02:13
شما مطمئنید fopen منتظر نتیجه نمیمونه؟ نمیشه یه جوری تست کرد؟

حلقه بی نهایت رو اینطوری زدم:





while(true) {
fopen('http://doamin.com/wp-cron.php?doing_wp_cron', 'r');
sleep(5);
}


درسته؟

بعد اصلا این فایلی که توش این حلقه هست رو اصلا باید با کرون جاب اجراش کنم یا خیر؟



داخل اون سایته که آدس دادید همچین چیزی نوشته اما تا حالا خودم تست نکردم، داخل wp-cron.php یک حلقه بینهایت بزارید بعد یک fopen بزنید ببنید منتظر پاسخ میمونه یا نه، با Curl میتونید Timeout تنظیم کنید درخواست را بفرسته و منتظر پاسخ نماند که به شکل زیر میشود :


while(true) {
$ch = curl_init('http://doamin.com/wp-cron.php?doing_wp_cron');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT_MS, 10);
$data = curl_exec($ch);
curl_close($ch);
sleep(5);
}

این 10 میلی ثانیه هم مدت زمان پاسخ سرور شما به Request هست.

mehran-b
August 15th, 2017, 11:00
خوب من یه سری تست انجام دادم چیزی که متوجه شدم fopen اگار صبر میکنه تا گرفتم نتیجه ولی curl اوکی هست و مشکلی نداره.

فقط سه نکته میمونه اونم اینکه اون مقدار timeout توی Curl ده میلی ثانیه است که بعیده توی 10 میلی ثانیه سرور جواب بده اونو باید خودم افزایشش بدم؟

مورد بعدی هم اینکه فایل php ای که توش حلقه بی نهایت هست رو باید در ابتداش








ignore_user_abort(true);
set_time_limit(0);



رو قرار بدم درسته؟

تشکر

T.Toosi
August 15th, 2017, 15:22
فقط سه نکته میمونه اونم اینکه اون مقدار timeout توی Curl ده میلی ثانیه است که بعیده توی 10 میلی ثانیه سرور جواب بده اونو باید خودم افزایشش بدم؟

اینو باید تست کنید ببنید حداقل چقدر طول میکشه سرورـتون پاسخ بده بعد عدد ـش را زیاد کنید. (یک file_put_content یا متد mail() بزارید داخل wp-cron.php بعد حلقه بالا را اجرا کنید ببینید اگر روی 10 میلی فایل ساخت یا ایمیل فرستاد یعنی سرور پاسخ گرفته اگر نه عدد را زیاد کنید)


مورد بعدی هم اینکه فایل php ای که توش حلقه بی نهایت هست رو باید در ابتداش




ignore_user_abort(true);
set_time_limit(0);

این ها را هم قرار دهید اما نکته ای که هست بررسی کنید Execution time در PHP بی نهایت باشه در غیر این صورت به Timeout میخورید و کد بالا جواب شما را نخواهد داد.

mojtaba05
August 15th, 2017, 17:47
سلام
از setInterval جاوااسکریپت هم می تونید استفاده کنید، یه درخواست آجاکس داخل setInterval بنویسید تا در هر 5 ثانیه درخواست به سرور ارسال بشه.