我继续解释这个问题和场景,就我有限的知识而言,这有点复杂。
最初我以为这是与我的脚本和查询的性能相关的一些问题,因此我用西班牙语在网站上创建了这篇文章:关联
但经过整个下午的研究,我决定将这一切归咎于我的开发环境配置错误。
我正在使用两个设备服务器:
当地的:
- Windows 10
- Laragon 服务器
发展:
- Ubuntu 20.04
- 微软XAMPP
在这种情况下,我将重点关注当地的:
我已经配置了 laragon 堆栈以支持虚拟主机并运行 2 个版本的 PHP(7.2 / 7.4)我遵循以下 2 个指南:链接 1和链接 2
我的Apache配置:
Define SRVROOT "C:/laragon/bin/apache/httpd-2.4.47-win64-VS16"
ServerRoot "C:/laragon/bin/apache/httpd-2.4.47-win64-VS16"
Listen 80
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule actions_module modules/mod_actions.so
LoadModule alias_module modules/mod_alias.so
LoadModule allowmethods_module modules/mod_allowmethods.so
LoadModule asis_module modules/mod_asis.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule cgi_module modules/mod_cgi.so
LoadModule dir_module modules/mod_dir.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule include_module modules/mod_include.so
LoadModule isapi_module modules/mod_isapi.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule mime_module modules/mod_mime.so
LoadModule negotiation_module modules/mod_negotiation.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule ssl_module modules/mod_ssl.so
LoadModule version_module modules/mod_version.so
<IfModule unixd_module>
User daemon
Group daemon
</IfModule>
ServerAdmin [email protected]
ServerName Laragon
<Directory />
AllowOverride none
Require all denied
</Directory>
DocumentRoot "C:/laragon/www"
<Directory "C:/laragon/www">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride None
Require all granted
</Directory>
<IfModule dir_module>
DirectoryIndex index.html index.php
</IfModule>
<Files ".ht*">
Require all denied
</Files>
ErrorLog "logs/error.log"
LogLevel error
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access.log" common
</IfModule>
<IfModule alias_module>
ScriptAlias /cgi-bin/ "${SRVROOT}/cgi-bin/"
</IfModule>
<IfModule cgid_module>
#
# ScriptSock: On threaded servers, designate the path to the UNIX
# socket used to communicate with the CGI daemon of mod_cgid.
#
#Scriptsock cgisock
</IfModule>
<Directory "${SRVROOT}/cgi-bin">
AllowOverride None
Options None
Require all granted
</Directory>
<IfModule headers_module>
RequestHeader unset Proxy early
</IfModule>
<IfModule mime_module>
TypesConfig conf/mime.types
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
</IfModule>
# Configure mod_proxy_html to understand HTML4/XHTML1
<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>
<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule>
AcceptFilter http none
AcceptFilter https none
EnableSendfile Off
EnableMMAP Off
IncludeOptional "C:/laragon/etc/apache2/alias/*.conf"
IncludeOptional "C:/laragon/etc/apache2/sites-enabled/*.conf"
Include "C:/laragon/etc/apache2/httpd-ssl.conf"
Include "C:/laragon/etc/apache2/mod_php.conf"
ScriptAlias /php72 "C:/laragon/bin/php/php72"
Action application/x-httpd-php72-cgi /php72/php-cgi.exe
<Directory "C:/laragon/bin/php/php72">
AllowOverride None
Options None
Require all denied
<Files "php-cgi.exe">
Require all granted
</Files>
</Directory>
虚拟主机:
<VirtualHost *:80>
DocumentRoot "D:/webdev/Local/test1/"
ServerName test1.me
ServerAlias *.test1.me
<Directory "D:/webdev/test1/">
AllowOverride All
Require all granted
</Directory>
<FilesMatch "\.php$">
SetHandler application/x-httpd-php72-cgi
</FilesMatch>
</VirtualHost>
phpmyadmin 的别名
Alias /phpmyadmin "C:/laragon/etc/apps/phpMyAdmin/"
<Directory "C:/laragon/etc/apps/phpMyAdmin/">
Options Indexes FollowSymLinks MultiViews
AllowOverride all
Require local
</Directory>
MySQL 配置
[client]
#password=your_password
port=3306
socket=/tmp/mysql.sock
[mysqld]
port=3306
socket=/tmp/mysql.sock
key_buffer_size=512M
max_allowed_packet=4096M
table_open_cache=256
sort_buffer_size=32M
read_buffer_size=32M
read_rnd_buffer_size=32M
myisam_sort_buffer_size=128M
thread_cache_size=16
secure-file-priv=""
explicit_defaults_for_timestamp=1
datadir= "C:/laragon/data/mysql"
lower_case_table_names=2
sql_mode=""
wait_timeout=28800
interactive_timeout=28800
[mysqldump]
quick
max_allowed_packet=4096M
两个版本 (7.2/7.4) 的 PHP 配置
file_uploads = On
upload_max_filesize = 4096M
max_file_uploads = 100
allow_url_fopen = On
memory_limit = 3G
post_max_size = 600M
max_execution_time = 5000
max_input_time = 5000
max_input_vars = 5000
date.timezone= America/Panama
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
html_errors = On
session.gc_maxlifetime = 2592000
session.cache_expire = 2592000
如您所见,我默认使用 apache handler 2.0 提供 php 7.4;我使用别名提供 php 7.2。
- phpmyadmin => php 7.4 Apache 处理程序 2.0
- test1.me => php 7.2 CGI/FastCGI
MySQL的错误日志:
2021-10-02T04:26:59.472441Z 35 [Note] Aborted connection 35 to db: avipac_dbproducts' user: 'root' host: 'localhost' (Got an error writing communication packets)
Apache 的错误日志:
[Fri Oct 01 23:22:17.806390 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] Script timed out before returning headers: php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:23:43.661155 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] AH01215: PHP Fatal error: Allowed memory size of 3221225472 bytes exhausted (tried to allocate 20480 bytes) in D:\\webdev\\Local\\test1\\control\\classgeneric\\class.managerdb.php on line 111: C:/laragon/bin/php/php72/php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:23:43.676759 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] AH01215: PHP Fatal error: Allowed memory size of 3221225472 bytes exhausted (tried to allocate 65536 bytes) in Unknown on line 0: C:/laragon/bin/php/php72/php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:23:43.676759 2021] [cgi:error] [pid 3808:tid 1108] [client 127.0.0.1:61857] AH01215: PHP Fatal error: Allowed memory size of 3221225472 bytes exhausted (tried to allocate 24576 bytes) in Unknown on line 0: C:/laragon/bin/php/php72/php-cgi.exe, referer: http://test1.me/
[Fri Oct 01 23:24:59.451291 2021] [cgi:error] [pid 3808:tid 1104] [client 127.0.0.1:53918] Script timed out before returning headers: php-cgi.exe, referer: http://test1.me/
我绝对接受对于 Windows 上的本地环境来说,mysql 查询相对较大;但问题是,相同的查询由 apache handler 2.0 和 php 7.4 在不到 1 秒的时间内执行...但在 CGI/FastCGI 中,当达到超时(180 秒/3 分钟)时它会停止...我曾巧妙地为 FastCGI 和 Apache Handler 2.0 设置了相同的设置,但没有成功,因为一个失败了,而另一个没有。
当然,当然,这就是为什么我的一个疑问是他们告诉我在我的设置中我需要什么配置来改进 FastCGI。这是我主要忽略的。(在哪里、如何和什么)。
可能有人会告诉我,在我的设置中,我需要哪些配置来改进 FastCGI。这是我主要忽略的。(在哪里、如何以及什么)我真的不明白为什么我不能让 Fast CGI 至少不会中断并像 Apache 那样工作……
我不知道哪里出了问题,我需要什么或者如何解决这些错误...我知道 CGI/FastCGI 需要很长时间并且消耗大量内存,但我不知道为什么它不工作并且 Apache Handler 正常工作
或者是否存在任何方法来代理 Apache Handler 2.0,而不是通过 FastCGI 别名使用 php-cgi?
说明性图像 Apache 处理程序 2.0:
CGI/快速CGI:
更新 #1
我找到这个配置文件: 注意:我假设这个配置文件很重要;但我不知道它的功能,也不知道应该添加、删除或修改什么才能让 FastCGI 表现得像 Apache Handler 2.0。
LoadModule fcgid_module "C:/laragon/etc/apache2/modules/mod_fcgid-2.3.10-win64-VS16.so"
<IfModule fcgid_module>
FcgidInitialEnv PATH "C:/laragon/bin/php/php74;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;"
FcgidInitialEnv SystemRoot "C:/Windows"
FcgidInitialEnv SystemDrive "C:"
FcgidInitialEnv TEMP "C:/Windows/Temp"
FcgidInitialEnv TMP "C:/Windows/Temp"
FcgidInitialEnv windir "C:/Windows"
# 10 hrs: in case you have long running scripts, increase FcgidIOTimeout
FcgidIOTimeout 36000
FcgidIdleTimeout 36000
FcgidProcessLifeTime 36000
FcgidBusyTimeout 36000
FcgidConnectTimeout 3600
FcgidMaxRequestsPerProcess 0
FcgidMaxProcesses 50
FcgidMaxRequestLen 81310720
# Location php.ini:
# FcgidInitialEnv PHPRC "C:/laragon/bin/php/php74"
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 0
<Files ~ "\.php$>"
AddHandler fcgid-script .php
Options +ExecCGI
FcgidWrapper "C:/laragon/bin/php/php74/php-cgi.exe" .php
</Files>
</IfModule>
答案1
错误告诉你这是 PHP(版本 7.2,现已停产,修复它!)试图超出其分配的内存限制。
如果脚本被终止尽管与数据库对话(mysql 日志让我这么认为),那么也许您的一个数据库查询(不一定是最后一个!)返回了一个意外的大结果集,不适合 php 脚本允许的内存?
检查查询日志,手动执行查询并查看
- 如果合适:那么你想分配更多资源或者:
- 如果其中一个不必要地大:那么您需要改进查询它们的应用程序或清理不必要的行以减少资源使用。
如果是前者,请记住,大多数系统都设置为针对不同的部署选项具有单独的 php 配置。这可能包括不同的内存限制或可用的扩展。由于您有多个不同的部署,因此 cgi、cli、fpm、apache2-mod 等所使用的 php.ini 文件可能不同 - 如果有疑问,请让您的脚本打印 phpinfo() 以确认有效的配置。