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。以下是我注意到的行为

  1. 我们的 RDS 实例上有两个数据库。一个用于 wordpress,一个用于我们的 laravel API。 Wordpress 数据库查询正在被很好地消化。但是来自我们 laravel 应用程序的查询 运行 不是。
  2. 出于某种原因,当我将 MySql Workbench 连接到 RDS 实例并在我们的 Laravel 数据库上执行查询时,它们会正常显示在语句摘要中。
  3. 我登录到我的 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)。如果驱动程序无法成功准备当前查询,它将始终回退到模拟准备好的语句。