如何提高使用MySQL的PHP脚本的速度?
我编写了一个PHP脚本,用它从excel文件中读取一些数据 然后将它以我的任意顺序插入MySQL数据库中的一些表中 此Excel文件有200行50列,通常执行时间超过60秒。因为我的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
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。