علی ام
5 سال پیش توسط علی ام مطرح شد
5 پاسخ

پردازش های زمان بر در php

سلام.
دارم برنامه ای مینویسم (pure php) که باید حدود ۱۰۰۰ صفحه وب(html) رو با

file_get_contents( );

بگیره و یک خط رو توشون پیدا کنه و برگردونه.
و حتی ممکنه چند کاربر همزمان درخواست بدن و مثلا اینجوری بشه که سه تا ۱۰۰۰ صفحه مختلف رو بخواد بخونه.
برای پیاده سازی همچین برنامه ای باید از صف بندی استفاده کنم؟ یا نیازی نیست؟ اگر همینجوری بدون صف بندی بنویسمش مشکلی پیش میاد؟
۱- چون گرفتن ۱۰۰۰ صفحه پردازش سنگینی هست، خواستم مشورت بگیرم ببینم چه راهکار هایی هست برای تقسیم بار توی زمان...(یعنی تدریجی انجام شدن دستورات)
۲- اگر بخوام به کاربر روند انجام کارها رو نشون بدم چجوری میتونم که بهش بگم که چند صفحه در پس زمینه چک شده و چقدر زمان باید صبر کنه...؟


ثبت پرسش جدید
مهدی مهدوی
تخصص : تازه وارد
@mehdi.mahdavi97 5 سال پیش مطرح شد
1

سلام
1-بخوام راهکار طبق سنارویی که گفتین بدم بهتون همون اصل کار که صف بندی هست رو باید رعایت کنید،بعدا مثلا 1000 صفحه رو به 50 گروه 20 تایی تقسیم کنید و در هردوره این تعداد رو پردازش کنید تا تموم بشه(فرض کردم این 1000 تا داخل دیتابیس سیو کردین و در شروع همگی status 0 دارن و در مرحله اول 20 تا statusشون به 1 تغییر میکنه تا وارد صف بشن و پس از اتمام هم مثلا status 2 میشه و 20 تا بعدی رو آماده صف می کنید و ... )
2- نمیدونم کاربر از چه طریقی این درخواست ها رو ثبت میکنه ولی در هر حالت شما باید هر x ثانیه چک کنید مثلا کاربر n تا صفحه داشته و خب الان y تاش تو z ثانیه تموم شده (از شروع عملیات تا این لحظه زمان رو اندازی گیری کنید)
میتونید یه درصدی بهش نمایش بدین و یه زمان تخمینی هم حساب کنید


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 5 سال پیش مطرح شد
0

اره دیگه باید از صف ها استفاده کنید و دونه دونه درخواست کاربران رو جواب بدین


مهدی مهدوی
تخصص : تازه وارد
@mehdi.mahdavi97 5 سال پیش مطرح شد
1

سلام
1-بخوام راهکار طبق سنارویی که گفتین بدم بهتون همون اصل کار که صف بندی هست رو باید رعایت کنید،بعدا مثلا 1000 صفحه رو به 50 گروه 20 تایی تقسیم کنید و در هردوره این تعداد رو پردازش کنید تا تموم بشه(فرض کردم این 1000 تا داخل دیتابیس سیو کردین و در شروع همگی status 0 دارن و در مرحله اول 20 تا statusشون به 1 تغییر میکنه تا وارد صف بشن و پس از اتمام هم مثلا status 2 میشه و 20 تا بعدی رو آماده صف می کنید و ... )
2- نمیدونم کاربر از چه طریقی این درخواست ها رو ثبت میکنه ولی در هر حالت شما باید هر x ثانیه چک کنید مثلا کاربر n تا صفحه داشته و خب الان y تاش تو z ثانیه تموم شده (از شروع عملیات تا این لحظه زمان رو اندازی گیری کنید)
میتونید یه درصدی بهش نمایش بدین و یه زمان تخمینی هم حساب کنید


علی ام
@aliam 5 سال پیش آپدیت شد
0

@m.mahdavi97
ممنون از راهنمایی خوبتون و اینکه وقت گذاشتید.
درسته این 1000 آدرس در دیتابیس ذخیره میشوند و باید تک تکشون با file_get_contents گرفته بشن و یک خط خوانده شود (فرضا تگ h1 صفحه) و بعد خروجی 1000 خط تگ h1 نمایش داده شود.
فقط ببخشید من هنوز درمورد صف ها یه ابهاماتی دارم:
1- صف بندی کردن یعنی کلا باید کار خاصی بکنیم یا همین کد خودش صف هست؟ 👇

// $database_row is our 1000 record
foreach($database_rows as $url){
    file_get_contents('$url');
    // then get h1 of page and store in to database;
    // and change status of it:
    // to 1 if succeed;
    // to 2 if failed;
}

2- اینکه به 50 گروه 20 تایی تقسیم کنیم منظور اینه که بین هر 20 تا که چک کردیم تابع ()sleep را صدا بزنیم؟ یا کار پیچیده تری باید انجام بگیره؟
3- اصلا اگر بین هر گروه فاصله نیندازیم -صف نسازیم و از یک ()foreach ساده استفاده کنیم. چه اتفاق هایی ممکن است رخ دهد؟
(پروژه در هاست اشتراکی قراره آپلود بشه)


مهدی مهدوی
تخصص : تازه وارد
@mehdi.mahdavi97 5 سال پیش مطرح شد
1

سلام
1-ببینید این چیزی که نوشتین اگه هر دفعه حداکثر 20 تا پشت حلقه باشن منطقیه
2- شما باید این فرآیند رو با کران جاب اجرا کنید ، و منظور از اینکه 50 گروه 20 تایی یعنی دفعه اول فقط رو 20 تا پردازش بشه و وقتی تموم شدن برن سراغ 20 تای بعدی ، یعنی تو هر دفعه ما 20 تا رو از دیتابیس انتخاب کردیم و وارد صف کردیم و از sleep و اینطور دستورات هم استفاده نمیکنیم
3-چون میگین یه کار زمان بر هست و هاست اشتراکی که قطعا محدودیت زیادی داره مشکلاتی نظیر کم اومدن منابع یا استفاده زیاد از منابع و درگیر شدن با هاستینگ :) یا time out و ...

البته استفاده از php خام هم به نظرم مشکلاتی داره واسه این کار


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 5 سال پیش آپدیت شد
1

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

شما از کرون جاب میتونین استفاده کنید و اخر شب مثلا کد foreach خودتون رو ران کنید و این کار به نظرم اصولی نیست و نمیتونین خطاها رو مدیریت کنید

اصولی هست شما اولا از یک فریمورکی مثه لاراول استفاده کنید و از کامند و کلاس queue برای مدیریت بهتر استفاده کنید


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام