PDA

View Full Version : سوال: ارسال به خروجی همزمان با اجرای فایل php



Bahram0110
جمعه 07 اسفند 1388, 15:19 عصر
با سلام

چطور می تونم همزمان با تفسیر یک فایل php خروجی اون رو به مرورگر بفرستم مثلا وقتی دارم query های سنگین رو اجرا می کنم و نیاز به زمان زیادی داره خروجی به مرورگر ارسال بشه.

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

for ($i = 1; $i <= 9999999999; $i++) {
$q = "INSERT INTO `table_name` ('f1', 'f2', 'f3') VALUES ('$i', '$2', '$3')";
mysql_query($q);
echo "$i inserted<br>";
}

امیـرحسین
جمعه 07 اسفند 1388, 21:44 عصر
یه قابلیت در php هست به نام tick که میاد هر یک دوره یکبار کدهایی رو اجرا می کنه. این آدرس رو ببینید: declare (http://ir.php.net/manual/en/control-structures.declare.phpC#‎ontrol-structures.declare.ticks)
که البته توی لوکال من کار نکرد.
روشی که من به ذهنم میرسه اینه که هر یک دوره یکبار خروجی رو بفرستید از اسکریپت خارج بشید و مجددا به اسکریپت برگردید. مثلا شبیه این:
$position = isset($_GET['position']) ? $_GET['position'] : 1;
for ($i = $position; $i <= 9999999999; $i++) {
if($i % 500 == 0) {
echo ($i / 500) . " Loops done!<br />i = " . $i;
echo '<META HTTP-EQUIV="Refresh" CONTENT="3; URL=test.php?position=' .($i+1). '">';
break;
} else {
$q = "INSERT INTO `table_name` ('f1', 'f2', 'f3') VALUES ('$i', '$2', '$3')";
}
}
این اسکریپت هر 500 دور یکبار خروجی میده و بعد از سه ثانیه مکث مجددا به خودش برمیگرده. با GET هم میشه ادامه حلقه رو انجام داد. تست کنید خروجیش رو ببینید.
به این میگن Inspiration! فقط برای ایده گرفتنه نه استفاده.

funpatogh
جمعه 07 اسفند 1388, 23:41 عصر
جالب بود امیر حسین جان ایده باحالی بود

Bahram0110
جمعه 07 اسفند 1388, 23:55 عصر
ايده ي جالبيه ولي زياد كاربرد نداره، متاسفانه بدرد من هم نميخوره.
ميريم سراغ tick ببينيم چي ميشه

دوستان اگر راه حل ديگه اي داريد بگيد

guy18iran
شنبه 08 اسفند 1388, 01:11 صبح
راه آقا امیرحسین جالب بود و برام تازگی داشت.
منم راه خودمو میگم. البته نمی دونم که Timeout میده یا نه. (چون با حلقه کمتری انجام دادم و به مشکل هم برنخوردم.)
وضعیت CPU هم در این حالت تقریبا خوب بود! :لبخندساده:
یه تابع توی PHP هست با نام sleep که مقدار ورودیش به صورت عدد صحیح هست و مقدار زمان توقف رو میگه. یعنی اینکه مثلا با ریختن هر 50 رکورد 5 ثانیه توقف کنه و بعد ادامه رو انجام بده. به صورت زیر:


for ($i = 1; $i <= 9999999999; $i++) {
if ($i % 50 == 0) {
sleep(5);
} else {
$q = "INSERT INTO `table_name` ('f1', 'f2', 'f3') VALUES ('$i', '$2', '$3')";
mysql_query($q);
echo "$i inserted<br>";
}
}


البته من همچین حلقه ای (9999999999) نداشتما. :متعجب: :لبخند:

امید امرایی
شنبه 08 اسفند 1388, 10:56 صبح
هرچند اجرای این فرایند تا حد زیادی به سرویس دهنده وابسته است اما Ticks بهترین راه حل ها رو در این زمینه ارائه میده.
نمونه های خوبی در این صفحه قرار داده شده که به حتم مشکل شما رو حل می کنند.
http://www.phpdig.net/ref/rn62.html