首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当PDO事务有10个insert (to mysql)语句时超时

当PDO事务有10个insert (to mysql)语句时超时
EN

Stack Overflow用户
提问于 2019-06-24 22:26:37
回答 1查看 182关注 0票数 1

我对PDO相当陌生--尝试优化以前一次只更新一行MySQL表的一些代码,然后让它在批处理中进行更新,因为实际上有数千行。

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

  1. 清除“目录”表
  2. 对临时数组执行递归扫描,长度为数千项。
  3. 逐个遍历数组,并插入“目录”表。
  4. 根据“目录”表的内容,对主表设置filefoundstatus运行更新查询

第三步是我遇到麻烦的地方。我一直得到"PHP致命错误:超过90秒的最大执行时间“。我已经将事务大小减小到10,并将max_execution_time增加到90,而且它确实在崩溃之前插入了1720行,并出现了上述错误。

下面是步骤3的代码(包括步骤2) - $pdo是一个PDO对象。如果有人有任何指点的话,我会非常感激的。:)

代码语言:javascript
复制
//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连接选项:

代码语言:javascript
复制
$pdooptions = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
EN

回答 1

Stack Overflow用户

发布于 2019-06-24 23:05:55

我很好奇绑定值而不是参数是否有帮助,所以不要这样

代码语言:javascript
复制
$stmt->bindParam(':url', $url);
foreach ($dirsPartial as $url)
{
    $stmt->execute();
}

代码语言:javascript
复制
foreach ($dirsPartial as $url)
{
    $stmt->execute([':url' => $url]);
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56744673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档