如何提高php中csv数据插入数据库的速度?

我编写了这段代码,允许读取文件夹,根据文件名插入到不同的表中的 csv 文件的数据。文件处理完毕后,将被移动到另一个文件夹。我的代码运行良好,但第二个 csv 文件长度超过 80 000 行,需要几个小时才能集成到我的数据库中。


如何提高代码的性能?我尝试“加载本地数据”但没有成功......


<?php


include("../connexion.php");


ini_set('max_execution_time', 54000);

$timestamp= date("y-m-d H:i");


$dir   = 'D:/xampp/htdocs/retail_BI/test/';

$allFiles = scandir($dir);

$dest = 'D:/xampp/htdocs/retail_BI/test/files/';


   foreach($allFiles as $file) {


        if (!in_array($file,array(".","..")))

      { 

  

        $file = $dir.$file;

        $filename = basename( $file );

        

       if ( strpos( $filename, 'BI1_' ) === 0 ) {

        if (($handle = fopen("$filename", "r")) !== false) {

            

            //To remove BOM in the fist cell

              fseek($handle, 3);

            

            while (($data = fgetcsv($handle, 9000000, ";")) !== false) {

                if (empty(array_filter($data))) {

                    echo "not good";

                continue;

                }

 

            $date = DateTime::createFromFormat('d/m/Y H:i:s A', $data[2]);

            if ($date === false) {

            break;

            }


            $date1 = $date->format('Y-m-d'); // 2020-07-07

            $date2 = $date->format('Hi A'); // 1247 AM

            

              //database entry               

              $query = "insert into dbo.Y2_Sales (storenumber, storename, date, time, TransRef, stylecode, color, size, quantity, unit_price, SalesExGST, cost, currency) 

               values('$data[0]', '$data[1]','$date1','$date2','$data[3]','$data[4]','$data[5]','$data[6]','$data[7]', '$data[8]','$data[9]','$data[10]','$data[11]')";

                   $stmt = $conn->query( $query );

                     if (!$stmt) { echo $conn->error;}                                          

                }       

            }

                

qq_花开花谢_0
浏览 84回答 1
1回答

交互式爱情

不要将每一行的数据插入数据库,而是尝试批量插入。您始终可以进行批量插入,可以获取 n(使用 1000)个条目并将其插入到表中。这将减少数据库调用,从而减少总时间。对于 80k 条目,您也有可能超出内存限制。您可以使用 php 中的生成器来克服这个问题。 虽然这是在 Laravel 中,但是从 csv 读取的代码是独立的(使用生成器的代码),并且可以在此处使用逻辑。
打开App,查看更多内容
随时随地看视频慕课网APP