如何提高使用MySQL的PHP脚本的速度?

如何提高使用MySQL的PHP脚本的速度?,php,mysql,excel,performance,Php,Mysql,Excel,Performance,我编写了一个PHP脚本,用它从excel文件中读取一些数据 然后将它以我的任意顺序插入MySQL数据库中的一些表中 此Excel文件有200行50列,通常执行时间超过60秒。因为我的PHP主机不允许我使用set\u time\u limit(0)在您看来,如何提高脚本的速度 我要读取每行的脚本: function read_row($excelFile, $r){ require_once './inc/excel_reader2.php'; $data = new Sprea

我编写了一个PHP脚本,用它从excel文件中读取一些数据

然后将它以我的任意顺序插入MySQL数据库中的一些表中

此Excel文件有200行50列,通常执行时间超过60秒。因为我的PHP主机不允许我使用
set\u time\u limit(0)在您看来,如何提高脚本的速度

我要读取每行的脚本:

 function read_row($excelFile, $r){
    require_once './inc/excel_reader2.php';
    $data = new Spreadsheet_Excel_Reader($excelFile, FALSE);
    $col[0] = $data->val($r, 'E');
    $col[1] = $data->val($r, 'F');
    ...
    $col[49] = $data->val($r, 'BZ');
    return $col;
 }
将数据插入MySQL的我的脚本:

$count = $user->rowcount($sheet=0); 
    if($final>0){
        $count = $final;
    }
    $users = 0;
    for($i = 4; $i <= $count; $i++){
        $f = $user->val($i,'D');
        $c = $user->val($i,'B');
        $l = $user->val($i,'C');
        $query = "INSERT INTO users(fullname ,ncode, location, createdtime) VALUES('$f','$c','$l', now());";
        if(mysql_query($query)){
            $users++;
        }
        $row = read_row($excelFile, $i);
        $query = "INSERT INTO `payments` (`id`, `year`, `month`, `user`, `p1`, `p2`,... `p50`) VALUES"
                . " (NULL, '$y', '$m', '$c', '$row[0]', '$row[1]', ..., '$row[49]');";
        mysql_query($query);
    } 
$count=$user->rowcount($sheet=0);
如果($final>0){
$count=$final;
}
$users=0;
对于($i=4;$i val($i,'D');
$c=$user->val($i,'B');
$l=$user->val($i,'C');
$query=“插入用户(全名、ncode、位置、createdtime)值(“$f”、“c”、“l”、now());”;
if(mysql_查询($query)){
$users++;
}
$row=读取行($excelFile,$i);
$query=“插入'payments'('id`、'year`、'month`、'user`、'p1`、'p2`、…'p50`)值”
.“(空,$y',$m',$c',$row[0],$row[1],…,$row[49];”;
mysql\u查询($query);
} 
这里有几件事:

使用
microtime(true)
对脚本进行基准测试。了解脚本最长耗时的确切位置非常有用

e、 g

对数据库插入执行相同的操作

接下来,我建议使用批插入

生成一个行数组并一次插入所有行,而不是现在使用的一次插入一行的方法

所以你的数组看起来像

$rows = array(
  array('value for col-0', 'value for col-1' ... 'col-49'), //row 1
  array('value for col-0', 'value for col-1' ... 'col-49'), //row 2, etc.
);
INSERT INTO `payments` (`id`, `year`, `month`, `user`, `p1`, `p2`,... `p50`) VALUES
(NULL, '$y', '$m', '$c', '$row[0][0]', '$row[0][1]', ..., '$row[0][49]'),
(NULL, '$y', '$m', '$c', '$row[1][0]', '$row[1][1]', ..., '$row[1][49]'),
...
(NULL, '$y', '$m', '$c', '$row[101][0]', '$row[101][1]', ..., '$row[101][49]')
您的查询将类似于

$rows = array(
  array('value for col-0', 'value for col-1' ... 'col-49'), //row 1
  array('value for col-0', 'value for col-1' ... 'col-49'), //row 2, etc.
);
INSERT INTO `payments` (`id`, `year`, `month`, `user`, `p1`, `p2`,... `p50`) VALUES
(NULL, '$y', '$m', '$c', '$row[0][0]', '$row[0][1]', ..., '$row[0][49]'),
(NULL, '$y', '$m', '$c', '$row[1][0]', '$row[1][1]', ..., '$row[1][49]'),
...
(NULL, '$y', '$m', '$c', '$row[101][0]', '$row[101][1]', ..., '$row[101][49]')
根据文件的大小,您可能还需要成批执行此操作

最后,您(正如@mellamokb所指出的)将在每个循环中打开文件。相反,您应该尝试以下操作:

function read_row($ExcelFile, $r){

    /*$col[0] = $ExcelFile->val($r, 'E');
    $col[1] = $ExcelFile->val($r, 'F');*/

    //Instead of the above, use a loop
    $col = array();        
    $num_cols = $ExcelFile->colcount();        
    for($i = 0; $i < $num_cols; $i++) {
      $col[] = $ExcelFile->val($r, $i);
    }

    //Or you can use column names if you really want
    //Pass the `$col_names` as a function parameter tho
    $col_names = array('E', 'F', 'BZ');
    $num_cols = count($col_names);
    for($i = 0; $i < $num_cols; $i++) {
      $col[] = $ExcelFile->val($r, $col_names[$i]);
    }


    return $col;
 }

 require_once './inc/excel_reader2.php';
 $DataFile = new Spreadsheet_Excel_Reader('path to your file', FALSE);
 for($i = 4; $i <= $count; $i++) {
   $row = read_row($DataFile, $i);
 }
//@param $ExcelFile : excel reader2 file object
//@param $start_row : Row to start reading from, 0 based
//@param $num_rows  : Number of rows to read
function read_n_rows($ExcelFile, $start_row, $num_rows) {
   $rows = array();
   for($i = $start_row; $i < $num_rows; $i++) {
      $rows[] = read_row($ExcelFile, $i)
   }

   return $rows;
}
函数读取行($ExcelFile,$r){
/*$col[0]=$ExcelFile->val($r,'E');
$col[1]=$ExcelFile->val($r,'F')*/
//使用循环来代替上面的方法
$col=array();
$num_cols=$ExcelFile->colcount();
对于($i=0;$i<$num_cols;$i++){
$col[]=$ExcelFile->val($r,$i);
}
//或者,如果您确实需要,也可以使用列名
//将“$col\u names”作为函数参数tho传递
$col_names=数组('E','F','BZ');
$num\u cols=计数($col\u名称);
对于($i=0;$i<$num_cols;$i++){
$col[]=$ExcelFile->val($r,$col_名称[$i]);
}
返回$col;
}
需要_once'/inc/excel_reader2.php';
$DataFile=新电子表格\u Excel\u阅读器(“文件路径”,FALSE);

对于($i=4;$i),您似乎正在打开每一行的电子表格。是否有办法将整个电子表格加载到一个数组中,然后循环执行该数组?速度较慢的播放器是PhpExcel,而不是MySQL。