PDO事务有10条(向mysql)插入语句时超时

时间:2019-06-24 22:26:37

标签: php mysql pdo

我对PDO还是很陌生-尝试优化一些以前一次更新MySQL表一次的代码,并使其成批执行更新,因为实际上有数千行。

长话短说,代码需要获取一个递归目录列表,并在此基础上更新文件url表,指示是否找到该表。那是最终目标...这是代码执行的基本步骤:

  1. 清除“目录”表
  2. 将递归scandir放入一个临时数组,该数组长数千个项目
  3. 一个接一个地遍历数组,并将其插入“目录”表
  4. 基于“目录”表的内容在主表设置filefoundstatus上运行更新查询

第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,
];

1 个答案:

答案 0 :(得分:1)

我很好奇绑定值而不是参数是否可以帮上忙,所以代替这个

$stmt->bindParam(':url', $url);
foreach ($dirsPartial as $url)
{
    $stmt->execute();
}

这个

foreach ($dirsPartial as $url)
{
    $stmt->execute([':url' => $url]);
}

我真的不知道这是否会对性能有所帮助,但是我知道,由于参数是通过引用绑定的,因此在foreach循环中重新定义$url可能会导致问题。