PHP 해결 데 몬 Redis 가사

4579 단어 PHP데 몬Redis가사
간단 한 데 몬 예제

<?php
$redis = new \Redis();
$redis->connect('localhost', 6379);
$redis->auth('xxxxx'); // Redis              。
$redis->select(1);

$queueKey    = 'redis_queue_services_key';     //       。
$queueIngKey = 'redis_queue_services_ing_key'; //       。

try {
    while (true) {
        $element = $redis->bRPopLPush($queueKey, $queueIngKey, 60);
        if ($element) {
            $data = json_decode($element, true);
            /**
             *
             ......          ......
             *
             */
        } else {
            usleep(100000); //    0.1  。
        }
    }
} catch (\Exception $e) {
    exit("Error:{$e->getMessage()}");
}
이 코드 는 우리 가 쉽게 이해 할 수 있다.
이것 은 바로 Redis 의 차단 방법 인 bRPopLPush 순환 을 통 해 Redis 대기 열 에서 데 이 터 를 꺼 내 처리 하 는 것 입 니 다.데 이 터 를 찾 지 못 하면 1 초 동안 휴면 합 니 다.휴면 은 CPU 가 충분히 활 용 될 수 있 도록 하기 위해 서다.우 리 는 60 초 동안 차단 방법 을 사 용 했 기 때문이다.그래서 이 자리 에서 휴면 여 부 는 중요 하지 않다.
업무 에 오류 가 발생 하면 try catch 를 통 해 이상 한 캡 처 를 한 다음 에 오류 정 보 를 현재 스 크 립 트 로 직접 출력 하고 환불 합 니 다.
블 로 거 한 빙 이 백 스테이지 에서 실행 되 는 데 몬 을 처음 만 들 었 을 때,위 와 같은 방식 으로 작 성 된 코드 였 다.결국 이 코드 가 30s 까지 실 행 될 때 잘못 보 고 했 습 니 다.우리 socket 스 트림 시간 초과 알림.그래서 나 는 이 스 크 립 트 의 머리 에 다음 과 같은 코드 를 추가 했다.

ini_set('default_socket_timeout', -1);
이렇게 하면 우리 의 PHP 는 우리 와 Redis 의 socket 연결 을 주동 적 으로 끊 지 않 을 것 이다.
하지만 호황 은 길지 않다.시간 이 좀 지 났 으 니 한 보름 쯤 걸 렸 을 거 예요.운 웨 이 학생 은 레 디 스 대열 의 데이터 가 소비 되 지 않 은 상황 이 발생 했다 고 나 에 게 알려 주 었 다.그리고 나 서 나 는 소비 일 지 를 살 펴 보 았 다.확실히 새로운 소비 일지 가 나 오지 않 았 다.소비 할 때마다 성공 적 으로 소비 한 로 그 를 파일 에 쓰 는 습관 이 있 기 때문이다.소비 에 실패 한 것 도 로그 파일 에 기록 합 니 다.이렇게 해서 나 는 실패 의 구체 적 인 원인 을 알 게 되 었 다.
하지만 이번 에는 어떤 잘못 도 발견 하지 못 했다.
4.567917.백 스테이지 프로 세 스 가 생존 상 태 를 처리 합 니 다.고아 가 되 는 과정 은 아니 었 다4.567917.백 스테이지 에 상주 하 는 프로 세 스 메모리 도 누설 되 지 않 았 습 니 다
  • 시스템 CPU/메모리 자원 이 모두 처리 되 고 있 습 니 다
  • 4.567917.시스템 이 열 린 핸들 자원 도 저 소 상태 입 니 다4.567917.대역 폭 도 저 소 상 태 를 처리 합 니 다다른 상주 프로 세 스 도 정상 적 인 소비의 작업 상 태 를 처리한다.레 디 스 고장 문제 도 제거 하고..나 는 당시 에 도 MySQL 처럼 자주 연결 되 어 아무런 조작 도 하지 않 고 서버 측 에서 자발적으로 연결 을 끊 는 것 이 아 닌 지 의심 한 적 이 있다.단,MySQL 서버 에서 주동 적 으로 연결 을 끊 으 면 다음 과 같은 알림 이 표 시 됩 니 다.MySQL server has gone away 의 오류 입 니 다.하지만 우리 레 디 스 서버 에 서 는 오류 메 시 지 를 보 내지 않 았 습 니 다.
    우리 회 사 는 아 리 운 의 레 디 스 제품 을 사용 합 니 다.레 디 스 버 전이 너무 낮 아서 그런 지그래서 우 리 는 아 리 클 라 우 드 의 Redis 서 비 스 를 아 리 클 라 우 드 가 지원 하 는 최신 버 전 으로 업그레이드 했다.
    결국 실패했다.우리 레 디 스 는 가짜 로 죽 었 다.아니면 우리 레 디 스 가 위 활 상태 라 든 가.
    너 는 Redis 가 살아 있다 고 생각 하지만,사실은 그것 은 이미 죽 었 다.레 디 스 가 죽 었 다 고 생각 하지만 죽음 의 특징 은 없다.
    마지막 으로 나 는 냉정 해 졌 다.
    나 는 이때 의 Redis 가 이미 죽 었 다 고 가정한다.클 라 이언 트 에 게 알 리 지 않 았 을 뿐 입 니 다.그럼 레 디 스 연결 이 살아 있 는 지 확인 할 때마다
    그래서 나 는 레 디 스 의 API 를 뒤 졌 다.연결 이 살아 있 는 지 확인 하기 위해 ping()방법 을 제공 한 것 을 발견 하 였 습 니 다.
    둘째,더 이상 가사(위 활)하지 않 는 Redis 상주 프로 세 스 예시
    
    <?php
    
    $redis = new \Redis();
    $redis->connect('localhost', 6379);
    $redis->auth('xxxxx'); // Redis              。
    $redis->select(1);
    
    $queueKey    = 'redis_queue_services_key';     //       。
    $queueIngKey = 'redis_queue_services_ing_key'; //       。
    
    try {
        while (true) {
            $element = $redis->bRPopLPush($queueKey, $queueIngKey, 60);
            if ($element) {
                $data = json_decode($element, true);
                /**
                 *
                 ......          ......
                 *
                 */
            } else {
                $pong = $redis->ping();
                if ($pong != '+PONG') {
                    throw new \Exception('Redis ping failure!', 500);
                }
                usleep(100000); //    0.1  。
            }
        }
    } catch (\Exception $e) {
        exit("Error:{$e->getMessage()}");
    }
    코드 대 비 를 통 해 우 리 는 1 판 코드 를 바탕 으로 다음 과 같은 코드 를 추가 했다.
    
    $pong = $redis->ping();
    if ($pong != '+PONG') {
        throw new \Exception('Redis ping failure!', 500);
    }
    우리 가 Redis 서버 에 ping 을 보 낼 때 서버 는+PONG 문자열 을 되 돌려 줍 니 다.물론 이것 은 Redis 확장 패 키 징 방법 입 니 다.진짜 핑 은+번호 가 없어 요.
    우리 가 매번 ping 을 할 때마다 Redis 서버 는 우리 의 Redis 클 라 이언 트 연결 이 생존 상태 에 있다 고 생각 합 니 다.우리 연결 이 끊 기지 않 았 을 거 야.
    코드 를 개조 한 후,가짜 두통 문 제 는 다 시 는 나타 나 지 않 았 다.
    데 몬 해결 을 위 한 PHP 의 자세 한 내용 입 니 다.데 몬 해결 을 위 한 PHP 의 자세 한 내용 입 니 다.

    좋은 웹페이지 즐겨찾기