PDA

View Full Version : امکان سنجی لغو دستورات سروری



delphi77
یک شنبه 04 آبان 1393, 11:15 صبح
فرض که با آژاکس یه دستور به سرور ارسال شده این دستور یک اسکریپت ماسکول را اجرا می کنه

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

آیا می شود دستور قبلی را جهت کاهش ترافیک و حجم کاری سرور لغو کرد و از اجرای آن جلوگیری کرد؟

nazanin_asadi_1
یک شنبه 04 آبان 1393, 11:54 صبح
ببینید هر درخواستی که کاربر می ده

1 - از کامپیوتر خودش شروع میشه
2- به سرور میرسه و پردازش میشه
3- از سرور به کامپیوتر کاربر میرسه

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

مگر این که یه درخواست چند ساعت طول بگشه و اون موقع می تونی همچین کاری رو بکنی که اینم دردسرهای خودش رو داره

delphi77
یک شنبه 04 آبان 1393, 17:18 عصر
خب بله درسته یک دستور مدت زمان زیادی را صرف اجرا میکنه که حالا با سوالی که مطرح شد دو حالت داره
۱- اصلا اجازه ندیم کاربر کار جدیدی را تا قبل از دریافت پاسخ کار قبلی انجام بده
۲- اگر کار قبلی مدت زیادی را صرف انجام کرده با روشی اون کار را لغو کنیم

مورد اول در بعضی موارد قابل انجامه مثلا با باز کردن پنجره مدال خب رایجه و استفاده میشه ولی در اغلب موارد قابل انجام نیست
مورد دوم که اتفاقا مورد سوال من هست مشکله ولی در بعضی شرایط لازمه

us1234
یک شنبه 04 آبان 1393, 17:24 عصر
در فایل کانفیگ پی اچ پی پارامتری وجود دارد به نام :
max_execution_time
که میزان زمان اجرا بودن ریکویست را به ثانیه مشخص می کند .

این پارامتر را در پی اچ پی به شکل زیر محدود کنید :

@ini_set('max_execution_time',60);

در این صورت بعد از گذشت 60 ثانیه از زمان اجرا ریکویست اگر سرور نتونست به هر دلیل پاسخ ریکویست را بده ریکویست اتوماتیک کیل (Kill) میشه و دیگه اجرا نیست .

delphi77
سه شنبه 20 آبان 1393, 16:14 عصر
ریکویست پی اچ پی kill میشه ولی درخواستی که برای ماسکول رفته نه!

من اون درخواست را می خواهم لغو کنم

arta.nasiri
سه شنبه 20 آبان 1393, 16:31 عصر
سلام
بهتره واسه اینکار یه کلاس مدیریتی بنویسید. چون احتمالا نباید همیشه آخرین درخواست متوقف بشه، یعنی احتمال داره همزمان چندتا درخواست دیگه اجرا بشن و وقتی شما خواستید آخرین درخواست رو حذف کنید اونی نباشه که مد نظرتون بود. به هر حال میتونید با اجرای دستور show processlist لیست پردازشهای فعال رو دریافت کنید و با اجرای درستور "kill $processId" یا "kill query $processId" پردازش مورد نظرتون رو حذف کنید. http://dev.mysql.com/doc/refman/5.5/en/kill.html

delphi77
چهارشنبه 21 آبان 1393, 08:52 صبح
$result = mysql_query("SHOW FULL PROCESSLIST");
while ($row=mysql_fetch_array($result)) {
$process_id=$row["Id"];
if ($row["Time"] > 200 ) {
$sql="KILL $process_id";
mysql_query($sql);
}
}

us1234
پنج شنبه 22 آبان 1393, 22:21 عصر
مشابه php در mySql هم پارامتری برای تنظیم زمان اجرا بودن کوئری وجود دارد . البته دیگه مثل قبل به سادگی نمیشود بهش دسترسی داشت و باید یوزر root از mySql را داشته باشید .

http://dev.mysql.com/doc/refman/5.7/en/server-status-variables.html#statvar_Max_statement_time_exceeded