gearman 에서 worker 가 백 엔 드 에 상주 하여 MySQL server has gone away 의 해결 방법

3728 단어 gearmanworkerMySQL
이 사례 는 gearman 에서 worker 가 백 스테이지 에 상주 하여 MySQL server has gone away 를 초래 하 는 해결 방법 을 설명 한다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
이 원인 이 발생 한 것 은 주로 다음 과 같은 몇 가지 가 있다.

1、mysql     
2、       ,   wait_timeout   ,mysql    
3、mysql       kill
4、            ,   max_allowed_packet  
5、                ,          wait_timeout。
프레젠테이션 의 편 의 를 위해 wait 설정timeout 시간 은 10 초 입 니 다.

> set global wait_timeout=10;
> show global variables like 'wait_timeout';
worker.php 코드 는 다음 과 같 습 니 다.

<?php
//    worker
$worker = new GearmanWorker();
//    job  
$worker->addServer('127.0.0.1', 4730);
//        ,      
$worker->addFunction('longTime', function($job) {
  //workload()              
  $data = json_decode($job->workload(), true);

  $db = new mysqli('192.168.1.100', 'root', '', 'test');
  if($db->connect_error) {
    die('connect error');
  }

  //  15 ,    mysql wait_timeout 10 
  sleep(15);

  //       ,    ,  mysql        
  $ret = $db->query("INSERT INTO test VALUES(NULL, {$data['title']}, {$data['content']});");
  if($ret) {
    return "    
"; } }); // // job while($worker->work());
client.php 코드 는 다음 과 같 습 니 다.

<?php
//       
$client = new GearmanClient();
//    job  
$client->addServer('127.0.0.1', 4730);

//doNormal  
$ret = $client->doNormal('longTime', json_encode(array(
  'title' => '    ',
  'content' => '    ',
)));

echo $ret;
실행 결 과 는 다음 그림 과 같 습 니 다.MySQL server has gone away 상황 이 발생 했 습 니 다.

일반적인 해결 방법:
1、waittimeout 의 값(권장 하지 않 음)
2.데이터 베 이 스 를 조작 할 때마다 ping()을 한 번 에 끊 으 면 다시 연결 합 니 다.
3、waittimeout 시간 간격 내 에 우 리 는 가끔 query('select 1+1')에 갑 니 다.연결 이 살아 있다 는 것 을 my sql 에 게 알려 주세요.
worker.php 코드 를 다음 과 같이 수정 합 니 다.

<?php
//    worker
$worker = new GearmanWorker();
//    job  
$worker->addServer('127.0.0.1', 4730);
//        ,      
$worker->addFunction('longTime', function($job) {
  //workload()              
  $data = json_decode($job->workload(), true);
  
  $db = new mysqli('192.168.1.100', 'root', '', 'test');
  if($db->connect_error) {
    die('connect error');
  }
  
  //  15 ,    mysql wait_timeout 10 
  sleep(15);

  //ini_set('mysqli.reconnect', 1);
  //php    ,ping       ,       
  //$db->ping();

  if(!$db->ping()) {
    $db->close();
    //       
    $db = new mysqli('192.168.1.100', 'root', '', 'test');
  }

  $ret = $db->query("INSERT INTO test VALUES(NULL, '{$data['title']}', '{$data['content']}');");
  if($ret) {
    return "    
"; } }); // // job while($worker->work());
실행 결 과 는 다음 과 같 습 니 다.

더 많은 PHP 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
본 논문 에서 말 한 것 이 여러분 의 PHP 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기