[英]PDO transaction timing out when it has 10 insert (to mysql) statements
我對 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 的 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.