2016-06-20 5 views
0

나는 Redis와 함께 작동하는 PHP에서 백엔드를 가지고있다.PHP와 Redis 간의 높은 트래픽 연결

그러나 요청이 증가하고는 초당 2000 개 이상의 요청이 나는 오류가 나타나면 TIME_WAIT에

99 - Cannot assign requested address 

모든 소켓을.


연결 예 :


$this->_socket = @stream_socket_client(
    'tcp://' . $this->hostname . ':' . $this->port, 
    $errorNumber, 
    $errorDescription, 
    ini_get('default_socket_timeout'), 
    STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT 
); 
내가 찾을 솔루션 : http://redis4you.com/articles.php?id=012&name=redis

하지만/proc 디렉토리/sys 인/그물 /의 IPv4/tcp_tw_recycle을가 I가 1 돈에 설정할 수 없습니다 응용 프로그램과 redis 사이의 네트워크에서 손실 패킷을 원하지 않습니다.

PHP의 새 요청시 PHP가 새 소켓을 만듭니다.

아이디어가 있으십니까?

+0

동일한 소켓을 사용하여 여러 요청을 보낼 수 있습니까? –

+0

동일한 소켓을 사용하여 여러 요청을 보내려면 어떻게해야합니까? –

+0

http://redis.io/topics/pipelining –

답변

0

문제가 해결되었습니다. tcp reuce 및 소켓 세트에 대한 대기 시간은 10 초입니다. PHP는 지속적 모드에서 소켓을 사용합니다.

STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT 

따라서 초당 요청 횟수가 2,000이고 61 소켓 이상을 사용하지 않습니다.

0

나는 당신의 전체 디자인을 잘 모르겠지만, 여기 뭔가 당신은 할 수 :

  • 항상 운영하는 PHP 페이지를 만듭니다 (잠시와 (참) 루프)
  • 이 페이지는 기다릴 것 초기 페이지의 내용 (소켓 코드가 있던 곳)
  • 파이프 라이닝 기술을 사용하면 동일한 소켓을 사용하여 모든 요청을 보냅니다.
  • 누락 된 사항은 초기 페이지에서이 새 페이지로 데이터를 전달하는 방법뿐입니다.

    • 초기 페이지에서 데이터를 저장하고 여전히 새로운 하나를 얻기 위해 그것을 사용하는 APC를 사용 : 나는 여러 솔루션을 참조 마지막 부분 (확실하지 비록 그들이 경우 모든 작업)에 대한

  • .
  • 처리, 제출 중 두 가지 모드가있는 새 페이지에서 SESSION을 작성하십시오. 그런 다음 초기 페이지에서 로컬 서버를 사용하여이 페이지를 호출해야합니다.

두 개의 솔루션 모두에서이 새 페이지의 한 인스턴스가 로컬에서 실행되어 '처리/대기'가 활성화됩니다.