我对PDO还是很陌生-尝试优化一些以前一次更新MySQL表一次的代码,并使其成批执行更新,因为实际上有数千行。
长话短说,代码需要获取一个递归目录列表,并在此基础上更新文件url表,指示是否找到该表。那是最终目标...这是代码执行的基本步骤:
第3步是我遇到问题的地方。我不断收到“ PHP致命错误:超过90秒的最大执行时间。”我已将事务大小减小到10,并将max_execution_time增加到90,并且在由于上述错误而崩溃之前,它确实设法插入了1720行。
这是第3步(包括第2步的代码)的代码-$ pdo是一个PDO对象。如果有人有任何指针,将不胜感激。 :)
//get the dir list into a one-dimensional array
$dirlistall = scanAllDir($rootdirprefix . 'docs/sds');
$countDirsList = count($dirlistall);
//print_r($dirlistall);
//load the dir list into the Directory Listings table
$stmt = $pdo->prepare("INSERT INTO DirectoryListingResults (URL) VALUES (:url)");
$batchSize = 10;
$i = 0;
try {
for ($idx=0; $idx*$batchSize < $countDirsList; $idx++) {
$dirsPartial = array_slice($dirlistall, $idx*$batchSize, $batchSize);
$pdo->beginTransaction();
$stmt->bindParam(':url', $url);
foreach ($dirsPartial as $url)
{
$stmt->execute();
}
$pdo->commit();
unset($dirsPartial);
}
}catch (Exception $e){
$pdo->rollback();
throw $e->getMessage();
}
unset($dirlistall);
在我的测试计算机上运行代码,该计算机运行带有IIS和PHP 5.6的Windows 10。 MySQL服务器是远程版本5.6.43。
[编辑]:如果相关,请使用以下PDO连接选项:
$pdooptions = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
答案 0 :(得分:1)
我很好奇绑定值而不是参数是否可以帮上忙,所以代替这个
$stmt->bindParam(':url', $url);
foreach ($dirsPartial as $url)
{
$stmt->execute();
}
这个
foreach ($dirsPartial as $url)
{
$stmt->execute([':url' => $url]);
}
我真的不知道这是否会对性能有所帮助,但是我知道,由于参数是通过引用绑定的,因此在foreach循环中重新定义$url
可能会导致问题。