修复 Magento 2 中的死锁问题
死锁问题是 Magento 2 上最大和最难解决的问题之一,每个 Magento 开发人员迟早都会遇到它。一旦您开始搜索如何解决 Magento 中的死锁问题,您将很难找到最终的答案。
1.测量产品节省执行时间
为此,请在 Magento 2 根目录中创建脚本文件夹。然后使用以下代码将test.php文件添加到其中:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
use Magento\Framework\App\Bootstrap;
require __DIR__ . '/../app/bootstrap.php';
$bootstrap = Bootstrap::create(BP, $_SERVER);
$obj = $bootstrap->getObjectManager();
$state = $obj->get(Magento\Framework\App\State::class);
$state->setAreaCode('adminhtml');
$startTime = microtime(true);
$productRepo = $obj->get(Magento\Catalog\Api\ProductRepositoryInterface::class);
$product = $productRepo->getById(39);
$product->setName($product->getName() . ' - test');
$product->setStoreId(0);
$productRepo->save($product);
$endTime = microtime(true);
$executionTime = ($endTime - $startTime);
echo " Execution time of script = ".$executionTime." sec";
?>
然后运行php scripts/test.php以测量通过产品存储库保存一个产品所需的时间。
Magento 2.4.4 上,它需要不到一秒的时间。对于常规 Magento 2 商店,可接受的值最多为 2 秒。
如果产品保存在 2 秒内执行,您可以跳过此部分并转到下一部分。
如果您需要找出导致此问题的扩展名,最简单的方法是:
- 禁用所有第三方Magento 2 扩展并测量保存产品所需的时间。
- 将所有扩展一一启用,衡量产品保存速度。
为每个扩展逐步执行此操作,您会发现哪个扩展对您的性能影响最大。
2.检查数据库配置
Magento 建议使用以下数据库配置以获得更好的性能。因此,如果您遇到 Magento 死锁问题,请检查一下。
您可能还面临以下问题:
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction, query was...
您可以尝试更改app/etc/env.php文件中的锁定节点并更改内部配置节点中的前缀。
<?php
return [
'lock' => [
'provider' => 'db',
'config' => [
'prefix' => 'new-prefix-here'
]
]
];
然后只需重置索引器并尝试再次重新索引。
3. 监控 Cron 执行
如果在执行 cron 作业期间发生 Magento 死锁问题,我们强烈建议安装一些 Magento 2 cron 计划扩展。
它们允许您查看 cron 作业执行图表并更改 cron 作业计划以减少对 CPU 的影响以及同时对数据库的请求数。
如果您发现同时执行了一些扩展进程(超过 10 分钟),请尝试重新安排它们以平均分配负载。