0

mysql データベースに更新する約 13000 行の CSV ファイルがあります。PHP 関数は、約 5000 行後にタイムアウトまたはメモリ オーバーフローで停止します。

fgetcsv を使用してすべての行をループし、行が既に存在するかどうかを確認します。これにより、タイムアウトが発生していると思います (SELECT/INSERT/UPDATE クエリ)。

テーブルにはまだ他のテーブルとの関係があるため、テーブルを削除してすべてを再挿入することはできません。->次に、たとえば5000行のブロックで複数の値の文字列を含む単一のINSERTステートメントを作成できます。

タイムアウトを防ぐために、ファイルをチャンクで読み取る方法を見つける必要があります。

事前にt​​hx!

いくつかのコード:

private function readFile()
    {
        $this->profiler = NULL;
        $this->auto_render = FALSE;
        $this->request->headers['Content-Type'] = 'application/json';

        if (array_key_exists('uploadedfile', $_FILES))
        {
            $filename = $_FILES['uploadedfile']['tmp_name'];
            if ($_FILES['uploadedfile']['type'] == 'application/vnd.ms-excel') // csv file
            {
                if (is_uploaded_file($filename)) //check if file 
                {
                    if ($_FILES['uploadedfile']['error'] == UPLOAD_ERR_OK) //check no errors
                    {                   
                        // time limit : unlimited
                        set_time_limit(0);

                        // file handler
                        $filepointer = fopen($filename,'r');
                        return $filepointer;
                    }
                }
            }
        }   
    }

別の関数内で readFile() を呼び出し、次のような行をループします。

while (($line = fgetcsv($filepointer, 1000, ";")) != false)
4

1 に答える 1

0

コマンドラインからphpファイルを実行します。デフォルトでは、タイムアウトは設定されていません。
または でタイムアウトを増やしphp.iniます。

于 2011-06-20T14:10:19.967 に答える