尽管使用了数据库“文件”驱动程序,Laravel查询延迟和“会话”查询

时间:2015-08-13 23:54:30

标签: php mysql laravel laravel-5.1

我目前正在使用Laravel进行我正在进行的项目,并且我的Web服务器最近在页面加载时开始执行速度非常慢,因此每个页面最多可能需要8秒才能加载。

到目前为止,我已经确定缓慢不是由以下因素引起的:

  • DNS问题;当我直接导航到服务器的IP
  • 时出现问题
  • Apache问题;带有'PHPinfo()'的空白PHP文件立即加载
  • 负载;服务器的CPU使用率永远不会超过20%

按照上述步骤,问题只发生在实时环境中,我的开发环境没有任何延迟迹象。

在分析了一些缓存研磨日志后,我发现PDOStatement->execute调用似乎占用了最大的延迟时间。

然后我启用了long_query_time登录MySQL以进一步确定问题。我的调查结果显示,我的大多数查询都在快速执行,一秒钟之内;但是,我发现执行的任何site_session个查询最多需要6秒才能执行。

作为进一步的问题排查步骤,我尝试暂时将sessions驱动器更改为file而不是database;但是,我发现在每次加载页面后仍然执行以下查询:

# Time: 150813 23:37:12
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 3.035622  Lock_time: 0.000022 Rows_sent: 0  Rows_examined: 1
SET timestamp=1439509032;
update `site_sessions` set `payload` = 'YTo1OntzOjY6Il90b2tlbiI7czo0MDoibHk0YVo2MG16c09acTBTSnVnYUlJVTFNM0VrU3B2ekdiRFJyYmRzWiI7czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6MjY6Imh0dHA6Ly93d3cuY29ycGxlYWd1ZXMuY29tIjt9czo1OiJmbGFzaCI7YToyOntzOjM6Im9sZCI7YTowOnt9czozOiJuZXciO2E6MDp7fX1zOjM4OiJsb2dpbl84MmU1ZDJjNTZiZGQwODExMzE4ZjBjZjA3OGI3OGJmYyI7czoxOiIxIjtzOjk6Il9zZjJfbWV0YSI7YTozOntzOjE6InUiO2k6MTQzOTUwOTAyODtzOjE6ImMiO2k6MTQzOTQ5Nzc5MjtzOjE6ImwiO3M6MToiMCI7fX0=', `last_activity` = '1439509029' where `id` = 'ba62f70745c5455611c3fe3bf008fa213c22a7f9';
# Time: 150813 23:37:27
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 1.071487  Lock_time: 0.000026 Rows_sent: 0  Rows_examined: 1
SET timestamp=1439509047;
update `site_sessions` set `payload` = 'YTo1OntzOjY6Il90b2tlbiI7czo0MDoiOGhiVVVobTFjTERrU1ZXR25weTdMWHlQRlMzTmtkOWhIZzFSdHQ1QSI7czo5OiJfcHJldmlvdXMiO2E6MTp7czozOiJ1cmwiO3M6MjY6Imh0dHA6Ly93d3cuY29ycGxlYWd1ZXMuY29tIjt9czo1OiJmbGFzaCI7YToyOntzOjM6Im9sZCI7YTowOnt9czozOiJuZXciO2E6MDp7fX1zOjM4OiJsb2dpbl84MmU1ZDJjNTZiZGQwODExMzE4ZjBjZjA3OGI3OGJmYyI7czoxOiIxIjtzOjk6Il9zZjJfbWV0YSI7YTozOntzOjE6InUiO2k6MTQzOTUwOTA0NjtzOjE6ImMiO2k6MTQzOTUwNDQzODtzOjE6ImwiO3M6MToiMCI7fX0=', `last_activity` = '1439509046' where `id` = 'c3e95cf7c317ad340aa28c61bf323e008eaa5ff0';

任何人都可以对这个问题有所了解,或者同样地提供额外的故障排除步骤,以帮助我确定根本原因吗?

非常感谢任何反馈!

修改

以下是TABLE STATUS信息:

+--------------------------------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name                                             | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+--------------------------------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| site_sessions                                    | InnoDB |      10 | Compact    |   18 |            910 |       16384 |               0 |        16384 |  10485760 |           NULL | 2015-07-20 03:40:32 | NULL        | NULL       | utf8_unicode_ci |     NULL |                |         |
+--------------------------------------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+

我的session.php文件:

<?php
return [
    'driver' => env('SESSION_DRIVER'),
    'lifetime' => 320,
    'expire_on_close' => true,
    'encrypt' => false,
    'files' => storage_path().'/framework/sessions',
    'connection' => null,
    'table' => 'sessions',
    'lottery' => [2, 100],
    'cookie' => 'clgs_session',
    'path' => '/',
    'domain' => null,
    'secure' => false,
];

(注意:我已在SESSION_DRIVER中将file变量指定为.env,我也尝试在session.php中手动设置

最后,这是我的site_sessions表结构:

mysql> SHOW CREATE TABLE site_sessions;

 CREATE TABLE `site_sessions` (
   `id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
   `payload` text COLLATE utf8_unicode_ci NOT NULL,
   `last_activity` int(11) NOT NULL,
   `user_id` int(10) unsigned DEFAULT NULL,
   UNIQUE KEY `sessions_id_unique` (`id`),
   KEY `sessions_user_id_index` (`user_id`)
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

请注意,user_id字段是为了帮助我确定哪些用户与每个会话相关联,以便获取当前在线的用户列表。我从未遇到过这方面的问题。

我可以执行任何其他故障排除步骤来确定慢查询吗?

由于

0 个答案:

没有答案