Ticket #2512: pdo_insert_zip.patch

File pdo_insert_zip.patch, 3.9 KB (added by nanasess, 7 years ago)

PDO を使用したパッチ

  • data/class/pages/admin/basis/LC_Page_Admin_Basis_ZipInstall.php

    a b  
    161161        $objQuery =& SC_Query_Ex::getSingletonInstance(); 
    162162 
    163163        // DB更新 
    164         $objQuery->begin(); 
    165         $this->lfDeleteZip(); 
    166164        $this->insertMtbZip(); 
    167         $objQuery->commit(); 
    168165    } 
    169166 
    170167    /** 
     
    232229        $cntInsert = 0; 
    233230        $img_cnt = 0; 
    234231 
    235         $fp = $this->openZipCsv(); 
    236         while (!feof($fp)) { 
    237             $arrCSV = fgetcsv($fp, ZIP_CSV_LINE_MAX); 
    238             if (empty($arrCSV)) continue; 
    239             $cntCurrentLine++; 
    240             if ($cntCurrentLine >= $start) { 
    241                 $sqlval = array(); 
    242                 $sqlval['zip_id'] = $cntCurrentLine; 
    243                 $sqlval['zipcode'] = $arrCSV[2]; 
    244                 $sqlval['state'] = $arrCSV[6]; 
    245                 $sqlval['city'] = $arrCSV[7]; 
    246                 $sqlval['town'] = $arrCSV[8]; 
    247                 $objQuery->insert('mtb_zip', $sqlval); 
     232        /* 標準実装が非常に遅いので Azure/WebMatrix 向けにチューニング */ 
     233        $begin = microtime(true); 
     234 
     235        try { 
     236            $dbh = new PDO('mysql:host=' . DB_SERVER . ';dbname=' . DB_NAME . ';port=' . DB_PORT . ';charset=utf8', DB_USER, DB_PASSWORD); 
     237            $dbh->beginTransaction(); 
     238            $dbh->exec('DELETE FROM mtb_zip'); 
     239 
     240            $sql = 'INSERT INTO mtb_zip (zip_id, zipcode, state, city, town) VALUES (?, ?, ?, ?, ?)'; 
     241            $stmt = $dbh->prepare($sql); 
     242            $line = file(ZIP_CSV_UTF8_REALFILE); 
     243            for($i = 0; $line[$i] != ''; $i ++){ 
     244                if (!($array = explode(",", $line[$i]))) { 
     245                    continue; 
     246                } 
     247                $stmt->bindParam(1, ++$cntCurrentLine, PDO::PARAM_INT); 
     248                $stmt->bindParam(2, $array[2], PDO::PARAM_STR, strlen($array[2])); 
     249                $stmt->bindParam(3, $array[6], PDO::PARAM_STR, strlen($array[6])); 
     250                $stmt->bindParam(4, $array[7], PDO::PARAM_STR, strlen($array[7])); 
     251                $stmt->bindParam(5, $array[8], PDO::PARAM_STR, strlen($array[8])); 
     252                $stmt->execute(); 
    248253                $cntInsert++; 
    249             } 
    250254 
    251             // $disp_line件ごとに進捗表示する 
    252             if ($cntCurrentLine % $disp_line == 0 && $img_cnt < IMAGE_MAX) { 
    253                 echo '<img src="' . $img_path . 'graph_1_w.gif">'; 
    254                 SC_Utils_Ex::sfFlush(); 
    255                 $img_cnt++; 
     255                // $disp_line件ごとに進捗表示する 
     256                if ($i % $disp_line == 0 && $img_cnt < IMAGE_MAX) { 
     257                    echo '<img src="' . $img_path . 'graph_1_w.gif">'; 
     258                    SC_Utils_Ex::sfFlush(); 
     259                    $img_cnt++; 
     260                } 
     261                SC_Utils_Ex::extendTimeOut(); 
    256262            } 
    257             SC_Utils_Ex::extendTimeOut(); 
    258         } 
    259         fclose($fp); 
    260  
    261         echo '<img src="' . $img_path . 'space_w.gif">'; 
     263            $end = microtime(true); 
    262264 
     265            echo '<img src="' . $img_path . 'space_w.gif">'; 
     266        } catch (PDOException $e) { 
     267            trigger_error($e->getMessage(), E_USER_ERROR); 
     268        } 
    263269        ?> 
    264270        </div> 
    265271        <script type='text/javascript' language='javascript'> 
     
    270276                    document.open('text/html','replace'); 
    271277                    document.clear(); 
    272278                    document.write('<p>完了しました。<br />'); 
    273                     document.write("<?php echo $cntInsert ?> 件を追加しました。</p>"); 
     279                    document.write("<?php echo $cntInsert ?> 件を追加しました。<?php echo ($end-$begin); ?> 秒かかりました</p>"); 
    274280                    document.write("<p><a href='?' target='_top'>戻る</a></p>"); 
    275281                    document.close(); 
    276282                } 
     
    281287        </body> 
    282288        </html> 
    283289        <?php 
     290        $dbh->commit(); 
    284291    } 
    285292 
    286293    public function openZipCsv()