ホームページ  >  記事  >  データベース  >  PHP プログラム mysql エラー mysql が消えてしまいました

PHP プログラム mysql エラー mysql が消えてしまいました

小云云
小云云オリジナル
2018-03-14 15:49:033642ブラウズ


この記事では、主に、メモリ常駐の PHP プログラム mysql エラーについて説明します。cli 環境では、PHP プログラムは長時間実行する必要があり、クライアントとクライアントの間の TCP 接続が失われています。 MySQLサーバーが不安定です。

不安定の理由は次のとおりです:

  • MySQL サーバーは一定の時間内に接続を自動的に切断します

  • PHP プログラムがアイドル期間に遭遇し、MySQL クエリがない場合長い間、MySQL サーバーもリソースをリサイクルするために接続を切断します

  • 他の場合には、MySQL サーバーで kill プロセスを実行して接続を強制終了し、MySQL サーバーが再起動します

  • ネットワークジッター

このとき、PHPプログラム内のMySQL接続は無効になります。 mysql_query がまだ実行されている場合は、エラー MySQL サーバーが消えました が報告されます。プログラムがそれを処理できない場合、プログラムは直接致命的なエラーに遭遇して終了します。したがって、PHP プログラムは切断して再接続する必要があります。 MySQL server has gone away的错误。程序处理不到就直接遇到致命错误并退出了。所以PHP程序中需要断线重连。

解决方案

mysql_ping

有很多人提出了mysql_ping的方案,每次mysql_query进行连接检测或者定时连接检测。

这个方案不是最好的。原因是:mysql_ping需要主动侦测连接,带来了额外的消耗。定时执行mysql_ping不能解决问题,如刚刚执行过mysql_ping检测之后,连接就关闭了;

捕获错误码,进行断线重连

它的原理是:mysql_query执行后检测返回值,如果mysql_query返回失败,检测错误码发现为2006/2013(这2个错误表示连接失败),再执行一次mysql_connect执行mysql_connect后,重新执行mysql_query如果mysql_query返回成功,那么连接是有效的,这是一次正常的调用。

众多知名的PHP常驻进程框架

  • swoole_framework中query方法。

$res = mysql_query($sql, $this->conn);if ($res === false)
{    if (mysql_errno($this->conn) == 2006 or mysql_errno($this->conn) == 2013)
    {        $r = $this->checkConnection();        if ($r === true)
        {
            continue;
        }
    }
  • workerman中数据库连接类execute方法。

  protected function execute($query, $parameters = "")
    {        try {            ...
        } catch (PDOException $e) {
            // 服务端断开时重连一次            if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) {
                $this->closeConnection();
                $this->connect();            ...
        }
    }

很明显捕获错误码,进行断线重连,是高可靠低消耗的方案,推荐大家在常驻环境里使用。

thinkphp + phpworkman 使用

TP+workman也会出现类似的情况,TP从 V5.0.6+版本开始,支持Mysql的断线重连机制,默认关闭,需要的话,在application/databases.php

解決策

mysql_ping

mysql_query が接続検出または接続のタ​​イミングを実行するたびに、mysql_ping の解決策を多くの人が提案しています。検出。

この解決策は最善のものではありません。その理由は、mysql_ping が接続をアクティブに検出する必要があるため、追加の消費が発生するためです。 mysql_ping を定期的に実行しても問題は解決できません。たとえば、mysql_ping テストを実行しただけでは接続が閉じられます。

エラー コードを取得して切断し、再接続します。 /h4 >
原理は次のとおりです。mysql_query は実行後の戻り値を検出します。mysql_query が返らない場合、エラー コードは 2006/2013 であることがわかります。これら 2 つのエラーは接続に失敗したことを示します)mysql_connect を実行した後、mysql_query の場合は <code>mysql_query を再実行します。 が成功を返した場合、接続は有効であり、これは通常の呼び出しです。

多くのよく知られた PHP 常駐プロセス フレームワーク

swoole_framework のクエリ メソッド。

🎜🎜
// 开启断线重连&#39;break_reconnect&#39; => true,
🎜🎜🎜workermanのデータベース接続クラスのメソッドを実行します。 🎜🎜🎜rrreee🎜エラーコードをキャプチャして切断し、再接続することは明らかであり、信頼性が高く、低コストのソリューションです。永続的な環境で使用することをお勧めします。 🎜

thinkphp + phpworkman

🎜TP+workman バージョン以降、TP は Mysql の切断および再接続メカニズムをサポートしており、オフになっています。デフォルトでは、必要に応じて 🎜rrreee🎜 を application/databases.php データベース設定ファイルに追加すれば問題ありません。 🎜🎜関連する推奨事項: 🎜🎜🎜🎜メモリ常駐型 PHP プログラムの mysql エラー報告🎜🎜

以上がPHP プログラム mysql エラー mysql が消えてしまいましたの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。