我有两台服务器,一台是运行apache和php的网络服务器,另一台是带MySQL的数据库服务器。第一个使用第二个数据库,每天24小时,每周7天。
问题是最近有时候每天都会出现错误,PHP应用程序会在下面显示以下消息:
Can't connect to MySQL server on 'IP_DO_BANCO_DE_DADOS' (4)
我们的网络服务器中有一些PHP应用程序。其中一个应用程序(遗留)不使用任何框架,并使用PHP本机连接到MySQL:
function AbreBD($mysqli = false) {
global $conexao, $selecao, $conexao_mysqli;
$servidor = '192.168.101.20:3306';
$usuarioBD = 'user';
$senhaBD = 'user';
$conexao = mysql_connect($servidor, $usuarioBD, $senhaBD);
$selecao = mysql_select_db("bioextratus", $conexao);
if ($mysqli) {
$conexao_mysqli = new mysqli($servidor, $usuarioBD, $senhaBD, "bioextratus");
}
}
记住上面的代码是针对遗留应用程序的,并且仍然使用mysql驱动程序而不是mysqli。即使在使用codeigniter框架的最现代应用程序中,也会出现此问题。
我相信问题是MySQL配置或网络问题,尽管MySQL服务始终可用,以及两台服务器之间的通信。
MySQL服务器文件my.cnf的内容是(无评论):
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
skip-external-locking
explicit_defaults_for_timestamp = false
open_files_limit = 102400
bind-address = 0.0.0.0
key_buffer = 16M
key_buffer_size = 512M
innodb_buffer_pool_size = 256M
innodb_additional_mem_pool_size = 8M
max_allowed_packet = 16M
thread_stack = 196K
thread_cache_size = 8
myisam-recover-options = BACKUP
query_cache_limit = 64M
query_cache_type = 1
query_cache_size = 256M
max_connections = 1024
max_user_connections = 0
sort_buffer_size = 2M
join_buffer_size = 1M
tmp_table_size = 64M
max_heap_table_size = 18M
log_error = /var/log/mysql/error.log
expire_logs_days = 10
max_binlog_size = 100M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[isamchk]
key_buffer = 12M
答案 0 :(得分:1)
对于初学者来说,AbreDB功能有点可疑。
IF 该函数被指示使用MySQLI,它首先建立一个MySQL连接。应该有一个if / else构造,以确保每次调用函数时只建立一个DB连接。另见下面的“单身人士”建议。
鉴于存在此错误,您还应该检查应用程序是否明智地使用mysql_close()或其等价物 - 可能是因为流量增加,MySQL服务器会保持连接打开直到超时(这通常不会太长,但可能会有所作为)。应用程序通常应在使用数据库后调用close()。
根据应用程序的性质,您可能希望使用永久连接(mysql_pconnect()是旧版本)。例如,如果对单个Web资源的调用打开了几个连接以完成页面,则会显示这一点,这是许多PHP程序中的常见错误,这些错误并非真正建立在扩展之上。再次,请参阅Singleton建议,并尝试确保脚本/应用程序使用公共数据库连接,而不是打开它们helter-skelter。
所有这一切,你可能会做一些其他的事情来看看问题是否可以缓解:
尝试启用MySQL的慢查询日志,看看是否有查询 应优化/重写。
尝试在my.cnf中增加max_connections。
了解“单身人士”模式并在您的身份中强制使用它 应用程序的数据库连接器类。