我试图建立一个脚本,我需要读取txt文件并使用文件上的行执行某个过程。例如,我需要检查ID是否存在,如果信息已更新(如果有),则更新当前表(如果不存在),则在另一个临时表上插入一个新行,稍后手动检查。PHP提高执行多个查询时读取一千行文件的性能
这些文件可能包含超过20,30000行。
当我刚刚读取文件并从行中打印一些dummie内容时,需要40-50ms。但是,当我需要连接到数据库来执行所有这些验证时,由于超时而在停止之前停止。
这是我在做什么至今:
$handle = fopen($path, "r") or die("Couldn't get handle");
if ($handle) {
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
$segment = explode('|', $buffer);
if (strlen($segment[0]) > 6) {
$param = [':code' => intval($segment[0])];
$codeObj = Sql::exec("SELECT value FROM product WHERE code = :code", $param);
if (!$codeObj) {
$param = [
':code' => $segment[0],
':name' => $segment[1],
':value' => $segment[2],
];
Sql::exec("INSERT INTO product_tmp (code, name, value) VALUES (:code, :name, :value)", $param);
} else {
if ($codeObj->value !== $segment[2]) {
$param = [
':code' => $segment[0],
':value' => $segment[2],
];
Sql::exec("UPDATE product SET value = :value WHERE code = :code", $param);
}
}
}
}
fclose($handle);
}
这是我的SQL类与PDO连接并执行查询:
public static function exec($sql, $param = null) {
try {
$conn = new PDO('mysql:charset=utf8mb4;host= '....'); // I've just deleted the information to connect to the database (password, user, etc.)
$q = $conn->prepare($sql);
if (isset($param)) {
foreach ($param as $key => $value) {
$$key = $value;
$q->bindParam($key, $$key);
}
}
$q->execute();
$response = $q->fetchAll();
if (count($response)) return $response;
return false;
} catch(PDOException $e) {
return 'ERROR: ' . $e->getMessage();
}
}
正如你所看到的,每个查询我通过Sql::exec()来做,正在打开一个新的连接。我不知道这是否可能是此过程出现延迟的原因,因为当我没有执行任何Sql查询时,脚本在ms内运行。
或者其他部分的代码可能会导致这个问题?
+0
例如,您是通过命令行还是通过HTTP和Apache在后台运行它。似乎更适合后台进程。 –
+0
当然,我不会连接到循环中的数据库,你应该保存连接到一个类属性或你有什么,并重新使用它。 –
+0
@ArtisticPhoenix这是通过cron作业在后台运行。我的意思是,cronjob调用这个php文件来执行这个函数,但它也可以手动调用(如果需要的话 - 不常见),或者在这个测试阶段,我仍然在构建脚本,然后我正在通过xhr request –