php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能

我试图建立一个脚本,我需要读取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 –

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值