Laravel API 的 mysql 查询未在 performance_schema.events_statements_summary_by_digest 中得到跟踪
Laravel API's mysql queries not getting tracked in performance_schema.events_statements_summary_by_digest
我在这里遇到了一些非常奇怪的问题。我们有一个 laravel API 托管在 AWS EC2 上,我们使用 RDS (mysql 5.6)。我最近在 RDS 上启用了 performance_schema。以下是我注意到的行为
- 我们的 RDS 实例上有两个数据库。一个用于 wordpress,一个用于我们的 laravel API。 Wordpress 数据库查询正在被很好地消化。但是来自我们 laravel 应用程序的查询 运行 不是。
- 出于某种原因,当我将 MySql Workbench 连接到 RDS 实例并在我们的 Laravel 数据库上执行查询时,它们会正常显示在语句摘要中。
- 我登录到我的 EC2 机器,连接到 RDS 上的 MySQL 并执行了一些查询,它们在语句摘要中被跟踪。
所以看起来只有当从我们的 Laravel 应用程序执行查询时,它们才不会被跟踪。
我们的 Laravel 版本是 4.2。我试图找出最近两天的原因,任何帮助都会让我松一口气。
我在上述所有步骤中使用的用户都是相同的,并且拥有所有数据库的所有权限。
--编辑--
我做了很多其他测试,他们都只指出一个结论,它与Laravel有关。我在托管 laravel 的同一台服务器上创建了一个简单的 php 文件。在此文件中,我使用相同的 user/password 连接到相同的 instance/database。我在这个文件中所做的唯一一件事就是 运行 像这样对 $pdo 进行非常简单的查询。
$stmt = $pdo->query('SELECT name FROM trades');
while ($row = $stmt->fetch())
{
echo $row['name'] . "\n";
}
它出现在查询分析中 [https://prnt.sc/j3ochd](我也手动检查了 performance_schema.events_statements_summary_by_digest)
但是我可以点击我们的 laravel api 这实际上 returns 来自交易 table 本身的条目(非常像我 运行 的查询多于)。但这会出现在我的查询分析报告 (Percona PMM) 或 events_statements_summary_by_digest
中
您必须在数据库 > 连接设置中将 options
参数传递为 PDO::ATTR_EMULATE_PREPARES => true
配置 > database.php
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
'options' => [
PDO::ATTR_EMULATE_PREPARES => true
]
],
]
默认情况下 laravel 将此选项标记为 PDO::ATTR_EMULATE_PREPARES => false
以提高查询性能。
这是关于它的快速详细信息。
PDO::ATTR_EMULATE_PREPARES 启用或禁用准备好的语句的模拟。某些驱动程序不支持本机准备好的语句或对它们的支持有限。使用此设置强制 PDO 始终模拟准备好的语句(如果驱动程序支持 TRUE 和模拟准备),或者尝试使用本机准备好的语句(如果 FALSE)。如果驱动程序无法成功准备当前查询,它将始终回退到模拟准备好的语句。
我在这里遇到了一些非常奇怪的问题。我们有一个 laravel API 托管在 AWS EC2 上,我们使用 RDS (mysql 5.6)。我最近在 RDS 上启用了 performance_schema。以下是我注意到的行为
- 我们的 RDS 实例上有两个数据库。一个用于 wordpress,一个用于我们的 laravel API。 Wordpress 数据库查询正在被很好地消化。但是来自我们 laravel 应用程序的查询 运行 不是。
- 出于某种原因,当我将 MySql Workbench 连接到 RDS 实例并在我们的 Laravel 数据库上执行查询时,它们会正常显示在语句摘要中。
- 我登录到我的 EC2 机器,连接到 RDS 上的 MySQL 并执行了一些查询,它们在语句摘要中被跟踪。
所以看起来只有当从我们的 Laravel 应用程序执行查询时,它们才不会被跟踪。
我们的 Laravel 版本是 4.2。我试图找出最近两天的原因,任何帮助都会让我松一口气。
我在上述所有步骤中使用的用户都是相同的,并且拥有所有数据库的所有权限。
--编辑--
我做了很多其他测试,他们都只指出一个结论,它与Laravel有关。我在托管 laravel 的同一台服务器上创建了一个简单的 php 文件。在此文件中,我使用相同的 user/password 连接到相同的 instance/database。我在这个文件中所做的唯一一件事就是 运行 像这样对 $pdo 进行非常简单的查询。
$stmt = $pdo->query('SELECT name FROM trades');
while ($row = $stmt->fetch())
{
echo $row['name'] . "\n";
}
它出现在查询分析中 [https://prnt.sc/j3ochd](我也手动检查了 performance_schema.events_statements_summary_by_digest)
但是我可以点击我们的 laravel api 这实际上 returns 来自交易 table 本身的条目(非常像我 运行 的查询多于)。但这会出现在我的查询分析报告 (Percona PMM) 或 events_statements_summary_by_digest
中您必须在数据库 > 连接设置中将 options
参数传递为 PDO::ATTR_EMULATE_PREPARES => true
配置 > database.php
'connections' => [
'mysql' => [
'driver' => 'mysql',
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'unix_socket' => env('DB_SOCKET', ''),
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => false,
'engine' => null,
'options' => [
PDO::ATTR_EMULATE_PREPARES => true
]
],
]
默认情况下 laravel 将此选项标记为 PDO::ATTR_EMULATE_PREPARES => false
以提高查询性能。
这是关于它的快速详细信息。
PDO::ATTR_EMULATE_PREPARES 启用或禁用准备好的语句的模拟。某些驱动程序不支持本机准备好的语句或对它们的支持有限。使用此设置强制 PDO 始终模拟准备好的语句(如果驱动程序支持 TRUE 和模拟准备),或者尝试使用本机准备好的语句(如果 FALSE)。如果驱动程序无法成功准备当前查询,它将始终回退到模拟准备好的语句。