PDA

View Full Version : اجرا شدن دائم یک سری فایل



Tarragon
دوشنبه 20 مرداد 1393, 19:45 عصر
با سلام
من یک سری فایل دارم که بایند دائم و بدون وقفه و یکتا ( یعنی تا تموم نشده دوباره شروع نشه) اجرا بشند.
می خوام بدونم با چه راهی می شه کاری کرد که این کار بعنوان process انجام بشه.
یعنی می خوام در پس زمینه همیشه در حال اجرا باشه.
یک چیزی خیلی خیلی مهم هم هست اینه که به هیچ عنوان حتی یکبار هم نباید در وسط کار متوقف بشن و دائما باید در حال کار کردن باشند.
کسی راهی سراغ داره؟
فکر کنم این (http://phplens.com/phpeverywhere/?q=node/view/254)هم مربوط می تونه باشه.
پیشاپیش از جواب مفیدتون ممنونم.

eshpilen
سه شنبه 21 مرداد 1393, 08:52 صبح
بهتره اول بگی چنین چیزی رو واسه چه کاری میخوای! شاید کسی ایدهء بهتری داشته باشه یا راه استانداردتری واسش باشه، یا اینکه اصلا نیاز به چنین چیزی نداشته باشی یا کاری که میخوای بکنی یجورایی اشتباه باشه.

Mohammadsgh
سه شنبه 21 مرداد 1393, 10:06 صبح
eshpilen راست میگه.ولی برای اون کار میتونی از کرون جابز استفاده کنید:لبخندساده:

Tarragon
سه شنبه 21 مرداد 1393, 12:45 عصر
سلام
برای یه بازی آنلاین باید یک سری کار همیشه در حال جریان باشه مثلا پروسه حمله به دهکده x رو کامل کنه و پردازش کنه.
از cronjobs نمی خوام استفاده کنم. راهی رو دیدم که طرف کاری می کرد که اگر task manager رو باز کنی در اون قسمت در حال انجام بود.

Mohammadsgh
سه شنبه 21 مرداد 1393, 13:06 عصر
من چند ماه پیش درباره همین مشکل یه جستجوی 5 دقیقه ای کردم.فقط به cronj jobs رسیدم.شاید راه دیگه ای هم باشه:لبخندساده:

Tarragon
سه شنبه 21 مرداد 1393, 13:34 عصر
هستن که هست.
دیدم خودم.
تو لینکی هم که اقای eshpilen تو یه تاپیک دادن و در پست اول هم یه سری چیزا ذکر کردم.

Unique
سه شنبه 21 مرداد 1393, 15:02 عصر
دوست عزیز ! php برای این کار ها نیست. در واقع شما باید از php به صورت cli استفاده کنی و برای اینکه اگه به هر دلیلی برنامه متوقف شد دوباره ریست بشه بهترین راه daemon هست یعنی به صورت یک daemon توی لینوکس اجرا بشه که در صورت stop شدن یا reset شدن سیستم خودش دوباره به اجرا برگرده ! daemon ها مانند windows service ها هستند و البته بسیار بسیار قدرتمند تر ! ولی به قول یکی که میگفت PHP is meant to die باز هم میگم که php به درد این کار نمیخوره و مشکلاتش زیاده ! من برای چنین کاری فقط از python استفاده میکنم. java هم گزینه بدی نیست ام امن ازش خوشم نمیاد و اگه باهاش راحتی اون هم متداوله.

مدتی پیش برای یک پروژه نیاز به این کار پیدا کردم و از روی این آموزش (http://www.bram.us/2013/11/11/run-a-php-script-as-a-servicedaemon-using-start-stop-daemon/) انجام دادم. امیدوارم موفق باشی.

Tarragon
سه شنبه 21 مرداد 1393, 15:12 عصر
سلام
دقیقا همین رو می خواستم.
خیلی خیلی ممنونم.
می خوام بدونم می شه روی VPS اینکارو کرد؟
سیستم مورد نیاز daemon چیه؟
درمورد اینکه از اول شروع کنه متاسفانه همین خیلی مسئله بزرگیه.
قصد دارم اینکارو بکنم چون روش الانم وقتی سرور خیلی سنگین می شه ممکنه وسطش قطع شه و دقیقا قصد تغییرش رو دارم چون ممکنه وسطش قطع شه.
چکار می کشه کرد که اگر وسطش قطع شد به اولش برگرده؟ mysql همچین قابلیته داری؟

Tarragon
سه شنبه 21 مرداد 1393, 22:38 عصر
up..........

2undercover
چهارشنبه 22 مرداد 1393, 09:30 صبح
سلام
برای یه بازی آنلاین باید یک سری کار همیشه در حال جریان باشه مثلا پروسه حمله به دهکده x رو کامل کنه و پردازش کنه.
از cronjobs نمی خوام استفاده کنم. راهی رو دیدم که طرف کاری می کرد که اگر task manager رو باز کنی در اون قسمت در حال انجام بود.

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

1. Cron Jobs که اطلاعات توی بازی هر چند وقت یکبار (مثلا هر 5 دقیقه یکبار) بروز بشه. که یعنی اتفاقات بازی لحظه به لحظه گزارش نمیشه.

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

3. این راه توی یک اسکریپت Travian هم استفاده شده بود و به نظر من هم بهترین راه ممکن هست. که یک فایل به نام Automation.php در موتور بازی وجود داشت و هر کاربری که توی بازی فعالیت انجام می ده اون فایل اجرا میشه و تمامی پردازش های مربوط به خود اون کاربر و کاربر های دیگه هم انجام میشه. اینطوری خوب اگه هیچ کاربری توی بازی نباشه اتفاقات توی بازی هم پردازش نمی شوند، که معمولا نیازی هم نیست. چون وقتی کسی توی بازی نیست، نه نیازی به پردازش هست نه نیازی به رتبه بندی نه چیز دیگه ای.

Tarragon
چهارشنبه 22 مرداد 1393, 12:54 عصر
سلام
بدی مشکل من با cron jobs اینه که ممکنه پردازش تموم نشده دوباره شروع شه و یا اینکه بینش فاصله بیوفته!

اینم که خودتون گفتید.

3- من دقیقا واسه همین می خوام! می خوام یک مشکل رو که داره حل کنم.

Unique
چهارشنبه 22 مرداد 1393, 17:02 عصر
می خوام بدونم می شه روی VPS اینکارو کرد؟
فقط روی vps میشه این کار را کرد.


سیستم مورد نیاز daemon چیه؟
روی همه توزیع های لینوکسی میشه ولی من روی ubuntu انجام دادم.


درمورد اینکه از اول شروع کنه متاسفانه همین خیلی مسئله بزرگیه.
به شرطی ریست میشه که یا برنامه شما exception بخوره و terminate بشه یا کلا سیستم عامل ریست بشه ! برق بره و از این حرفا در غیر این صورت تا ابد به کارش ادامه.

ببینید توی این حالا شما برنامتون اصلا کاری با web server نداره ! شما اسکریپت php را مینویسین و اجراش میکنین ، حالا تا زمانی که برنامه قطع نشه به کارش ادامه میده ! مثلا اینطوری اسکریپت php با process id معتبر اجرا میشه و تا زمانی که قطع نشه به کارش ادامه میده :


nohup php script.php &

برای نوشتن یک daemon هم اینطوری عمل کنین :

یک فایل توی etc/init/ میسازی به نام phpdaemon.conf و توی مینویسی :


description "My PHP Daemon"
author "Unique"

start on startup
stop on shutdown

respawn
respawn limit 20 5

script
[ $(exec /usr/bin/php -f /path/to/your/script.php) = 'ERROR' ] && ( stop; exit 1; )
end script

حالا به راحتی میتونی روشن و خاموشش کنی :

sudo service phpdaemon start
sudo service phpdaemon stop

یا حتی وضعیتشو ببینی :

sudo service phpdaemon status

ما باز هم میگم بی خیال php شو ! php برای این کار ها بهینه نیست و python و java و از همه بهتر node.js بهترین انتخاب هستند. همین کار را با اونها انجام بده. من به همین روش یک socket server نوشتم و توی پروژه ام استفاده کردم و به خوبی جواب میده.

راستی من این روش را توی stackoverflow یاد گرفتم این هم لینکش.
(https://stackoverflow.com/questions/2036654/run-php-script-as-daemon-process) (به این میگن رعایت حق کپی رایت)

اصلش هم مال وبلاگ یک برنامه نویس node.js هست ، اینم لینکش (http://kvz.io/blog/2009/12/15/run-nodejs-as-a-service-on-ubuntu-karmic/).