【问题标题】:mysqli connect problemmysqli连接问题
【发布时间】:2018-08-28 22:06:48
【问题描述】:

这很奇怪。我有 2 个 centos 盒子,prod (192.168.0.1) 和 vm (192.168.0.30)。 Mysql 数据库位于产品上。 应用程序位于虚拟机上。 从 vm,如果我输入

mysql -u user -p -h 192.168.0.1 -D mydb

它连接得很好,所以端口是开放的并且正在监听 prod 但在应用程序中,我会这样做

$db=new mysqli('192.168.0.1','user','mypass','mydb');

我得到了

Warning: mysqli::mysqli() [function.mysqli-mysqli]: (HY000/2003): Can't connect to 
MySQL server on '192.168.0.1' (13) in /var/www/vhosts/myapp/httpdocs/dstest.php 
on line 123

两个盒子都有完全相同的版本 php, mysql, mysql.so, mysqli.so

有什么建议吗?

附:如果我尝试 $db=new mysqli('127.0.0.1',... 但如果我尝试 $db=new mysqli('localhost',...

如果有帮助,这里是 prod 上的 my.cnf:

[mysqld]
set-variable=local-infile=0
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

max_connections = 500
max_user_connections = 150

key_buffer = 2048M

query_cache_limit=4M
query_cache_size=64M
table_cache=2048
tmp_table_size=64M
max_heap_table_size = 256M

# users buffers
sort_buffer_size=2M
read_buffer_size=2M
read_rnd_buffer_size=1M

max_allowed_packet=16M

thread_cache=16
thread_concurrency=8
thread_cache_size=128
innodb_buffer_pool_size = 128M
myisam_sort_buffer_size = 128M

wait_timeout = 240
interactive_timeout = 240
max_allowed_packet=32M

[mysql.server]
user=mysql
basedir=/var/lib

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

【问题讨论】:

  • 你试过检查你的防火墙吗?也许规则会阻止虚拟机。
  • 如果我可以在命令行上做,就不能成为防火墙,可以吗?

标签: php mysqli centos


【解决方案1】:

检查here。它看起来与您的问题非常相似。

编辑:为后代添加博客内容:

SQLSTATE[HY000] [2003] Can’t connect to MySQL server on ‘xxx.xxx.xxx.xxx’ (13)

我希望在尝试搜索时能更快地在 Google 中找到的东西之一 找出为什么 PHP 脚本拒绝连接到远程 MySQL 服务器 发出错误 SQLSTATE[HY000][2003]Can't connect to MySQL server on 'xxx.xxxx.xxx.xxx' (13)

我可以从本地 shell 连接,所以首先想到的是 最近的 Zend Framework 升级出了点问题,但过了一段时间 我发现答案很简单——SELinux 阻止了远程 来自 Apache Web 服务器执行的 PHP 脚本的连接。错误 错误消息末尾的代码(13)表示“权限被拒绝”,所以 这表明您是否有类似的问题。

无论如何,以root身份登录并执行setsebool -P httpd_can_network_connect=1 让它发挥作用。

当然,请三思而后行,因为您使 Web 服务器的安全性降低了一点, 所以除非你确定你需要它,否则不要这样做。

【讨论】:

  • 先生,您是一位绅士和一位学者。这正是问题所在,建议的修复很有魅力。谢谢。
  • 不知道为什么,但突然间我也不得不用我的 centos 7 来做这个
  • 澄清...在 WEB SERVER 上执行此命令。 @Matthew Herbst 提到了这一点,但没有明确表示。我先在数据库服务器上做了,没有解决任何问题。
【解决方案2】:

如果该服务器是本地的,那么先试试这个:

$db=new mysqli('localhost','user','mypass','mydb'); 

而不是

$db=new mysqli('192.168.0.1','user','mypass','mydb');

这对我有用。

【讨论】:

    【解决方案3】:

    通过运行以下命令通过命令行重新启动 mysql 服务:

    service mysql restart

    【讨论】:

    • 嘿 - 欢迎来到 stackoverflow!回答中的更多细节将有助于提问者和其他人理解您的解决方案。例如,包含 为什么 它会起作用而不是仅仅如何解决它呢?此外,一些额外的格式也不会出错。你可以把东西放在code blocks中,用4个空格缩进。
    猜你喜欢
    • 2013-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多