php连接不上mysql的原因有很多种常用的可能是函数没开启或mysql数据库配置有问题,下面我来给大家介绍php连接不上MySQL一些问题的分析与解决方法。
现象1
在PHP error log里发现:
PHP Warning: mysqli::mysqli(): (HY000/2003): Can’t connect to MySQL server on ‘XXX.XXX.XXX.XXX’ (99) in /u1/www/XXXX.php on line 10
PHP Warning: mysqli::close(): Couldn’t fetch mysqli in /u1/www/XXXX.php on line 11
推断:只有在高并发的环境下出现
诊断分析:
通过MySQL数据库上抓包,没发现异常。又把目标转到php 服务器上。
BTW:
linux开着selinux连接MySQL在测试中基本上属于1ms+,禁掉selinux后在0.96左右。selinux还是要禁掉的。
既然又怀疑是PHP的问题就写一个程序测试(禁掉selinux后):
cat tconn.php
代码如下 | 复制代码 |
function microtime_float() |
再次运行就开始大量的报错。
PHP Warning: mysqli::mysqli(): (HY000/2003): Can't connect to MySQL server on 'XXX.XXX.XXX.XXX' (99) in /u1/www/XXXX.php on line 10
PHP Warning: mysqli::close(): Couldn't fetch mysqli in /u1/www/XXXX.php on line 11
中止该程序后,通过
#strace php tconn.php 运行
得到:
connect(3, {sa_family=AF_INET, sin_port=htons(3308), sin_addr=inet_addr("XXX.XXX.XXX.XXX")}, 16) = -1 EADDRNOTAVAIL (Cannot assign requested address)
shutdown(3, 2 /* send and receive */) = -1 ENOTCONN (Transport endpoint is not connected)
看到这个大概明白是本地的网络可能注册不上了,也难怪在MySQL抓包看也正常。
看样子是本地tcp不能重用造成的。改一下在测试
代码如下 | 复制代码 |
sysctl -w net.ipv4.tcp_tw_reuse=1; |
在次测试问题不存在了。在这个上面碰了一下后顺便改一下/etc/sysctl.conf添加:
代码如下 | 复制代码 |
net.ipv4.tcp_max_syn_backlog = 819200 |
問題解決
現象2
MYSQL。mysql への接続をテストすると、「致命的なエラー: 未定義の関数 mysql_connect() への呼び出し」が表示されます。環境 j は、Windows XP SP2 en、apache2.2、mysql5.1rc.php5.28 です。 このプロンプトは、mysql に接続されているライブラリ ファイルに php がロードされていない可能性がありますか? Apache サーバーを起動した後、「php5ts.dll」と「libmysql.dll」を削除しようとしましたが、プロンプトが削除できないことを示しています。これら 2 つのライブラリ ファイルは、使用中のプログラムがロードされていることを示します (もちろん、テストにはさまざまな方法があります。たとえば、プログラム サービスによってロードされたすべてのライブラリ ファイルを表示するソフトウェアを使用できます)。ただし、AP は php.ini の設定に問題があるとも言いました。それでは、php.ini の設定には焦点を当てません。
php.ini が正しいという迷信はなく、最終的にこの行が .php.ini に欠落していることを発見しました
PHPINiDir「あなたのphpディレクトリ」
#(例: PHPIniDir "c:/php")
Apache サーバーを再起動し、インターネットで一般的に使用される方法を使用します
以下、引用内容です
$link=mysql_connect('localhost','ユーザー名','パスワード'); | |
それ以外の場合は「成功!」をエコーします; mysql_close(); ?> |
查1 まず、ネットワークの問題とファイアウォールの問題を確認します
これは必要です。MySQL サーバーにさえ接続できない場合、他に何にアクセスできるでしょうか。 確認方法は? Ping 192.168.0.11 ping が機能する場合は、Ping 192.168.0.11:3306 でポート 3306 がファイアウォールによってブロックされているかどうかを確認するか、問題がなければファイアウォールをオフにしてサービス iptables を停止する (Red Hat ) か、ufw disable (ubuntu) を実行します。このステップで次のステップを開始します:
2. アクセス権限があるか確認します
アクセス権について言えば、MySQL はユーザーを割り当てるときにホストを指定します。たとえば、私のホストは 192.168.0.5 として指定されており、このアカウントにアクセスできるのはこのマシンのみです。他のマシンがこのアカウントを使用してアクセスすると、プロンプトが表示されます。権限がありません。 host を % として指定すると、すべてのマシンがアクセスを許可されます。一般的に、セキュリティ上の理由から、最小特権の原則に従って、権限についてはあまり説明しません。その方法がわからない場合は、マニュアルをご確認ください。 権限に問題がないことを確認したら、次のステップに進みます:
3. MySQL の構成を確認するには
MySQL の設定ファイルを確認します。Linux では my.cnf と呼ばれ、Windows では my.ini という設定項目を確認します。
マニュアルからの引用: バインド先の IP アドレス。このオプションが複数回指定された場合、指定された最後のアドレスが使用されます。アドレスが指定されていないか、0.0.0.0 が指定されている場合、サーバーはすべてのインターフェイスで待機します。
バインドされた IP は 1 つの IP にのみバインドできます。複数の IP がバインドされている場合は、最後にバインドされた IP が優先されます。バインディングがない場合、またはバインディング 0.0.0.0 の場合、サーバーはすべてのクライアントをリッスンします。
一度、この問題を解決するために午後を費やしましたが、ネットワーク接続を確認したところ、アクセス許可は問題ありませんでしたが、クライアントは接続できませんでした。マニュアル、分かりました。 ご不明な点がございましたら、マニュアルをもっと読んでください