PDA

View Full Version : سوال: مشکل اجرای برنامه های طولانی مدت در php



Arsess
یک شنبه 11 مهر 1389, 19:22 عصر
من یک اسکریپت PHP دارم که اجرای اون در cronjob نیاز به 7.5 ساعت زمان داره. با اینکه از دو خط زیر استفاده کردم، اجرای اسکریپت فقط تا 5 دقیقه ادامه پیدا میکنه و بعد دانلود اسکریپت پرسیده میشه!!! :متفکر: چرا دانلود؟؟؟ بعد از دانلود هم فقط یه صفحه سفید دیده میشه.


ini_set('max_execution_time', 0); o

set_time_limit(0); o


هرچقدر هم جستجو میکنم فقط به دو دستور بالا میرسم.

behrouz_psh
یک شنبه 11 مهر 1389, 19:48 عصر
چه جالب همين الان که من امدم اينجا اين سؤال رو بپرسم يکی ديگه پرسيده
آقا اگه کسی ميتونه کمک کنه يه برنامه دارم ميخوام يه شب تا صبح کار کنه
چی کار کنم؟ ميدونم با تغيير max execution time to php.ini ميشه ولی تغيير ميدم هيچ اتفاقی نمی افته

funpatogh
یک شنبه 11 مهر 1389, 20:18 عصر
این 7 ساعت و نیم صرف چه کاری میشه؟

snail22
یک شنبه 11 مهر 1389, 20:18 عصر
هر دو دستور بالا در هاست های مشترک به دلایل امنیتی غیر قابل استفاده هستند

Arsess
یک شنبه 11 مهر 1389, 20:35 عصر
یه وب سرویس هست که اطلاعات دارویی میده. یکی از دستوراش کد تمام دارو ها رو ارائه میده و دستور دوم با دادن یک کد، مشخصات دارو رو میده. من میخوام اطلاعات دازویی رو توی DB خودم بریزم تا سایت من برای این اطلاعات محتاج وب سرویس نباشه و سرعتش بالاتر بره. این وب سرویس 125822 دارو داره ولی بعد از 5 دقیقه و دریافت حدود 1400 دارو کار متوقف میشه. حتی برای امتحان من دستور Insert رو برداشتم و خواستم ببینم اسکریپت کارشو تموم میکنه و پیغام OK رو به Browser میفرسته که دیدم نه!

ضمناً من هاست ندارم بلکه از یک Managed Server استفاده میکنم.

funpatogh
یک شنبه 11 مهر 1389, 21:01 عصر
خوب شما توی یک تیبل جدا یک فیلد بزار به اسم start که مقدر پیش فرضش هم 0 باشه
بعد با کرون فایل اصلیت رو هر 5 دقیقه یک بار اجرا کن منتها فقط 1000 تا 1000 تا رکورد بزن
بعد آخر برنامت هم این شماره رکورد آخرین رکورد رو با مقدار start جم کن و ذخیره کن و برنامه متوقف میشه
دوباره که با کرون اجرا میشه از start شروع رکورد رو بخون و 1000 تا رکرورد بعدی رو بخون و ...

behrouz_psh
یک شنبه 11 مهر 1389, 21:06 عصر
آقا اگه تو لوکال هاست باشيم چی؟
با اون 2 دستور جواب نگيريم چی کار کنيم؟

snail22
یک شنبه 11 مهر 1389, 21:10 عصر
اگه مستقیم به فایا php.ini دسترسی داری او اونجا تنظیم کن

ولی چه اصراری هست که همه‌ی proccess رو یکجا انجام بدی؟ می‌تونی تقسیم کنی و هر 5 دقیقه یک قسمت رو بریزی تو database

فکر می‌کنم که با background proccessing هم بشه ولی شاید اونهم با مشکل مشابهی روبرو بشه

Arsess
یک شنبه 11 مهر 1389, 21:51 عصر
مسلماً اگه مجبور شم همین کارو میکنم ولی راستشو بخوای دنبال یه راه حل بهتری هستم. میخوام ترجیحاً مشکل رو پیدا و برطرف کنم.

funpatogh
دوشنبه 12 مهر 1389, 13:19 عصر
فکر نکنم راهی باشه آخه تمام فضای رم و cpu اینجوری صرف کار شما اشغال میشه

xoogle.ir
دوشنبه 12 مهر 1389, 13:40 عصر
معمولا هر پروسسی توی هاست ها و سرور ها یه حداکثر زمانی داره. فکر نمیکنم بتونید این قانون رو دور بزنید اگر دور برنید هم احتمالا با خطر suspend مواجه میشید.

پس بهتره عملیاتتون رو تکه تکه کنید و کم کم اجراش کنید.

Arsess
سه شنبه 13 مهر 1389, 10:27 صبح
من با وبسرویس تماس گرفتم و اونها راه دیگه ای رو پیشنهاد کردن که همه چیز رو تغییر داد.
اونها دستوری رو ارائه دادند که باهاش میشه تمام داروهایی رو که مثلاً با A شروع میشه بصورت یکجا در یک متغیر XML ذخیره کرد. به اینشکل:


$XmlVar=simplexml_load_file(rawurlencode("http://webservices. ... /GetMedicinesByName?user=...&pass=...&search=a

و یک XML خیلی بزرگ با حدود 27000 دارو در متغیر XmlVar$ ذخیره میشه و اینکار حدود 27 ثانیه زمان میبره. خوب این کار رو خیلی راحت کرد چون من میتونم این دستور رو برای 26 حرف الفبای لاتین و اعداد 0 تا 9 انجام بدم و با 36 بار اجرای دستور، همه داروها رو بگیرم که اینکار قاعدتاً برای 400000 دارو، حدود 400 ثانیه زمان میخواد. خوب میشه بخاطر محدودیت 5 دقیقه ای، در دو مرحله اجراش کرد.

مشکل جدید اینه که من چطور میتونم در سریعترین زمان ممکن این متغیر رو در MySQL Table بنویسم. تمام دستوراتی که جستجو کردم، درج یک XML File در Table بود نه XML Var در Table و من نمیخوام یه بار این متغیر بزرگ رو توی سرور توی یه فایل بنویسم (که مسلماً بسیار زمانبر هست) بعد ببرمش توی MySQL و در آخر هم پاکش کنم. فکر میکنم دستوری باشه که بشه توی یک خط، همه XmlVar$ رو یکجا Insert کرد.

Arsess
پنج شنبه 15 مهر 1389, 09:49 صبح
درود به همگی،

من جواب سوالمو پیداکردم :)

از همتون بخاطر همفکری صمیمانه متشکرم