0

libpuzzleを使用して 300 万枚の画像を分析しました。私のメインサーバーから200万、別のサーバーから100万。情報を 1 つの MySQL データベースに結合したいと考えています。

データベースのレコードを取得してtest_images_pending挿入する必要がありますtest_imagesが、データが重複しないようにする必要があります。

test_imagesすべてのテーブルで合計 1 億 1,500 万件のレコードがあり、単語だけで 1 億 1,000 万件あります。サイズ ~4.4 GB

test_images_pending丁重に 6900 万と 6500 万を持っています。サイズ ~2.6 GB

私のコンピュータには 8GB の RAM があり、必要に応じてすべてをメモリにロード (または試行) して速度を上げます。

コードを最適化したり、MySQL を高速化する手法を使用したりすることで、速度を 1 秒あたり約 2 枚 (test_images_pending.picture テーブルから) からより管理しやすいものに改善できることを願っています。少なくとも、1 秒あたり 100 枚の写真のようなものになります。

test_imagesとの両方のテーブル設定は次のとおりtest_images_pendingです。

--
-- Table structure for table `errors`
--

CREATE TABLE IF NOT EXISTS `errors` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  `num` int(11) NOT NULL,
  `pid` bigint(20) unsigned NOT NULL,
  `error` varchar(512) NOT NULL,
  `datetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=245688 ;

-- --------------------------------------------------------

--
-- Table structure for table `pictures`
--

CREATE TABLE IF NOT EXISTS `pictures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `digest` char(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_digest` (`digest`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1107725 ;

-- --------------------------------------------------------

--
-- Table structure for table `signatures`
--

CREATE TABLE IF NOT EXISTS `signatures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `compressed_signature` varchar(338) NOT NULL,
  `picture_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `picture_id` (`picture_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1107725 ;

-- --------------------------------------------------------

--
-- Table structure for table `stored_pictures`
--

CREATE TABLE IF NOT EXISTS `stored_pictures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL,
  `pid` bigint(20) unsigned NOT NULL,
  `num` int(11) NOT NULL,
  `updated_at` datetime DEFAULT NULL,
  `created_at` datetime DEFAULT NULL,
  `picture_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_url` (`url`),
  KEY `idx_picture_id` (`picture_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2773867 ;

-- --------------------------------------------------------

--
-- Table structure for table `words`
--

CREATE TABLE IF NOT EXISTS `words` (
  `pos_and_word` char(5) NOT NULL,
  `signature_id` int(11) NOT NULL,
  KEY `idx_pos_and_word` (`pos_and_word`),
  KEY `signature_id` (`signature_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
--

私が実行しているphp PDOコードは次のとおりです。

<html>
<head>
    <link href="../css/print.css" rel="stylesheet" type="text/css" media="print" /> <!-- siehe screen.css -->
    <link href="../css/screen.css" rel="stylesheet" type="text/css" media="screen, projection" /> 
    <!--[if lte IE 6]><link rel="stylesheet" href="../css/ielte6.css" type="text/css" media="screen" /><![endif]--> 
</head>
<body>
<?php
    ini_set('max_execution_time', 0);

    $dbh = new PDO("mysql:host=127.0.0.1;port=3306;dbname=test_images_pending;charset=utf-8", "root", "");
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);


    try {
        $query = "select id,digest from test_images_pending.pictures"; 
        $sth = $dbh->prepare($query);
        $sth->execute();

        while ($pending_pictures_rows = $sth->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {

            // Print out what id it's on.
            print $pending_pictures_rows['id']."<br>";
            buffer_flush();

            try {
                $dbh->beginTransaction(); 

                $query = "SELECT COUNT(id) from test_images.pictures WHERE digest = :digest";
                $sth1 = $dbh->prepare($query);
                $sth1->bindParam(':digest', $pending_pictures_rows['digest']);
                $sth1->execute();

                $count = $sth1->fetchColumn();

                if ($count == 1) {



                    $query = "SELECT id from test_images.pictures WHERE digest = :digest";
                    $sth2 = $dbh->prepare($query);
                    $sth2->bindParam(':digest', $pending_pictures_rows['digest']);
                    $sth2->execute();

                    $correct_pic_id = $sth2->fetchColumn();

                    if(!isset($correct_pic_id) or empty($correct_pic_id)) {
                        throw new PDOException('correct_pic_id was empty');
                    }

                    $query = "select * from test_images_pending.stored_pictures WHERE picture_id = :picture_id"; 
                    $sth3 = $dbh->prepare($query);
                    $sth3->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth3->execute();

                    while ($row = $sth3->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {

                        $query = "INSERT INTO test_images.stored_pictures 
                                    (id, url, pid, num, updated_at, created_at, picture_id) 
                                  VALUES 
                                    (default, :url, :pid, :num, :updated_at, :created_at, :picture_id);";

                        $sth4 = $dbh->prepare($query);
                        $sth4->bindParam(':url', $row['url']);
                        $sth4->bindParam(':pid', $row['pid']);
                        $sth4->bindParam(':num', $row['num']);
                        $sth4->bindParam(':updated_at', $row['updated_at']);
                        $sth4->bindParam(':created_at', $row['created_at']);
                        $sth4->bindParam(':picture_id', $correct_pic_id);
                        $sth4->execute();
                    }

                    $query = "DELETE FROM test_images_pending.stored_pictures WHERE picture_id = :picture_id;";
                    $sth5 = $dbh->prepare($query);
                    $sth5->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth5->execute();

                    $query = "select id from test_images_pending.signatures WHERE picture_id = :picture_id;"; 
                    $sth6 = $dbh->prepare($query);
                    $sth6->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth6->execute();

                    $signature_id = $sth6->fetchColumn();

                    if(!isset($signature_id) or empty($signature_id)) {
                        throw new PDOException('signature_id was empty');
                    }

                    $query = "DELETE FROM test_images_pending.words WHERE signature_id = :signature_id;"; 
                    $sth7 = $dbh->prepare($query);
                    $sth7->bindParam(':signature_id', $signature_id);
                    $sth7->execute();

                    $query = "DELETE FROM test_images_pending.signatures WHERE picture_id = :picture_id";        
                    $sth8 = $dbh->prepare($query);
                    $sth8->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth8->execute();

                    $query = "DELETE FROM test_images_pending.pictures WHERE digest = :digest";                                  
                    $sth9 = $dbh->prepare($query);
                    $sth9->bindParam(':digest', $pending_pictures_rows['digest']);
                    $sth9->execute();
                } else if ($count == 0){



                    $query = "INSERT INTO test_images.pictures
                                (id, digest) 
                              VALUES 
                                (default, :digest);";

                    $sth2 = $dbh->prepare($query);
                    $sth2->bindParam(':digest', $pending_pictures_rows['digest']);
                    $sth2->execute();

                    $new_pic_id = $dbh->lastInsertId();


                    $query = "select * from test_images_pending.stored_pictures WHERE picture_id = :picture_id"; 
                    $sth3 = $dbh->prepare($query);
                    $sth3->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth3->execute();

                    while ($row = $sth3->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {

                        $query = "INSERT INTO test_images.stored_pictures 
                                    (id, url, pid, num, updated_at, created_at, picture_id) 
                                  VALUES 
                                    (default, :url, :pid, :num, :updated_at, :created_at, :picture_id);";

                        $sth4 = $dbh->prepare($query);
                        $sth4->bindParam(':url', $row['url']);
                        $sth4->bindParam(':pid', $row['pid']);
                        $sth4->bindParam(':num', $row['num']);
                        $sth4->bindParam(':updated_at', $row['updated_at']);
                        $sth4->bindParam(':created_at', $row['created_at']);
                        $sth4->bindParam(':picture_id', $new_pic_id);
                        $sth4->execute();
                    }




                    $query = "DELETE FROM test_images_pending.stored_pictures WHERE picture_id = :picture_id;";
                    $sth5 = $dbh->prepare($query);
                    $sth5->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth5->execute();

                    $query = "select id,compressed_signature from test_images_pending.signatures WHERE picture_id = :picture_id;"; 
                    $sth6 = $dbh->prepare($query);
                    $sth6->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth6->execute();
                    $fetched = $sth6->fetch(PDO::FETCH_ASSOC);

                    $signature_id = $fetched['id'];

                    if(!isset($signature_id) or empty($signature_id)) {
                        print_r($sth6->fetch(PDO::FETCH_ASSOC));
                        throw new PDOException('signature_id was empty');
                    }

                    $compressed_signature = $fetched['compressed_signature'];

                    if(!isset($compressed_signature) or empty($compressed_signature)) {
                        print_r($sth6->fetch(PDO::FETCH_ASSOC));
                        throw new PDOException('compressed_signature was empty');
                    }

                    $query = "INSERT INTO test_images.signatures
                                (id, compressed_signature, picture_id)
                              VALUES
                                (default, :compressed_signature, :picture_id);";

                    $sth7 = $dbh->prepare($query);
                    $sth7->bindParam(':picture_id', $new_pic_id);
                    $sth7->bindParam(':compressed_signature', $compressed_signature);
                    $sth7->execute();

                    $new_sig_id = $dbh->lastInsertId();

                    $query = "SELECT pos_and_word FROM test_images_pending.words WHERE signature_id = :signature_id";  
                    $sth8 = $dbh->prepare($query);
                    $sth8->bindParam(':signature_id', $signature_id);
                    $sth8->execute();

                    while ($row = $sth8->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {

                        $query = "INSERT INTO test_images.words 
                                    (pos_and_word, signature_id)
                                  VALUES 
                                    (:pos_and_word, :signature_id);";

                        $sth9 = $dbh->prepare($query);
                        $sth9->bindParam(':pos_and_word', $row['pos_and_word']);
                        $sth9->bindParam(':signature_id', $new_sig_id);
                        $sth9->execute();
                    }

                    $query = "DELETE FROM test_images_pending.words WHERE signature_id = :signature_id;"; 
                    $sth10 = $dbh->prepare($query);
                    $sth10->bindParam(':signature_id', $signature_id);
                    $sth10->execute();

                    $query = "DELETE FROM test_images_pending.signatures WHERE picture_id = :picture_id";        
                    $sth11 = $dbh->prepare($query);
                    $sth11->bindParam(':picture_id', $pending_pictures_rows['id']);
                    $sth11->execute();

                    $query = "DELETE FROM test_images_pending.pictures WHERE digest = :digest";                                  
                    $sth12 = $dbh->prepare($query);
                    $sth12->bindParam(':digest', $pending_pictures_rows['digest']);
                    $sth12->execute();


                } else {
                    throw new PDOException("Found more than 1 match for the digest '{$pending_pictures_rows['digest']}' in 'test_images.pictures' ", $query);
                }

                $dbh->commit(); 
            } catch (PDOException $e) {
                $dbh->rollback(); 
                print "<pre>"; print_r($e); print "</pre>"; exit;
            }
        }

        try {

            $dbh->beginTransaction();

            $query = "SELECT * FROM test_images_pending.errors";
            $sth13 = $dbh->prepare($query);
            $sth13->execute();

            while ($row = $sth13->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {

                $query = "INSERT INTO test_images.errors 
                            (id, url, num, pid, error, datetime)
                          VALUES 
                            (default, :url, :num, :pid, :error, :datetime);";


                $sth14 = $dbh->prepare($query);
                $sth14->bindParam(':url', $row['url']);
                $sth14->bindParam(':num', $row['num']);
                $sth14->bindParam(':pid', $row['pid']);
                $sth14->bindParam(':error', $row['error']);
                $sth14->bindParam(':datetime', $row['datetime']);
                $sth14->execute();
            }

            $query = "DELETE FROM test_images_pending.errors WHERE 1";       
            $sth15 = $dbh->prepare($query);
            $sth15->execute();

            $dbh->commit(); 
        } catch (PDOException $e) {
            $dbh->rollback(); 
            print "<pre>"; print_r($e); print "</pre>"; exit;
        }
    } catch (PDOException $e) {
        print "<pre>"; print_r($e); print "</pre>"; exit;
    }


function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}
?> 
</body>
</html>

編集:

いくつかのプロファイリング:

この INSERT は、類似していない画像ごとに 100 回実行されます (これまでのところ、6 回ごとに ~5 回)。通常、while ループを完了するのに 0.5 ~ 0.9 秒かかり、INSERT あたり平均 0.007 秒かかります。

$query = "INSERT INTO test_images.words 
        (pos_and_word, signature_id)
        VALUES 
        (:pos_and_word, :signature_id);";

$sth9 = $dbh->prepare($query);
$sth9->bindParam(':pos_and_word', $row['pos_and_word']);
$sth9->bindParam(':signature_id', $new_sig_id);
$sth9->execute();
DELETE FROM test_images_pending.stored_pictures WHERE picture_id = :picture_id;

select * from test_images_pending.stored_pictures WHERE picture_id = :picture_id

DELETE FROM test_images_pending.stored_pictures WHERE picture_id = :picture_id;

似たような写真 1 枚あたり平均 0.15 秒ほどかかります (6 分の 1 程度)。

編集2:

このベンチマークによると: http://we-love-php.blogspot.com/2012/08/mass-inserts-updates-sqlite-vs-mysql.html

編集 1 で前述した遅い while ループを、次のようなテキスト ファイルへの単純な書き込みに置き換えます。

$inserts = array();
while ($row = $sth8->fetch(PDO::FETCH_ASSOC, PDO::FETCH_ORI_NEXT)) {
    $inserts[] = "(".$dbh->quote($row['pos_and_word']).", ".$dbh->quote($new_sig_id).")";
}
$query = "INSERT INTO imvu_images.words (pos_and_word, signature_id) VALUES " . implode(',',$inserts) . ";";            
file_put_contents("inserts.sql", $query."\n", FILE_APPEND);

より速くなります。ただし、毎秒 100 ではなく、10-20 のようです。後で SQL を実行するだけで、遅滞なく即座に実行されます。(そのため、私のコードに問題があると思います)。毎秒 100 が必要な理由は、毎秒 30 で画像を分析して 1 つのデータベースに挿入できるためです。このレートでは、行をまとめて挿入するよりも、200 万枚の画像を分析して 1 つずつ挿入する方が高速です。サーバーは 30 枚の画像をダウンロードし、30 枚の画像を分析し、1 秒間に 30 枚の挿入を実行できますが、これらのさまざまな SQL ステートメントを実行するだけでは、それに匹敵しません。

編集3:

my.ini を次のように更新しました。

key_buffer_size=4000M
read_buffer_size=32M
read_rnd_buffer_size=200M
bulk_insert_buffer_size=1000M
myisam_max_sort_file_size=10000M
myisam_repair_threads=1
tmp_table_size = 1024M
max_heap_table_size = 1024M
join_buffer_size=8M
sort_buffer_size=8M
max_allowed_packet=32M
max_connect_errors=10
myisam_sort_buffer_size=256M
query_cache_limit=12M
query_cache_size=256M
query_cache_type=1

file_put_contents ハックを使用しなくても、パフォーマンスが 2 倍向上したようです。それでも、1 秒間に 5 レコードでは足りません。

4

3 に答える 3

1

このプロセスが非常に遅い理由は、個々のクエリが遅いからではありません。実際、すべての処理速度に驚いています。各レコードをループすることで、一度に 1 つずつ、何百万ものレコードを処理しているからです。あなたの外側の結果セットで。SQL が得意とするのは、何百万ものレコードを一度に処理することです。

あなたのコードにはビジネス ロジックが多すぎて、すべてを書き直すことはできませんが、次の行に沿ってコードを書き直してもらいたいと思います。

INSERT INTO test_images.pictures
      (id, digest) 
SELECT id, digest
from  test_images_pending.pictures
where id not in 
   (select id from test_images.pictures)

他のテーブルについても同じことを行います。これは非常に高速に実行されるはずです。適切なインデックス スキームがあれば、ほぼ確実に I/O バウンドになります。間違いなく 1 秒あたり 2 レコード以上に到達する必要があります。

于 2013-01-11T14:52:09.670 に答える
0

Mysql ストアド プロシージャを使用できないのはなぜですか? それらはMysqlサーバーで直接実行され、phpからのクエリ実行よりも高速です。 http://dev.mysql.com/doc/refman/5.0/en/create-procedure.html

次のように php からストアド プロシージャを呼び出します。

$res = mysql_query('call sp_sel_test()');
if ($res === FALSE) {
    die(mysql_error());
}

PHP でストアド プロシージャを使用するには、接続中にクライアント フラグを設定する必要があります。これを使用してください: mysql_connect($this->h,$this->u,$this->p,false,65536);

詳細については、 MySQL クライアント フラグを参照してください。

于 2013-01-11T14:34:09.717 に答える
0

編集: 主な問題は、INSERT 対象のソース テーブルのインデックスでした。一括挿入を行う前に、不要なインデックスを削除してから、後で再構築することをお勧めします。

mysql 設定の調整と次のコードを組み合わせることで、重複した画像 (結合部分) を 30 秒ほどで 50,000 処理することができました。25 秒は JOIN 操作だけです。

私が NOT IN を使用している 2 番目の部分は、ほとんどの場合ここで発生しますが、1 秒あたり 800 レコードの速度で挿入されるため、目標を超えています。

3,900 万件のレコードを処理する必要があるため、もう少し最適化できるかどうかを確認するために、質問を開いたままにしておきます。

<html>
<head>
      <link href="../css/print.css" rel="stylesheet" type="text/css" media="print" /> <!-- siehe screen.css -->
    <link href="../css/screen.css" rel="stylesheet" type="text/css" media="screen, projection" /> 
    <!--[if lte IE 6]><link rel="stylesheet" href="../css/ielte6.css" type="text/css" media="screen" /><![endif]--> 
</head>
<body>
 <?php
    ini_set('max_execution_time', 0);
    $benchmark = false;
    $delete = false;
    $dbh = new PDO("mysql:host=127.0.0.1;port=3306;dbname=test_images_pending;charset=utf-8", "root", "");
    $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $dbh->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);

    $timers = array();

    try {
        $query = "SELECT * FROM test_images.pictures
                INNER JOIN test_images_pending.pictures
                USING ( digest )";

        $sth = $dbh->prepare($query);
        $sth->execute();

        while ($join_rows = $sth->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {

            $digest =  $join_rows[0];
            $correct_pic_id = $join_rows[1];
            $wrong_pic_id = $join_rows[2];


            try {
                $dbh->beginTransaction(); 



                $query = "INSERT INTO test_images.stored_pictures 
                                (url, pid, num, updated_at, created_at, picture_id) 
                          SELECT 
                                url, pid, num, updated_at, created_at, :correct_pic_id FROM test_images_pending.stored_pictures WHERE picture_id = :wrong_pic_id;";

                $sth4 = $dbh->prepare($query);
                $sth4->bindParam(':correct_pic_id', $correct_pic_id);
                $sth4->bindParam(':wrong_pic_id', $wrong_pic_id);
                $sth4->execute();


                $dbh->commit(); 
            } catch (PDOException $e) {
                $dbh->rollback(); 
                print "<pre>"; print_r($e); print "</pre>"; exit;
            }
        }

    } catch (PDOException $e) {
        print "<pre>"; print_r($e); print "</pre>"; exit;
    }





    try {


        $query = "SELECT COUNT(id) FROM  `signatures` WHERE (`id` -  `picture_id` !=0)  ";
        $sth = $dbh->prepare($query);
        $sth->execute();

        $count = $sth->fetchColumn();
        if($count > 0) {
            die("we got a sig that aint matching its pic_id, we cant assume sig_id = pic_id. Back to drawing board");
        }
        $sth = null;


        $query = "  SELECT  digest, id
                    FROM    test_images_pending.pictures
                    WHERE   digest NOT IN
                        (
                        SELECT  digest
                        FROM    test_images.pictures
                        )"; 
        $sth = $dbh->prepare($query);
        $sth->execute();

        while ($not_in_rows = $sth->fetch(PDO::FETCH_NUM, PDO::FETCH_ORI_NEXT)) {

            $digest =  $not_in_rows[0];
            $wrong_pic_id = $not_in_rows[1];


            try {
                $dbh->beginTransaction(); 

                $query = "INSERT INTO test_images.pictures
                            (id, digest) 
                          VALUES 
                            (default, :digest);";

                $sth2 = $dbh->prepare($query);
                $sth2->bindParam(':digest', $digest);
                $sth2->execute();

                $new_pic_id = $dbh->lastInsertId();



                $query = "INSERT INTO test_images.stored_pictures 
                                (url, pid, num, updated_at, created_at, picture_id) 
                          SELECT 
                                url, pid, num, updated_at, created_at, :new_pic_id FROM test_images_pending.stored_pictures WHERE picture_id = :wrong_pic_id;";

                $sth3 = $dbh->prepare($query);
                $sth3->bindParam(':new_pic_id', $new_pic_id);
                $sth3->bindParam(':wrong_pic_id', $wrong_pic_id);
                $sth3->execute();



                $query = "INSERT INTO test_images.signatures 
                                (compressed_signature, picture_id) 
                          SELECT 
                                compressed_signature, :new_pic_id FROM test_images_pending.signatures WHERE picture_id = :wrong_pic_id;";

                $sth4 = $dbh->prepare($query);
                $sth4->bindParam(':new_pic_id', $new_pic_id);
                $sth4->bindParam(':wrong_pic_id', $wrong_pic_id);
                $sth4->execute();
                $new_sig_id = $dbh->lastInsertId();


                $query = "INSERT INTO test_images.words 
                            (pos_and_word, signature_id)
                          SELECT 
                            pos_and_word, :new_sig_id FROM test_images_pending.words WHERE signature_id = :old_sig_id

                            ";

                $sth9 = $dbh->prepare($query);
                $sth9->bindParam(':old_sig_id', $wrong_pic_id);
                $sth9->bindParam(':new_sig_id', $new_sig_id);
                $sth9->execute();



                $dbh->commit(); 
            } catch (PDOException $e) {
                $dbh->rollback(); 
                print "<pre>"; print_r($e); print "</pre>"; exit;
            }
        }
    } catch (PDOException $e) {
        print "<pre>"; print_r($e); print "</pre>"; exit;
    }

function buffer_flush(){

    echo str_pad('', 512);
    echo '<!-- -->';

    if(ob_get_length()){

        @ob_flush();
        @flush();
        @ob_end_flush();

    }

    @ob_start();

}
 ?> 
</body>
</html>
于 2013-01-12T06:01:40.697 に答える