PDA

View Full Version : سوال: ساخت برنامه غیر متقارن(asynchronous)



Mo_hasan1366
پنج شنبه 30 اردیبهشت 1389, 06:59 صبح
فرض کنید که بخوایم از یک سایت دیگه یک صفحه دانلود کنیم که حجم زیادی داره
چطور میشه به PHP گفت که تا صفحه دانلود بشه تو بقیه کارها انجام بده و وقتی که صفحه دانلود شد برو ادامه کار انجام بده که باعث اطلاف وقت نشه

pashaie
پنج شنبه 30 اردیبهشت 1389, 08:50 صبح
فکر نکنم با Php بشه همچین کاری کرد!
نهایتش اینه که می شه بهش گفت برو فایل رو دانلود کن و در ادامه برو بقیه کارها رو انجام بده، حالا وقتی که دانلود تموم شه چی کار کنه رو فک نکنم بشه بهش حالی کرد.

در ضمن برای انجام این کارا باید هاستت شل رو نبسته باشه


این تکه کد رو از نت کش رفتم


/**
* Asynchronously execute/include a PHP file. Does not record the output of the file anywhere.
*
* @param string $filename file to execute, relative to calling script
* @param string $options (optional) arguments to pass to file via the command line
*/
function asyncInclude($filename, $options = '') {
exec("/path/to/php -f {$filename} {$options} >> /dev/null &");
}

اینم یه تیکه دیگه:


exec('bash -c "wget -O (url goes here) > /dev/null 2>&1 &"')
و اینم لینک مرجعی که ازش کش ورفتم! (http://stackoverflow.com/questions/124462/asynchronous-php-calls)

Mo_hasan1366
پنج شنبه 30 اردیبهشت 1389, 18:38 عصر
شرمنده ببخشید اینقد سوال می کنم

اگر بخوای همین کار انجام بدی با این تفاوت که کار زمان برمون انجام پرسوجو از پایگاه داده باشه اون موقع باید چه کار کرد

pashaie
پنج شنبه 30 اردیبهشت 1389, 21:02 عصر
شرمنده ببخشید اینقد سوال می کنم

اگر بخوای همین کار انجام بدی با این تفاوت که کار زمان برمون انجام پرسوجو از پایگاه داده باشه اون موقع باید چه کار کرد

یه سوالی، این کارهای زمان بر قراره هر وقت یه درخواست می یاد انجام بشه یا قراره مثلا صرف نظر از اینکه کاربری درخواست داده یا نه به طور مرتب اجرا بشه؟
اگه مورد دوم هستش که بهت پبش نهاد می کنم حتما با cron job آشنا بشی، چون این یکی از ویژگی های پایه اکثر هاستاست و کاری که انجام می ده اینه که تو بازه های زمانی که براش تعریف کردی (هر ساعت، هر روز، هر هفته و یا ...) اسکیریپتی رو که براش تایین کردی رو مرتب اجرا می کنه.

اگه مورد اوله که تنها کاری که روشی که الان می تونم پیشنهاد بدم استفاده از تابعیه که بالا هم معرفی کردم


function asyncInclude($filename, $options = '') {
exec("/path/to/php -f {$filename} {$options} >> /dev/null &");
}

که این روش هم چون تو اکثر هاست ها به دلایل امنیتی تابع exec رو بستن جواب نمی ده

eshpilen
پنج شنبه 30 اردیبهشت 1389, 23:20 عصر
PHP فعلا قابلیت Thread رو نداره، ولی در آینده و نسخه های دیگری میخوان بهش اضافه کنن (فکر کنم).
ولی بطور مثال Perl این قابلیت رو داره.
از طرف دیگه بنظر من به احتمال زیاد کتابخانه های مکمل برای اینطور کاربردها نوشته باشن که شاید پیدا کنی. یعنی مثل همین ترفندهایی که دوستامون گفتن، ولی کاملتر و اصولی تر.
برای کاربردهای ساده و محدود همین روشها جواب میدن اکثرا و میشه بیشتر کارایی ها رو ازشون گرفت (حتی بعد از اینکه کار بکگراند تموم شد چطور چیکار بشه - فقط نمیتونی چیزی به مرورگر کاربر بفرستی ها).
منتها همش نیاز به تسلط نه فقط به یک زبان، بلکه مفاهیم و احتمالا زبانهای دیگری داره. خلاصه کار حرفه ای هست.
من میگم مثلا اون بخش خاص رو شاید اصلا باید از زبانهای دیگه مثل C و بصورت CGI استفاده کنیم.
خلاصه اگر حرفه ای نیستی زیاد خودت رو اذیت نکن که دردسر داره. چون ظریف کاریه. باید دقیقا منطقی رو که میخوای و موارد مربوط به برنامه نویسی چندنخی اونم بصورت غیراصولی و شبیه سازی شده رو درک و پیاده کنی.