无法连接到IP服务器上的MySQL服务器(4)

时间:2015-02-26 21:12:03

标签: php mysql codeigniter mysqli

我有两台服务器,一台是运行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

1 个答案:

答案 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。

  • 了解“单身人士”模式并在您的身份中强制使用它 应用程序的数据库连接器类。