11

ob_start()/を使用ob_flush()して、うまくいけば、長いインポート操作中に進捗状況が得られます。

これが私がやっていることの簡単な概要です:

<?php
ob_start ();

echo "Connecting to download Inventory file.<br>";
$conn = ftp_connect($ftp_site) or die("Could not connect");

echo "Logging into site download Inventory file.<br>";
ftp_login($conn,$ftp_username,$ftp_password) or die("Bad login credentials for ". $ftp_site);

echo "Changing directory on download Inventory file.<br>";
ftp_chdir($conn,"INV") or die("could not change directory to INV");

//      connection, local, remote, type, resume
$localname = "INV"."_".date("m")."_".date('d').".csv";
echo "Downloading Inventory file to:".$localname."<br>";

ob_flush();
flush();
sleep(5);

if (ftp_get($conn,$localname,"INV.csv",FTP_ASCII)) 
{
    echo "New Inventory File Downloaded<br>";
    $datapath = $localname;
    ftp_close($conn);
} else {
    ftp_close($conn);
    die("There was a problem downloading the Inventory file.");      
}
ob_flush();
flush();
sleep(5);

$csvfile = fopen($datapath, "r"); // open csv file
$x = 1;
// skip the header line
$line = fgetcsv($csvfile);
$y = (feof($csvfile) ? 2 : 5);
while ((!$debug) ? (!feof($csvfile)) : $x <= $y) {
    $x++;
    $line = fgetcsv($csvfile);
    // do a lot of import stuff here with $line
    ob_flush();
    flush();
    sleep(1);
}

fclose($csvfile); // important: close the file
ob_end_clean();

ただし、画面には何も出力されていません。

データファイルが配置されているディレクトリを監視しているため、データファイルがダウンロードされていることがわかります。

また、DB とレコードが挿入されていることを監視できるため、インポートが発生していること、つまり while ループにあることもわかっています。

画面に出力されない理由についてのアイデアはありますか?

4

7 に答える 7

18

PHPの設定も確認する必要があります

デフォルトで 4096 のインストールもあれば、デフォルトでオフのインストールもあります。

output_buffering = オフ
output_buffering = 4096

ジョージに同意しましたが、上記の設定を確認してください

于 2010-05-14T19:48:18.823 に答える
17

出力バッファリングが自動的に開始されないことを確認してください。走る:

print ob_get_level ();

ob_start () の前に; 他の何かが表示される場合は、0 で答えが得られます。

于 2010-05-14T19:50:37.173 に答える
7

ねえ、私もこの問題で立ち往生していましたが、最終的に正しい解決策を見つけました。それはあなたのためです

ページにコンテンツ タイプを追加する必要があります。これは、次の 2 つの方法で行うことができます。1. html タグを使用する

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

元。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Wp Migration</title>
</head>
<body>
<?php 
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>
</body>
</html>
  1. PHPヘッダー関数の使用

    <?php header( 'Content-type: text/html; charset=utf-8' ); ?>

元。

<?php 
header( 'Content-type: text/html; charset=utf-8' );
for($i=0;$i<70;$i++)
{
echo 'printing...<br>';
ob_flush();
flush();
sleep(3);
}
?>

ではごきげんよう

于 2013-06-12T13:08:20.913 に答える
3

Ob_end_clean() は、現在の出力バッファの内容を破棄し、バッファリングをオフにします。代わりに ob_end_flush() を使用する必要があります。

于 2010-05-14T19:41:52.000 に答える
0

.htaccess ファイルで編集できます

出力バッファリングを無効にするには、次のように行を変更します。

php_value output_buffering Off
php_value output_buffering 4096

私のために働いた。ありがとうございました!

このサイトをチェックしてください:ここをクリック

于 2020-10-30T13:57:00.753 に答える
-1

Webサーバーが独自のバッファリングを行っている可能性があります。おそらくmod_gzipのようなもので。

非常に単純なテストコードを次に示します。

<?php
echo 'starting...<br/>';
for($i = 0; $i < 5; $i++) {
  print "$i<br/>";
  flush();
  sleep(2);
}
print 'DONE!<br/>';

そのページの読み込みに2秒ごとに新しい行が表示されるのではなく、10秒かかる場合は、そのページがWebサーバーによってキャッシュされていることを意味します。あなたがやろうとしていることのために、ob_startとob_flushを使う必要はありません。flushコンテンツをブラウザに強制したいときはいつでも電話してください。ただし、前述したように、Webサーバーがコンテンツの完了を待ってから送信する場合は、何も実行されません。

編集:別の可能性は、ページ全体を提供する前に待機する企業またはISPプロキシ/ファイアウォールの背後からページを表示していることです(たとえば、ポルノのように見えるかどうかをスキャンして確認できます)。

于 2010-05-14T19:52:34.510 に答える