PDA

View Full Version : انجام پردازش طولانی مدت بدون تایم اوت



abdollahpor
سه شنبه 07 دی 1395, 22:43 عصر
وقت بخیر

ببخشید سوالی داشتم در رابطه با انجام پردازش های طولانی مدت

میخام یه پردازش طولانی مدت رو انجام بدم به صورت عادی نمیشه انجامش بدم چون هرچی باشه روی هر سروری بزاری تایم اوت میده ولی خب دیدم توی برخی سایت ها این پردازش هارو انجام میدن بدون رفرش مثلا مثل اپلود که نوار وضعیت داره و شاید 5 یا 10 ساعتم طول بکشه . منم دقیقا همینو میخام که بیاد به صورت مداوم این پردازش رو انجام بده که توی این پردازش باید ارتباطش با دیتابیس برقرار باشه و اطلاعات رو درج ، حذف و ... کنه و حتی فایل ذخیره و دریافت کنه . اینو میشه بگین چجوری انجام بدم ممنون میشم

با تشکر

[younes]
چهارشنبه 08 دی 1395, 00:37 صبح
مستندات php رو بررسی کنید.
لینک (http://php.net/manual/en/function.set-time-limit.php)
البته فکر میکنم تنظیمات وب سرور ، تنظیمات php رو override مکنه.......

beliefsavior
چهارشنبه 08 دی 1395, 00:41 صبح
فراموش نکن که اگه safe_mode اگه روشن باشه نمی تونی این کارو انجام بدی ...

abdollahpor
چهارشنبه 08 دی 1395, 01:23 صبح
درود نه ممنون میدونم سرور دست خومه جوری که لازم باشه تغییرش میدم . فقط اینو دارم میخونم یه سوال داشتم قبل از اینکه تمومش کنم ببین مثلا یه نمونه تو پردازشایه طولانی :

توی وردپرس افزونه Thumbnails Generation رو اگه دیده باشین کارش اینه که میاد از تو متن پست هایی که دای عکس هارو میگیره تبدیل به تصویر شاخص میکنه مثلا توی سایت خودم من 2000 تا پست بود اینو زدم که تصویر شاخص براشون بسازه .. خیلی راحت صفحه پردازشی نداشت ولی یه باکس میاره به صورت ایجکس اضاف میکنه درصد میزنه مثلا میگه پست 1400 عکسش اوکی شد بعد میره پست بعدی گذارششو همینجوری میگه و فقط همون قسمت صفحه کار میکنه و اگه 20 ساعتم طول بکشه همونجوری هست تایم اوتی و .. نداره اینی که مشا دادید مثل همونه ؟

plague
چهارشنبه 08 دی 1395, 04:27 صبح
اگه با ایجکس به ازای هر عکس یه رکوئست بزنه که معلومه تایم اوت نمیده مشکل زمان اجرای هر تک رکوئسته
میتونی max_execution_time رو از تو php.ini افزایش بدی که بسته به قدرت سرورت میتونه جواب بده
اگه نه باید خلاقیت به خرج بدی عملیات رو بین چندین تا رکوئست تقسیم کنی با ایجکس یا با کرون جاب

Unique
چهارشنبه 08 دی 1395, 09:01 صبح
همونطور که plague گفت با ajax شما با یک Request در ارتباطی که مثلا ۱۰۰ بار صدا زده میشه و کار انجام میشه و شما timeout هم نمیگیری مشکل این نوع انجام پردازش اینه چون از طرق Client و مرورگر داره مدیریت میشه به محض اینکه ارتباط با سرور قطع بشه پردازش شما هم متوقف میشه.

اگه قرار باشه کل پردازش و مدیریت پردازش سمت سرور با php باشه فقط به شرطی که منطقی باشه میشه با set_time_limit و max_executation_time کنترلش کرد اما اگه قرار بر این باشه پروسه چند ساعت و بیشتر طول بکشه به نظرم php برای این کار ساخته نشده مگه اینکه یک اسکریپت سمت سرور داشته باشی که صفحه وب شما به صورت daemon اجراش کنه و پروسه را انجام بده و بتونی وضعیت کار را هم باهاش بگیری.

اما php برای اسکریپت های اینطوری هم جالب نیست و بهتره با python کار بشه. البته برای ارتباطات async هم بهترین انتخاب nodejs هست. حالا ببین چیکار میتونی بکنی.

abdollahpor
چهارشنبه 08 دی 1395, 09:17 صبح
از همتون ممنونم

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

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

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

باتشکر

plague
چهارشنبه 08 دی 1395, 17:31 عصر
میدونی که اگه خزنده رو بخای با کرون جاب اجرا یا هر روشی غیر از وب اجرا کنی کدای جاوا اسکریپت اجرا نخواهند شد و در نتیجه نمیتونی ایجکس استفاده کنی

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

abdollahpor
چهارشنبه 08 دی 1395, 18:39 عصر
ممنون بابت روشن گذاشتن اره ولی خب راهشو دارم .گفتم من یه پردازشی میخام انجام بدم که فکر کن یه حلقه ده میلیاردی که تو هر حلقه باید بره تو سایت و کل سورس سایت رو بگیره و پردازشی که میخام رو روش پیاده کنه تو دیتابیس ذخیره کنه و بره پردازش بعدی یه همچین چیزی . که خب تو این رده من هر دفه اخرین پردازش رو با یه ایدی که هرکدوم دارن تو دیتا بیس ذخیره میکنم که اگه سیستممو خاموش کنم یا هرچیزی و بعد بیام دوباره استارت رو بزنم از همون ایدی ادامه بده نه از اول و اونم تحت مرورگر انجامش میدم الان این تصویر رو ببینید پروکسس داره و داره درصدی میره بالا و وقتی من انجامش میدم شاید 2 ساعت طول بکشه و گذارش رو هم تو تکس باکس میاره و تایم اوتی هم نداره جچون با ایجکس اجرا میشه من مشابه همینو میخام

http://barnamenevis.org/attachment.php?attachmentid=143940&stc=1


مثل این میخام باشه دیگه کد مشابه ندارین

ممنون

sedamorde
چهارشنبه 08 دی 1395, 18:56 عصر
سلام،

دوست عزیز شما باید در هر درخواست Ajax يک پست را بررسی کنی و ID پست‌های ویرایش شده را در پایگاه داده ذخیره کنی.
مثلا تعداد پست‌ها 100 تا است و تا حالا 50 تا پردازش شده . یعنی 50% و همینطور ادامه داره تا برسیم به 100. اگر هم مرورگر بسته شده بعدا میشه باز ادامه داد.

اما اگر قراره هر پردازش خیلی طول بکشه یا بیشتر از چند ساعت بشه این راه درستی به نظر نمیاد.
همانطوز که دوستمون Unique گفت بابد از Daemon (یک پردازش که میتونه تا ابد ادامه داشته باشه) استفاده کنی و PHP برای این کار نیست.
در این صورت Perl یا Python یا ++C یا حتی Shell Script به شما کمک میکنه. (پیشنهاد من Perl چون شبیه یه PHP)

به هر حال دستور زیر در PHP هم به معنی زمان اجرای بی‌نهایتِ. البته همانطور که دوستان گفتن به شرایط بستگی داره :






set_time_limit(0);


OR


ini_set('max_execution_time', 0);




فراموش نکنید که PHP ممکن فشار زیادی روی CPU بگذاره.

موفق باشید

abdollahpor
چهارشنبه 08 دی 1395, 19:35 عصر
ممنون از نظرتون .. منو مجاب کردین که سراق پرل هم برم اونم اگه نمونه کدی شمابه دارین ازش چون گفتین شبیه php هست من اصلا پرل کار نکردم راسیتش برا همون به دوستمون گفتم که وقتم نمیکشه بخام برم یاد بگیرم بعد بیام ایم کارو بکنم ولی حالا که میگین شبیه میرم یه نگاهی میندازم .

برم رو این توابعی که گفتین کار کنم ببینم چی میشه خیلی لطف کردین همتون ممنونم ازتون ایشاله بتونیم جبران کنیم

با تشکر اگه باز ایده جدیدی به ذهنتون رسید ممنون میشم بگین ممنون

sedamorde
چهارشنبه 08 دی 1395, 19:50 عصر
ممنون از نظرتون .. منو مجاب کردین که سراق پرل هم برم اونم اگه نمونه کدی شمابه دارین ازش چون گفتین شبیه php هست من اصلا پرل کار نکردم راسیتش برا همون به دوستمون گفتم که وقتم نمیکشه بخام برم یاد بگیرم بعد بیام ایم کارو بکنم ولی حالا که میگین شبیه میرم یه نگاهی میندازم .

برم رو این توابعی که گفتین کار کنم ببینم چی میشه خیلی لطف کردین همتون ممنونم ازتون ایشاله بتونیم جبران کنیم

با تشکر اگه باز ایده جدیدی به ذهنتون رسید ممنون میشم بگین ممنون

خواهش می‌کنم.
شما اگر بفرماید که توی هر پردازش چه کاری می‌خواهید انجام بدید احتمالا من و دوستان دیگر شما را بیشتر راهنمایی می‌کنیم.
من اطلاعی ندارم اما فکر میکنم پلاگین وردپرس با همون روش ajax‌ یا شبیه به اون کار میکنه.
اگر چیزی مثل Search Engine لازم دازید خوب همان زبان‌های دیگر بهتره. بخصوص Perl‌ یک زبان بسیار خوب برای پردازش زبان طبیعی است (زبان ما انسان‌ها).
و با اینکه Perl و PHP شباهت‌های زیادی با هم دارن ولی به هر حال دو زبان جدا هستند و هر کدام به تجربه نیاز دارن. بخصوص Daemon‌ میتونه خیلی پیچیده باشه.
باز هم به کاری که می‌خواهید انجام بدبد بیشتر فکر کنید.

در نهایت برای Perl در سایت Cpan کدهای فوق‌العاده‌ای پیدا میکنید.

abdollahpor
چهارشنبه 08 دی 1395, 23:29 عصر
درود ممنونم

والا چی بگم کاری که میخام بکنه اینه یه پرتال دارم جرئیات به صورت جدول تیبل هست که خروجی داره میده و خروجی هاشم باز داخل اینپوت هست تو یه پستی تو همین سایت من زدم جستجو یکی از دوستان کمک کردن و کدشو نوشتم .. الا کاری که میکنم ایدی پستم رو با حلقه میفرستم و پست رو سورسشو میگیرم بعد که گرفتم جدول رو سرچ میزنم جزئیاتشو میگیرم و تو دیتابیس ذخیره میکنم همین کارو فقط میخام انجام بده فقط مشکل اینه که پست ایدی ها زیاده یه چیزی شما فکر کنید تو مایه هایه یک میلیارد حالا ما بین اینا هستن که ایدی رو من بزنم و پستی نباشه که نیازی به دریافت سورس و جستجو . ذخیره داخل دیتابیس نداره .. این کاریه که میخام انجام بدم جوری که نوشتم خیلی زمان میبره و سرور تایم اوت میده پردازشش سنگینه گذاشتم رو 100 تا 100 تا که کرون بزنه ولی بازم سنگین بود و توش اطلاعاتو بعضی وقتی ناقص میکرد و حتی باعث میشد سرور داون بشه .
امید وارم خوب منظورمو رسونده باشم

حالا نطری پیشنهادی

ممنون

Unique
چهارشنبه 08 دی 1395, 23:31 عصر
با php هم میشه daemon درست کرد و run کرد توی لیوکس. اما php برای این کار نیست به نظر من گرچه نمونه های زیادی روی وب برای این کار هست مثل این (http://kvz.io/blog/2009/01/09/create-daemons-in-php/).

[younes]
پنج شنبه 09 دی 1395, 00:54 صبح
دقیقا نمیدونم در php حافظه و پروسه ها چطور مدیریت میشوند باید مستندات رو بررسی کنید ولی :
میتونید در سمت سرور از روش بازگشتی استفاده کنید ، به این صورت که اگر لازم است چند میلیارد مورد پردازش شوند به ازای هر پردازش یک در خواست http به خود اسکریپت بدهید و در پایان وضعیت را در دیتابیس ذخیره کنید و یک درخواست دیگر به همان اسکریپت بدهید و یک و واحد به جلو حرکت کنید تا task ها تمام شوند. (حتما راه هایی وجود داره که بتونید از چند ده worker برای این کار استفاده کنید و سرعت کار با همزمانی بیشتر میشود)

abdollahpor
پنج شنبه 09 دی 1395, 17:09 عصر
خودمم دنبال همین روشم چند روش رو تست کردم و جوری که پردازش ها زمان میبردن فکر کنم اگه ادامه میدادم پردازشا 6 ماه طول میکشید تا تموم بشن .


نمیدونم php پردازش چند سطری داره مثل nodejs یا نه چون اگه میداشت میتونستم در یک زمان چند پردازش رو انجام بدم یا حد اقل جدا سازی رو انجام بدم هر کار رو محول کنم یه یه چیز که پشت سر هم انجام بشه ..

مثلا یکی ایدی رو بگیره بفرسته بعدی خودش بره سراق ایدی بعدی و لول بعد ایدی رو بگیره از لول یک و بره برا دریافت سورس صفحه بعد سورس رو بده لول 3 همینجوری ادامه پیدا کنه اینجوری سرعت کار خیلی میره بالا ولی نمیدونم چجوری میشه و اصلا php همچین قابلیتی داره یا نه

بازم ممنون بابت نظرات خوبتون

[younes]
جمعه 10 دی 1395, 18:08 عصر

نمیدونم php پردازش چند سطری داره مثل nodejs یا نه چون اگه میداشت میتونستم در یک زمان چند پردازش رو انجام بدم یا حد اقل جدا سازی رو انجام بدم هر کار رو محول کنم یه یه چیز که پشت سر هم انجام بشه ..

http://php.net/manual/en/intro.pthreads.php (http://php.net/manual/en/intro.pthreads.php)

https://coderwall.com/p/jtex1a/multi-threading-in-php

abdollahpor
شنبه 11 دی 1395, 12:56 عصر
ممنونم اینو دارم کار میکنم ببینم به چیزی میرسم ولی هنوز به اون پردازش سنگینه نرسیدم والا با php البته با زبانایه دیگه هنوز شروع نکردم زدم دانلود بشه پرل ببینم چجوری میتونم با اون کار کنم تشکر