>  기사  >  데이터 베이스  >  PHP 프로그램 mysql 오류 mysql이 사라졌습니다.

PHP 프로그램 mysql 오류 mysql이 사라졌습니다.

小云云
小云云원래의
2018-03-14 15:49:033659검색


이 기사에서는 주로 mysql이 사라졌음을 보고하는 메모리 상주 PHP 프로그램 mysql 오류를 공유합니다. CLI 환경에서 PHP 프로그램은 오랫동안 실행되어야 하며 클라이언트와 클라이언트 간의 TCP 연결이 필요합니다. MySQL 서버가 불안정합니다.

불안정한 이유는 다음과 같습니다:

  • MySQL-Server는 특정 기간 내에 자동으로 연결을 끊습니다.

  • PHP 프로그램이 유휴 기간에 직면하고 MySQL 쿼리가 없는 경우 오랜 시간이 지나면 MySQL-Server는 리소스를 재활용하기 위해 연결도 끊습니다.

  • 다른 경우에는 MySQL 서버에서 종료 프로세스를 실행하여 특정 연결을 종료하면 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_ping의 솔루션을 제안했는데, mysql_query가 연결 감지 또는 타이밍 연결을 수행할 때마다 발각.

이 솔루션은 최고가 아닙니다. 그 이유는 mysql_ping이 연결을 적극적으로 감지해야 하므로 추가 소비가 발생하기 때문입니다. mysql_ping을 정기적으로 실행해도 문제를 해결할 수 없습니다. 예를 들어, mysql_ping 테스트만 실행한 후에는 연결이 닫힙니다.

오류 코드를 캡처하고 연결을 끊었다가 다시 연결하세요. /h4 >
원칙은 다음과 같습니다. mysql_query는 실행 후 반환 값을 감지합니다. mysql_query가 반환에 실패하면 오류 코드는 2006/2013( 이 두 가지 오류는 연결 실패를 나타냅니다., mysql_connect를 실행한 후 mysql_query인 경우 <code>mysql_query를 다시 실행하세요. 가 성공을 반환하면 연결이 유효하며 이는 정상적인 호출입니다.

잘 알려진 많은 PHP 상주 프로세스 프레임워크

swoole_framework의 쿼리 메서드.

🎜🎜
// 开启断线重连&#39;break_reconnect&#39; => true,
🎜🎜🎜workerman에서 데이터베이스 연결 클래스의 메서드를 실행합니다. 🎜🎜🎜rrreee🎜오류 코드를 캡처하고 연결을 끊었다가 다시 연결하는 것은 당연합니다. 신뢰성이 높고 비용이 저렴한 솔루션이므로 영구적인 환경에서 사용하는 것이 좋습니다. 🎜

thinkphp + phpworkman

🎜TP+workman을 사용할 때 비슷한 상황이 발생합니다. V5.0.6+ 버전부터 TP는 Mysql의 연결 해제 및 재연결 메커니즘을 지원하며 꺼져 있습니다. 기본적으로 필요한 경우 application/databases.php 데이터베이스 구성 파일에 🎜rrreee🎜를 추가하면 문제가 없습니다. 🎜🎜관련 권장 사항: 🎜🎜🎜🎜메모리 상주 PHP 프로그램 mysql 오류 보고🎜🎜

위 내용은 PHP 프로그램 mysql 오류 mysql이 사라졌습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.