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.백 스테이지 에 상주 하 는 프로 세 스 메모리 도 누설 되 지 않 았 습 니 다
우리 회 사 는 아 리 운 의 레 디 스 제품 을 사용 합 니 다.레 디 스 버 전이 너무 낮 아서 그런 지그래서 우 리 는 아 리 클 라 우 드 의 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 의 자세 한 내용 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.