欢迎各位兄弟 发布技术文章
这里的技术是共享的
经反复测试,是与管理员登录时与 AD 交互(可能是管理员登录时想往AD 里面写点东西),又因为 AD 有问题,所以导致登录时有时太慢
我的处理办法:

如果您的 Drupal 7 网站中管理员登录速度有时很慢,而普通用户的登录速度正常,可能是由以下几个原因造成的:
会话数据:管理员用户的会话数据可能会比普通用户更复杂,检查是否有会话存储的问题,特别是在使用数据库存储会话时。
后台模块负载:某些后台特定模块(如统计、日志模块等)可能在处理管理员请求时加重负担。尝试禁用不必要的后台模块。
权限配置:确保没有不必要的权限检查,某些复杂的权限逻辑可能会影响管理员的加载时间。
缓存设置:虽然普通用户的流量可能被很好地缓存,但管理员在访问时可能会跳过某些缓存,有效利用缓存可以减少加载时间。
反向代理和缓存服务:如果您使用 Varnish 或其他缓存解决方案,确保对管理员路径有适当的配置。
审核自定义代码:如果您的网站有自定义的模块或主题,检查是否有特定的处理影响到管理员的登录速度。
大型数据库记录:如果 Drupal 记录了大量的日志或审计信息,这可能会减慢管理员访问的性能。
索引缺失:确保数据库中适当的索引存在,以加快查询速度。
资源争用:管理员登录的高峰时段可能会导致服务器资源争用,检查服务器上的 CPU、内存等资源使用情况。
使用 VPN 或防火墙:如果管理员通过 VPN 或防火墙访问,可能会导致延迟。尝试不同的网络环境查看是否有不同的表现。
监控错误日志:在 admin/reports/dblog 检查是否有可能导致延迟的错误或警告信息。
使用性能监控工具:考虑使用如 New Relic 或 Blackfire 等工具来监控性能,找出具体的瓶颈。
禁用不必要的模块,特别是那些在管理员界面上的模块。
优化数据库,包括清理多余的日志表。
监控性能和后台请求,查看特定请求的响应时间。
定期清理缓存和会话。
通过上述步骤,您可以逐步 pinpoint 可能导致管理员登录速度不均的原因。如果问题依然存在,考虑与Drupal开发者合作寻求进一步帮助。
在使用 MySQL 时,如果遇到“General error: 2006 MySQL server has gone away”的错误,这通常表示 MySQL 服务器已关闭或者失去连接。以下是一些可能导致此错误的原因及其解决方法:
连接超时:
MySQL 服务器可能因为闲置时间过长而关闭了连接。
查询数据过大:
发送到 MySQL 的数据包大小超过了 max_allowed_packet 设置的限制。
服务器崩溃:
MySQL 服务可能因为某种原因崩溃或关闭,例如服务器内存不足。
网络问题:
如果MySQL运行在远程服务器上,可能存在网络问题导致连接中断。
慢查询:
执行时间过长的查询可能导致连接被关闭。
调整 wait_timeout 和 interactive_timeout:
sql
SET GLOBAL wait_timeout = 28800; -- 例如,设置为 8 小时 SET GLOBAL interactive_timeout = 28800; -- 例如,设置为 8 小时
这两个参数控制 MySQL 服务器关闭空闲连接的时间。可以通过在 MySQL 配置文件(通常是 my.cnf 或 my.ini)中增加这些值来减少超时。
增加 max_allowed_packet:
sql
SET GLOBAL max_allowed_packet = 16777216; -- 例如,设置为 16MB
也可以在 MySQL 配置文件中设置:
ini
[mysqld] max_allowed_packet = 16M
如果应用程序发送的数据包大小超过限制,您可以增加 max_allowed_packet 的大小:
检查 MySQL 日志:
查看 MySQL 错误日志,找出导致连接中断的更多信息。
优化 SQL 查询:
确保 SQL 查询不会因为性能问题而花费太长时间。使用索引、优化查询等手段来提高性能。
重启 MySQL 服务:
bash
# 对于 Linux 系统 sudo service mysql restart # 或 sudo systemctl restart mysql
如果 MySQL 服务崩溃,需要重启服务。可以通过以下命令重启:
应用程序处理:
在代码中处理连接丢失的情况,确保程序可以重新连接到数据库。在执行数据库查询时,可以增加重试机制。
检查网络配置:
如果 MySQL 在云环境下或使用了 VPN,确保网络连接稳定。
假设您在使用 PHP 与 MySQL 连接,您可能会在连接前添加以下代码来确保连接有效:
php
mysqli_report(MYSQLI_REPORT_ALL); // 显示所有错误 $link = mysqli_connect("hostname", "username", "password", "database"); if(!$link) { die("Connection failed: " . mysqli_connect_error()); } // 重新连接(可选) mysqli_options($link, MYSQLI_OPT_CONNECT_TIMEOUT, 3);
“A 2006 MySQL server has gone away” 错误可以有多个原因,解决的办法通常是调整服务器配置、优化查询,或考虑网络环境的影响。根据具体的应用场景进行相应的调整和优化,以减少或避免这样的错误。
您遇到的错误信息表明您的 Drupal 网站正在处理数据库查询时遇到了“MySQL server has gone away”错误。这通常是由以下几个原因导致的:
连接超时:
连接在操作间隔期间闲置时间过长,MySQL 会关闭连接。
包大小限制:
发送到 MySQL 的数据包大小超过了 max_allowed_packet 的设置。
MySQL 服务崩溃:
服务器可能因为内存不足或其他原因崩溃。
长查询操作:
执行的 SQL 查询可能花费的时间过长。
以下是一些建议,您可以尝试其中的一些来解决这个问题:
max_allowed_packet 修改 MySQL 配置文件(my.cnf 或 my.ini),增加 max_allowed_packet 的大小:
ini
[mysqld] max_allowed_packet = 16M # 或更高
重启 MySQL 服务:
bash
sudo service mysql restart # 或 sudo systemctl restart mysql
wait_timeout 和 interactive_timeout 在您的 MySQL 配置中,增加 wait_timeout 和 interactive_timeout 的值:
ini
[mysqld] wait_timeout = 28800 # 8小时 interactive_timeout = 28800 # 8小时
同样,需要重启 MySQL 服务以应用这些更改。
对于导致问题的 SQL 查询,考虑检查其执行时间,并考虑优化:
添加索引。
避免大数据集的查询。
使用 LIMIT 限制结果集的大小。
查看 MySQL 错误日志(通常位于 /var/log/mysql/error.log 或 /var/lib/mysql/ 下),以找到更详细的信息。
确保您的应用程序在处理数据库错误时能够适当处理和重新连接。如果使用 PDO,您可以通过捕获异常和重试连接来实现:
php
try { $pdo = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $password); } catch (PDOException $e) { if ($e->getCode() == 2006) { // 重新连接 } }
在 Drupal 中,特别是用于会话管理的表(如 sessions表)可能随着时间的推移变得庞大,从而可能影响性能。定期清理过期的会话数据可以减少表的大小。
如果可能,可以考虑使用持久连接,但请注意,如果配置不当,持久连接也可能导致其他问题。
以上步骤中的许多可能会致使“一般错误:2006 MySQL server has gone away”失败。请根据您特定的环境逐步实施并进行监测,以判断哪种解决方案最适合您。如果问题仍然存在,可能要进一步分析具体的数据库状态、网络状况和应用程序的负载情况。
执行了 1019 个查询,耗时 178 毫秒。超过 5 毫秒的查询已被高亮显示。页面执行时间为 109381.7 毫秒。使用的内存:devel_boot()=4.33 MB,devel_shutdown()=108.46 MB,PHP 峰值内存=127 MB。
109381.7 毫秒等于 109.38 秒。
要换算成秒,可以将毫秒数除以 1000:
所以,109381.7 毫秒约等于 109.38 秒。
要查找哪些页面在 Drupal 7 中执行时间较长,可以采取以下几种方法:
Devel 模块:如果您没有安装 Devel 模块,建议安装并启用它。Devel 模块提供了查询执行时间的详细信息。
在启用 Devel 后,可以在页面底部看到PAGE执行时间和查询数量等信息。
启用 MySQL 查询日志:您可以在 MySQL 配置中开启查询日志,这样可以记录下所有正在执行的查询。这在调试时可以提供有价值的信息。
在 MySQL 配置文件(如 my.cnf)中设置:
ini
[mysqld] general_log = 1 general_log_file = /var/log/mysql/mysql.log
重启 MySQL 后,您可以查看日志文件,分析慢查询。
使用 New Relic、Blackfire 或其他性能监控工具:这些工具提供了关于请求时间、数据库查询和应用程序性能的详细分析。
New Relic 可以监控具体页面的加载时间和其他性能指标。
分析 Web 服务器日志:可以查看 Apache 或 Nginx 的访问日志,分析响应时间。通过分析日志,可以找出那些执行时间较长的页面。
使用 awk 或 grep 命令可以帮助您筛选出执行时间较长的条目。
自定义模块:您可以编写一个自定义模块来记录页面加载时间。例如,您可以在 hook_init() 或 hook_page_load() 中记录开始时间和结束时间,写入日志文件或数据库。
php
function mymodule_init() { // 记录开始时间 $_SESSION['start_time'] = microtime(true); } function mymodule_page_footer() { // 记录结束时间 $end_time = microtime(true); $execution_time = $end_time - $_SESSION['start_time']; // 记录到日志 watchdog('performance', 'Page execution time: @time seconds', ['@time' => $execution_time]); }
使用 Xdebug 或 Tideways:这些 PHP 扩展可以帮助您识别应用程序的性能瓶颈,包括页面执行时间和数据库查询时间。
配置慢查询日志:通过启用 MySQL 的慢查询日志,您可以记录执行时间超过某个阈值的查询。
sql
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; -- 将时间设置为您希望的阈值(秒)。
结合使用上述工具和方法,您可以有效地找到哪些页面执行时间长,并进一步优化它们。如果发现特定的页面加载时间过长,尝试识别瓶颈,可能是数据库查询、外部请求、PHP 处理等,并着手优化。
drupal 7 网站 管理员 登录有时太慢,有时速度正常 ,但是普通用户登录速度是正常的
Drupal 7 网站在管理员登录时速度慢而普通用户登录正常的情况,可能由多个因素导致。以下是一些常见的可能原因及其解决方案:
数据库性能:检查数据库的性能,尤其是管理员界面使用的查询。可以使用模块或来检查慢查询。
缓存:确保缓存已正确配置。Drupal 7有多种类型的缓存,包括页面缓存、块缓存等,可以通过管理界面()进行设置。
叠加模块:某些模块可能会在管理员区域加载更多数据或执行更多操作,导致延迟。可以逐一禁用非核心模块测试是否改善速度。
权限配置:管理员用户通常比普通用户有更多的权限,导致在每次登录时需要加载更多的相关信息。检查用户角色和权限设置,确保权限配置合理。
额外的自定义代码:如果有自定义代码在每次用户登录时执行,可能会影响性能。审查相关的代码,确保没有引入性能瓶颈。
网络延迟:有时可能是由于网络延迟导致的登录速度慢。检查管理员登录时是否受网络问题影响,可以通过使用浏览器的开发者工具查看加载时间。
CDN(内容分发网络):如果使用CDN,确保设置正确,有时候对静态资源的加载可能会影响性能。
服务器资源:检查服务器的CPU、内存和其他资源,可能是服务器负载过高。使用工具如或监控服务器性能。
PHP和数据库设置:针对PHP和MySQL的配置(如,等)可能对性能有影响。可以根据实际情况进行相应调整。
检查错误日志:查看Drupal的日志()和服务器的PHP错误日志,看是否有相关的错误或警告信息。
开启调试模式:在中开启调试选项,观察是否有隐含的问题导致性能下降。
当管理员登录速度慢而普通用户正常时,通常要多方面排查。根据以上的建议逐一检查,定位性能瓶颈所在。如果问题依然存在,可能需要考虑使用性能分析工具(如或)来深入分析应用在登录时的性能表现。
如何在 settings.php
中开启调试选项
drupal Additional uncaught exception thrown while handling exception. Original PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: SELECT users.name AS name FROM {users} users WHERE (name LIKE :db_condition_placeholder_0 ESCAPE '\\') AND (status = :db_condition_placeholder_1) ; Array ( [:db_condition_placeholder_0] => admin [:db_condition_placeholder_1] => 0 ) in user_is_blocked() (line 846 of /www/web/bbbb_aaaa-ict_com/public_html/modules/user/user.module). Additional PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: SELECT ff.* FROM {filter_format} ff WHERE (status = :db_condition_placeholder_0) ORDER BY weight ASC; Array ( [:db_condition_placeholder_0] => 1 ) in filter_formats() (line 434 of /www/web/bbbb_aaaa-ict_com/public_html/modules/filter/filter.module). Uncaught exception thrown in session handler. PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away: SELECT 1 AS expression FROM {sessions} sessions WHERE ( (sid = :db_condition_placeholder_0) AND (ssid = :db_condition_placeholder_1) ); Array ( [:db_condition_placeholder_0] => JqRKSb0LfHjyXZ_UeJ7vOTmwPaexITSIZlcCUVM30KA [:db_condition_placeholder_1] => ) in _drupal_session_write() (line 209 of /www/web/bbbb_aaaa-ict_com/public_html/includes/session.inc).
在 Drupal 中遇到 “PDOException: SQLSTATE[HY000]: General error: 2006 MySQL server has gone away” 的错误通常指的是与 MySQL 数据库的连接问题。这个错误发生的原因可能包括数据库服务器资源不足、连接超时、查询超过了最大包大小或其他配置问题。以下是一些常见的解决方案和排查步骤:
和 :
这些变量定义了服务器在关闭连接之前等待的时间(以秒为单位)。如果你的请求在这个时间之后才执行完,连接会被关闭。你可以尝试增加这两个参数的值。
如果需要,可以使用以下命令将它们设置为更高的值(比如 300):
:
这是 MySQL 允许的最大包大小。如果你有大查询或数据插入,可能会超出此限制。可以通过执行以下命令查看当前值:
如果需要,可以使用以下命令设置更大的值(比如 16M 或更大):
保存数据库连接:
确保 Drupal 能够持久化数据库连接,来减少连接频繁建立的开销。在 中可以通过如下配置来开启持久化连接:
清除缓存:
清除 Drupal 的缓存,确保最新的更改能够生效。
内存限制:
如果 MySQL 使用的内存过高,可能会导致连接被关闭。检查服务器的内存和 CPU 使用情况,确保有足够的资源可用。
数据库负载:
监控数据库的运行状况,查看是否有高负载或长时间运行的查询。
:
如果使用文件存储会话,确保 Session 存储的最大生存时间足够长,避免因过期而导致连接被关闭。
错误日志:
查看 MySQL 和 Apache/nginx 的错误日志,以获得更多错误信息。
如果在使用特定模块(如会话模块、用户模块或过滤模块)时遇到这个问题,确保这些模块是最新版本,并检查是否有已知的兼容性问题。
排查自定义代码,确保没有在短时间内发出大量数据库请求,导致连接不稳定。
如果可能,考虑升级 MySQL 到最新版本,以获取性能和稳定性上的改进。
如果你是在共享主机上,考虑联系托管服务商,询问是否有配置限制或资源使用情况的问题。
这些步骤应该可以帮助你排查并解决 "MySQL server has gone away" 的问题。如果在实施这些建议后问题仍然存在,请考虑逐步禁用非核心模块,以诊断是否是特定模块造成的问题,并确保数据库和 Drupal 的配置都进行了必要的优化。
SHOW VARIABLES LIKE 'max_allowed_packet' 性能分析 [ 编辑 ] [ 创建 PHP 代码 ] [ 刷新 ] + 选项 Variable_name Value max_allowed_packet 1073741824 表示多少M
wdcp 中 mysql 的日志一般在哪里
drupal7 Executed 1019 queries in 178 ms. Queries exceeding 5 ms are highlighted. Page execution time was 109381.7 ms. Memory used at: devel_boot()=4.33 MB, devel_shutdown()=108.46 MB, PHP peak=127 MB.
根据您提供的信息,Drupal 7 的页面执行时间非常长(109381.7 ms),并且查询的总数为 1019 条。实际上,这表明可能存在严重的性能问题。以下是一些可能导致这种现象的原因以及相应的优化建议。
如果数据库查询执行时间较长,您会看到一些超过 5 ms 的查询。针对这些查询,可能需要进行优化:
检查数据索引:确保正在频繁使用的字段(如 和 中的条件)已经建立索引。索引可以显著提高查询性能。
使用性能分析工具:安装类似于 模块(如果尚未安装)以获得更详细的查询信息。 模块可以帮助您查看哪些查询执行得太慢。
慢查询日志:您可以在 MySQL 中启用慢查询日志,以识别哪些查询需要优化。
确保没有冲突的模块或者不必要的模块:
禁用不必要的模块:有时不必要的模块可能会执行额外的查询,导致页面加载速度慢。
审查自定义模块:确保自定义代码中没有性能问题,可能需要重构不必要的复杂查询。
Drupal 7 提供多种缓存机制以提升性能:
启用页面缓存:确保在 中启用了页面缓存和块缓存。
使用压缩缓存:在性能配置中,启用饥饿缓存以减少存储空间,从而提高性能。
确保您的服务器配置能够良好支持 Drupal 的需求:
PHP 和数据库的配置:检查 和 MySQL 的配置,确保它们配置得当,比如增加 PHP 的内存限制和 MySQL 的 和 。
服务器资源:确保服务器有足够的 CPU 和内存。使用工具(如 或 )监控实际资源使用情况。
清理内容:如果您有过多的内容或用户,清理不必要的内容(如删除旧的节点或用户)可能会有所帮助。
限制访问日志和会话数据:如果你已经启用了日志访问和会话数据,考虑定期清理。
使用内容分发网络(CDN):将静态资源托管在 CDN 上,减少服务器负担。
启用 OPcache:确保您的 PHP 环境启用了 OPcache 以缓存 PHP 字节码,从而加快执行速度。
定期清理缓存:定期清理 Drupal 的缓存可以确保系统保持高效。
数据库维护:定期执行数据库优化操作(如 )有助于保持数据库性能。
长时间的页面执行和大量查询的情况通常涉及多个方面。通过分析数据库查询、优化模块和代码、配置适当的缓存以及确保服务器资源充足,您可以显著改善 Drupal 7 网站的性能。采取上述措施后,记得重新测试性能,以评估优化的效果。
数据库 花费的时间比较少178 ms,,但是页面执行时间比较长 109381.7 ms
根据您提供的信息,数据库查询的执行时间相对较短(178 ms),而页面的总执行时间却非常长(109381.7 ms)。这意味着问题可能不仅仅是在数据库查询上,而是在其他方面,比如 PHP、Drupal 代码、网络请求、或者外部 API 调用等。
查看模板文件:如果你使用 Drupal 主题进行页面渲染,复杂的模板文件可能导致页面执行时间过长。优化模板的 HTML 渲染,减少不必要的PHP逻辑。
自定义代码问题:检查自定义的 PHP 代码、模块,特别是那些在 和 中的代码,确保没有冗余的操作。
模块的性能影响:某些模块可能在页面加载时执行太多计算或查询,导致页面加载延迟。尝试禁用不必要的模块以找出是否是某个模块导致的问题。
使用 模块检查性能:如果你没有使用 模块,可以考虑安装并启用它,使用 或 来检查哪些函数和模块耗时较长。
检查外部请求:如果页面加载时需要从外部 API 获取数据,这些请求可能会延迟页面显示。确保外部调用是异步执行的,或者使用缓存。
关闭或优化不必要的请求:如果某些外部 API 不是必需的,考虑将它们禁用或者缓存其返回结果,提高页面加载速度。
检查缓存设置:确保缓存机制已正确配置,并清理缓存。在 中,不仅要开启页面缓存,还要确保块缓存和视图缓存也是开启的。
考虑反向代理:使用 Varnish 或类似的反向代理服务器,可以显著提升网站的性能。
PHP 和 MySQL 配置:检查 PHP 的内存限制设置,确保其配置达到最优。可以在 中检查和设置以下参数:
监控服务器性能:使用 , 或 等工具查看CPU和内存使用情况。确保你的服务器在高负载情况下仍能正常工作。
并发请求:如果有多个并发请求,确保数据库和 PHP 能够处理这些流量,而不会造成延迟。
查看 Drupal 日志:使用 检查是否有错误或警告消息,这些信息可能指示出造成性能问题的根源。
PHP 错误日志:查看 PHP 错误日志(通常在 或类似位置)以获取有用的调试信息。
虽然数据库查询时间相对较短,但也可以定期进行数据库的清理和优化,以确保它在性能上是最佳的,如定期使用:
页面执行时间的长短可能由多种因素引起。通过对模板、代码、模块、外部请求和服务器配置的检查与优化,通常能够发现并解决问题。建议采用逐步测试的方法,禁用某些功能后再次评估页面性能,并寻找可能存在的瓶颈。
使用 dpm() 或 ddebug_backtrace() 示例
在 Drupal 7 中,如果你想要分析哪些函数执行时间较长,可以使用一些内置或第三方的工具来帮助进行性能分析。以下是一些常用的方法:
Devel 是一个非常强大的开发辅助模块,它提供了一系列工具来帮助开发者调试和优化代码。其中,devel_themer 和 devel_query 功能可以帮助你了解模板调用和数据库查询的性能情况。
安装 Devel 模块:
bash深色版本drush dl devel drush en devel -y
启用后,你可以在页面底部看到详细的执行时间、内存使用等信息。
使用 dpm() 或 dd() 函数可以输出变量信息,帮助你更细致地调试代码。
XHProf 是一个 PHP 性能分析工具,它可以生成函数级别的性能报告,非常适合用来找出执行时间长的函数。
安装 XHProf:
首先确保你的服务器上安装了 XHProf 扩展。
然后安装 Drupal 的 XHProf 模块,可以通过 Drush 进行安装:
bash深色版本drush dl xhprof drush en xhprof -y
使用 XHProf 模块后,你可以通过其提供的界面查看各个函数的执行时间和调用次数等详细信息。
Web Profiler 是另一个用于性能分析的模块,它提供了类似于 Symfony 的 Web 调试工具栏,可以直接在浏览器中显示请求的相关信息。
安装 Web Profiler 模块:
bash深色版本drush dl webprofiler drush en webprofiler -y
启用后,在页面底部会出现一个工具栏,点击可以查看到请求的概要信息,包括执行时间、内存消耗等。
虽然 Xdebug 主要是一个调试工具,但它也可以用来生成性能分析报告。
安装 Xdebug 并配置好相关设置。
使用 xdebug_start_trace() 和 xdebug_stop_trace() 函数来记录脚本的执行过程。
分析生成的 trace 文件,找出耗时较长的函数。
在生产环境中使用这些工具可能会对网站性能产生影响,因此建议仅在开发或测试环境中启用它们。
在使用任何性能分析工具之前,请确保已经备份了数据,并了解如何安全地使用这些工具。
通过上述方法之一,你应该能够有效地识别出在 Drupal 7 应用中执行时间较长的函数,并据此进行优化。