我对PDO相当陌生--尝试优化以前一次只更新一行MySQL表的一些代码,然后让它在批处理中进行更新,因为实际上有数千行。
长话短说,代码需要得到一个递归目录列表,并在此基础上更新文件urls表,指示是否找到了该表。这是最终目标..。下面是代码正在执行的基本步骤:
第三步是我遇到麻烦的地方。我一直得到"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和PHP5.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,
];发布于 2019-06-24 23:05:55
我很好奇绑定值而不是参数是否有帮助,所以不要这样
$stmt->bindParam(':url', $url);
foreach ($dirsPartial as $url)
{
$stmt->execute();
}这
foreach ($dirsPartial as $url)
{
$stmt->execute([':url' => $url]);
}我真的不知道这是否有助于性能,但我知道,因为参数是通过引用绑定的,所以在foreach循环中重新定义$url通常会导致问题。
https://stackoverflow.com/questions/56744673
复制相似问题