簡體   English   中英

PDO 事務在有 10 個插入(到 mysql)語句時超時

[英]PDO transaction timing out when it has 10 insert (to mysql) statements

我對 PDO 相當陌生——試圖優化一些以前一次更新 MySQL 表的代碼,並讓它改為批量更新,因為實際上有數千行。

長話短說,代碼需要得到一個遞歸目錄列表,並在此基礎上更新文件 url 表,表明是否找到了該表。 這就是最終目標……以下是代碼正在執行的基本步驟:

  1. 清除“目錄”表
  2. 做一個遞歸掃描到一個臨時數組,數千個項目長
  3. 將數組一一遍歷,插入到“目錄”表中
  4. 根據“目錄”表的內容在主表設置文件foundstatus上運行更新查詢

第 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 的 Windows 10 和 PHP 5.6。 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,
];

我很好奇綁定值而不是參數是否有幫助,而不是這個

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

這個

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

我真的不知道這是否有助於提高性能,但我知道由於參數受引用約束,因此在 foreach 循環中重新定義$url可能會導致一般問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM