PDA

View Full Version : جلوگیری از کش شدن صحفه (کمک فرورررررررررری)



billgivz
یک شنبه 29 بهمن 1391, 18:35 عصر
سلام به همه دوستان .

من یک صحفه با فرمت php دارم که یک سری تراکنش رو انجام میده و واسه اتمامش حدوده 5 دقیقه زمان میبره

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

خلاصه سرتون رو درد نیارم این کش شدن واسه ما درده سر شده حتی بعضی مواقع اطلاعات رو به صورت آنی تو دیتابیس ثبت نمی کنه در زمان اجرا و 1000 تا مشکل واسم پیش اورده .


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

سرورم vps 2G ram هست .


دوستان اگه امکان داره منو راهنمایی کنید که این مشکل رو حل کنم .:گریه:

billgivz
یک شنبه 29 بهمن 1391, 20:37 عصر
کسییییییییییییییییییییییی ییییی نبود کمک کنه ؟

لااقل سر این موضوع "مثلا وقتی صحفه رو اجرا میکنم و در حال اجراست بعد ببندم همین جور واسه خودش درحال اجراست و تراکنش ها رو انجام میده بدون اینکه صحفه باز باشه !!! نمیخوام اینجور باشه "

eshpilen
یک شنبه 29 بهمن 1391, 21:20 عصر
فکر کنم صورت مسئله رو اشتباه یا بد گفتی.
میگی وقتی صفحه رو در سمت کلاینت میبندی، در سمت سرور هنوز کار میکنه؟

parsidev
یک شنبه 29 بهمن 1391, 21:36 عصر
سلام، بعد یه مدت گفتم بیام ببینم اینجا چه خبره ، خبر تازه چی دارن که به مشکل شما رسیدم!
چند تا راه حل وجود داره ، اما ساده ترین ، استفاده از دستور متا است. به این صورت:


<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="0">

MostafaEs3
یک شنبه 29 بهمن 1391, 21:45 عصر
کسییییییییییییییییییییییی ییییی نبود کمک کنه ؟

لااقل سر این موضوع "مثلا وقتی صحفه رو اجرا میکنم و در حال اجراست بعد ببندم همین جور واسه خودش درحال اجراست و تراکنش ها رو انجام میده بدون اینکه صحفه باز باشه !!! نمیخوام اینجور باشه "

توی سرور باید ignore_user_abort رو خاموش کنید ! یک تابع برای همین کار داره (اگر هم دسترسی به php.ini دارید از اون استفاده کنید که جاهای دیگه هم مشکل حل بشه)::


ignore_user_abort(false);

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

billgivz
یک شنبه 29 بهمن 1391, 23:00 عصر
فکر کنم صورت مسئله رو اشتباه یا بد گفتی.
میگی وقتی صفحه رو در سمت کلاینت میبندی، در سمت سرور هنوز کار میکنه؟

آره منظورم همینه

رضا قربانی
دوشنبه 30 بهمن 1391, 02:22 صبح
سلام، بعد یه مدت گفتم بیام ببینم اینجا چه خبره ، خبر تازه چی دارن که به مشکل شما رسیدم!
چند تا راه حل وجود داره ، اما ساده ترین ، استفاده از دستور متا است. به این صورت:


<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="expires" content="0">


داشی این واسه موتور جستجوگره . اشتباه می کنید . ربطی به نمایش کش شده یا نشده سایت نداره.

eshpilen
دوشنبه 30 بهمن 1391, 09:13 صبح
آره منظورم همینه
خب این ارتباطی به کش نداره.
PHP اون سمت میتونه بفهمه که کانکشن کلاینت قطع شده، ولی کارش رو بنا به تنظیم ignore_user_abort ادامه میده.
البته بسته به عملیاتی که در سمت سرور انجام میشه ممکنه غیرفعال کردن این تنظیم به تنهایی جواب نده (مطمئن نیستم ولی فکر کنم امکانش هست)؛ اونوقت باید توی حلقه ای چیزی مدام (یا با فواصل زمانی کوتاه) بوسیلهء توابعی مثل connection_aborted وضعیت کانکشن با کلاینت رو چک کنید. البته بنده قبلا با این روش سر و کله زدم، یه نکتهء مهم داشت اون موقع و اونم اینکه اگر خروجی ای به کلاینت ارسال نشه وضعیت کانکشن هم درست مشخص نمیشه، بنابراین قبل از استفاده از این تابع حتما یک خروجی ای رو هم به کلاینت ارسال کنید و از توابع ob_flush و flush هم به ترتیب استفاده کنید. شاید نیاز باشه این کار رو قبل از هر فراخوانی تابع connection_aborted انجام بدید.
البته بگم که حتی اگر از connection_aborted هم استفاده نکنید فکر کنم باید از این ترفند استفاده کنید.
به کد مثالی که بنده در این پست دادم دقت کنید: http://www.hamidreza-mz.tk/?p=674

<?php

ignore_user_abort(false);

$i=1;
while(true) {
echo 'x';
@ ob_flush(); flush();
touch($i);
sleep(2);
$i++;
}

?>