PDA

View Full Version : حرفه ای: باقی ماندن برنامه در پس زمینه !



binyaft
جمعه 10 تیر 1390, 19:08 عصر
سلام دوستان !

اگر بخوایم تو PHP یک فایل که توسط کاربر اجرا شده ، با بسته شدن مرورگر توقف پیدا نکنه باید چیکار کرد!؟
یعنی کاری به مرورگر و کاربر نداشته باشه و کار خودش رو تا پایان انجام بده .

اگر با اژاکس یک مقدار رو بفرستیم ایا با بسته شدن مرورگر عملیات هم متوقف میشه!؟


ممنون :بوس:

eshpilen
شنبه 11 تیر 1390, 10:54 صبح
خب تست کن دیگه.
میتونی از تابع sleep استفاده کنی.

blackmak
یک شنبه 12 تیر 1390, 02:07 صبح
خب تست کن دیگه.
میتونی از تابع sleep استفاده کنی.

چه ربطی داره ؟

binyaft
یک شنبه 12 تیر 1390, 13:04 عصر
واقعا" چه ربطی داره خب ؟! :لبخند:

یه راهی پیدا کردم با تابع exec شاید بشه ، البته به صورت عملی تست نکردم !

AMIBCT
یک شنبه 12 تیر 1390, 14:02 عصر
ignore_user_abort(true);

البته نكته‌هاي زيادي هست كه بايد بهشون توجه كنيد
راهنماي php رو باز كنيد و كل مطالب رو بخونيد

راهنماي آنلاين رو بخونيد بهتره چون توضيحات كاربران هم پايينش هست

eshpilen
یک شنبه 12 تیر 1390, 17:33 عصر
چه ربطی داره ؟

واقعا" چه ربطی داره خب ؟!یعنی واقعا شما تاحالا از اینطور ترفندها استفاده نکردید؟!
این برنامهء تست این موضوع:

<?php
touch('flag1');
sleep(5);
echo 'nothing!';
sleep(5);
touch('flag2');
?>
- برنامه رو اجرا کنید.
این موقع اگر به دایرکتوری برنامه نگاه کنید باید یک فایل بنام flag1 اونجا ایجاد و ظاهر بشه (درصورت لزوم نمایش محتویات دایرکتوری رو با استفاده از کلید F5 رفرش کنید).
- حالا عجله کنید و قبل از اینکه 5 ثانیهء sleep اول تموم بشه مرورگر رو ببندید.
- یه مقدار دیگه صبر کنید تا مطمئن بشید زمان لازم برای گذشتن از sleep دوم هم تموم شده (یعنی حداقل 10 ثانیه).
و بعد مشاهده میفرمایید که فایل flag2 هم در دایرکتوری برنامه ظاهر میشه. و این نشون میده که با بستن مرورگر برنامهء PHP ما خاتمه پیدا نکرده و همچنان درحال اجرا بوده و تا آخرین دستور خودش اجرا شده.

خب پس نتیجه چی شد؟
نتیجه اینه که همینطوریش هم برنامهء شما با بسته شدن مرورگر، در وسط راه متوقف نمیشه.
فکر میکنم تنظیم پیشفرض اینطور باشه. منطقیش هم همینه خب. قرار نیست مثلا با کلیک کردن کاربر روی دکمهء Stop مرورگر، برنامهء شما هم وسط راه Stop بشه و مثلا نصف دیتابیس آپدیت بشه و نصف دیگش که قرار بوده آپدیت و با بقیه هماهنگ بشه بلاتکلیف بحال خودش رها بشه!! توقف اجباری یک برنامه توسط عامل خارجی دروسط کارش معمولا تنها تحت شرایط Critical که اجرای بقیهء برنامه واضحا خطرناک یا غیرممکنه معقول هست. چون در بقیهء موارد بعکس متوقف شدن برنامه وسط کار هست که میتونه خطرناک تر باشه و سازگاری دیتا و چیزهای دیگری رو بهم بریزه.

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

eshpilen
یک شنبه 12 تیر 1390, 19:38 عصر
ignore_user_abort(true);

آره به گمانم این کد رو باید در برنامه بذاریم تا مطمئن باشیم و کار اصولی باشه.
ظاهرا بنده اشتباه گفتم که تنظیم پیشفرض اینطوری هست، چون در رفرنس چیز دیگری نوشته:
The default behaviour is however for your script to be aborted when the remote client disconnects.
منبع: http://www.php.net/manual/en/features.connection-handling.php