PDA

View Full Version : حرفه ای: نمایش نتایج در حین اجرای چرخه



prans.info
دوشنبه 17 آذر 1393, 19:12 عصر
سلام وقت بخیر
چه کاری میشه کار که پی اچ پی در حین پردازش یک چرخه بسیار طولانی با عملیات زیاد اطلاعات رو نمایش بده و اطلاعات رو فقط در زمان اتمام پردازش نمایش نده ؟
یک چرخه داریم برای چک کردن دامین های آزاد و زمان اجراش طولانیه چون باید با CURL بره هویز بگیره و ما میخوایم در حین انجام عملیات اطلاعات رو نمایش بده (این دامنه آزاد است ...) و یهویی زمانی که پردازش تموم شد نشون نده ...
البته فکر نکنم بشه براش کاری کرد :لبخند:

ashkufaraz
دوشنبه 17 آذر 1393, 20:18 عصر
باید از ob_clean, flush, str_pad استفاده کنی و یه delay بدی که اطلاعات تا اون مرحله در خروجی نمایش داده بشه
من یه نمونه کد نوشتم اگه پیداش کردم برات میزارم

arta.nasiri
دوشنبه 17 آذر 1393, 20:26 عصر
سلام

قبلا تو یکی از پروژه هام از این روش استفاده کردم که stable نیست یعنی امکان داره تو یک مرورگر درست کار کنه تو یکی دیگه کار نکنه. دلیل استفاده از حلقه تو کد زیر بدلیل اینه که بعضی از مرورگرها پس از دریافت تعدادی کاراکتر اقدام به نمایش خروجی میکنن البته تو این روش.


ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', FALSE);
ini_set('implicit_flush', TRUE);
ob_implicit_flush(TRUE);
header('Cache-Control: no-cache');
for ($i = 0; $i <= 1024; $i++)
{
echo ' ';
}
@ob_flush();
flush();
کد بالا رو قبل از همه اجرا کن بعدش اونجایی که نیاز داری خروجی رو ببینی از کد زیر استفاده کن. بجای مقدار echo خروجی مورد نظر خودتون رو قرار بدید.


echo "process result";
@ob_flush();
flush();


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

ashkufaraz
دوشنبه 17 آذر 1393, 20:28 عصر
if (ob_get_level() == 0)
ob_start();

echo "<br>Start...<br/>";
echo str_pad('', 4096);
ob_flush();
flush();
$i=1;
foreach($ArsehBaiganyRows as $ArsehBaiganyRow)
{

$query="update ArsehBaigany
set Daste='183837732828',Noe='33992928487839002'
where
Code='".$ArsehBaiganyRow["code"]."' ";

$update=$dbHandle->query($query);
if(empty($update))
{
echo "<span style='color:red'>error".$i++."</span><br>".$query;
echo str_pad('', 4096);
ob_flush();
flush();
}
else
{
echo "ok";
echo str_pad('', 4096);
ob_flush();
flush();
}


echo "<br/>next file<br/>";
echo str_pad('', 4096);
ob_flush();
flush();

sleep(1);
}

echo "<br>finish<br/>";
ob_end_flush();

prans.info
دوشنبه 17 آذر 1393, 20:32 عصر
باید از ob_clean, flush, str_pad استفاده کنی و یه delay بدی که اطلاعات تا اون مرحله در خروجی نمایش داده بشه
من یه نمونه کد نوشتم اگه پیداش کردم برات میزارم

سپاس از شرکتتون در تاپیک
لطف می کنید یک مثال کوچیک بزنید ؟

prans.info
دوشنبه 17 آذر 1393, 20:41 عصر
سلام

قبلا تو یکی از پروژه هام از این روش استفاده کردم که stable نیست یعنی امکان داره تو یک مرورگر درست کار کنه تو یکی دیگه کار نکنه. دلیل استفاده از حلقه تو کد زیر بدلیل اینه که بعضی از مرورگرها پس از دریافت تعدادی کاراکتر اقدام به نمایش خروجی میکنن البته تو این روش.


ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', FALSE);
ini_set('implicit_flush', TRUE);
ob_implicit_flush(TRUE);
header('Cache-Control: no-cache');
for ($i = 0; $i <= 1024; $i++)
{
echo ' ';
}
@ob_flush();
flush();
کد بالا رو قبل از همه اجرا کن بعدش اونجایی که نیاز داری خروجی رو ببینی از کد زیر استفاده کن. بجای مقدار echo خروجی مورد نظر خودتون رو قرار بدید.


echo "process result";
@ob_flush();
flush();


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

سپاس از شرکتون در تاپیک .
راهی که شما و ashkufaraz بهش اشاره کردید جواب نمیده

ashkufaraz
دوشنبه 17 آذر 1393, 21:10 عصر
حاجی من این کد رو
if (ob_get_level() == 0)
ob_start();
echo "Start...";
ob_flush();
flush();
$i=0;
while($i<10)
{
$i++;
echo "$i";
ob_flush();
flush();
sleep(1);
}
echo "finish";


رو توی سایت http://www.tutorialspoint.com/execute_php_online.php
اجرا کردم مثل هلو جواب میده