메모리 누수 문제 swoole 좋은 해결책이 없습니다

 기존의 웹 개발 모델에서, 우리는 모든 요청 PHP는, 아파치, 경우, 디스크 초기화에서 읽을 어휘, 구문 분석, 컴파일 과정을 분석뿐만 아니라, nginx를와 통신하거나하는 PHP 파일을 통해 갈 것을 알고 우리 상호 작용이 데이터베이스를 포함,뿐만 아니라 악수를하고 사실의 첫 번째 요청 뒤에 표시 다른 작업 아래 데이터베이스, 시험에 대한 권리, 종료를, 계산, 꽤 지루한 과정이, 의심의 여지가,이 과정은 상당한 오버 헤드를 가져올 것이다있다! 물론, 이러한 리소스와 메모리 모두, 첫 번째 요청이 끝나기 전에, 발표 될 예정이다.

그러나 swoole 실행하는 영구 메모리입니다. 몇 가지 차이점이있다, 우리는 다음을 이해한다.

로드 된 서버 리소스를 실행 한 후, 항상 메모리에 유지됩니다. 우리는 연결 일부 구성 파일을 초기화 변수 및 기타 작업을로드 (100) 클라이언트가, 서버를 열었습니다 가정 즉, 이러한 작업에만 다시 때 첫 번째 연결시 클라이언트에 대한 필요성을 제거 클라이언트 연결 프로세스는 메모리 부족에서 직접 읽을로드를 반복한다.

정말 좋은 그것은 그래서? 분명 아주 좋아. 이것은 또한 큰 성능을 향상시킬 것입니다.

그러나, 개발자에 대한 요구도 높다. 이러한 자원의 영구 메모리 때문에, 웹 모드로, 요청의 종료 후 메모리와 리소스를 확보 할 수 없습니다. 우리가 좋은 동작을 거래하지 않았다 일단 그건, 메모리 누수가 발생, 시간의 흐름은 메모리 오버 플로우가있을 수 있습니다.

swoole 이전에 좋은 인상을하고있다, 나는 모든 구덩이를 기대하지 않았다. 당신이 시간이 더 나은 자신의 능력을 향상시키기 위해 제약 조건으로되고, 생각하면 사실,이 모든 구덩이, 구덩이입니다.

돌아 가기 우리가 처음에 언급 한 질문의 장황한 설명을 다시 : 우리의 코드를 처음부터 서버가 메모리에로드, 클라이언트가 요청을 다시 시작 할 때 우리는 로컬 디스크에 코드를 수정하는 방법을 후반에 상관없이, 항상 힘의 코드의 메모리에, 그래서 우리는 단지 메모리를 해제, 서버를 종료 한 다음 서버를 재부팅 할 수 있습니다, 새로운 코드는 이해 여부, 그래서 메모리로 다시로드?

일부 학생들, 즉 메모리에 swoole에서 수동으로 설정되지 않은 버전 자신의 응용 프로그램에 무엇을해야 말을하지 않는 즉, 내가 좋은 문제를 느끼는 말을?

지역 변수의 경우, 마음을 행사할 필요가 없습니다, swoole는 이벤트 콜백 함수가 반환 이후에 발표 될 예정이다. 그들이 사용 이후에 출시되지 않기 때문에 그러나 전역 변수에 대한 당신은 너무 열심히 일해야한다. 공개되지 않습니다? PHP에서 전역 변수 이러한 유형의 것을 : 전역 변수 선언, 개체 속성 또는 정적 변수는 사용 감히 함수 정적 및 슈퍼 전역 내에서 선언? 부주의 리듬 서버는 직접 마무리합니다!

왜 우리는 글로벌 변수에 대해 생각해야 하는가?

당신은 세계적으로 공유하고 싶지 않은거야? 그러나, 멀티 프로세스 개발 모델에서, 전역 변수가 공유 메모리가 swoole 개발 그렇지 않다, 하위 프로세스 메모리 힙에 저장되어있는 메모리의 공정에 사용되는 우리는 글로벌 변수를 사용하여 피하려고!

나는 비 사용하지 않으려는? 우리는 단지 사용하려면, 행복하다.

우리는 메모리 누수를 방지하는 방법을 살펴.

예를 들어, 접속 클라이언트 식별을 저장하는 큰 정적 배열있다. 우리는으로 onClose 콜백에서 변수를 정리 할 수 ​​있습니다.

또한, swoole도 max_request 메커니즘을 제공, 우리는 메모리가 부족하지 않도록 max_request 및 task_max_request이 두 가지 매개 변수를 구성 할 수 있습니다.

작업자 프로세스가 작업의 수를 처리 할 때 작업 작업자 프로세스의 최대 수는 max_request입니다 의미하는 것은이 매개 변수를 초과하는 작업자 프로세스가 자동으로 종료는, 그래서 그들은 가능한 메모리 자원의 목적을 달성 할 것이다.

우리는 관리자 프로세스가 있기 때문에 새로운 작업자 프로세스를 다시 끌어 작업자 프로세스가 종료 관리자 프로세스 후, 작업자 프로세스의 종료가 아니라 "사람"비즈니스 로직에 대해 걱정하지 마십시오.

작업, 같은 의미의 max_request에 대한 task_max_request 과정.

벌거 벗은 나는 우리의 관점이 너무 재미없는 말했다.

다음과 같이 서버 코드는 생략된다

다음과 같이 클라이언트 코드는

테스트 목적을 위해, 우리는 작업자 공정, 작업 과정, 가장 큰 작업 설정 작업자 프로세스 세 번, 가장 큰 작업 설정 작업 진행이 4 배를 열었습니다.

클라이언트가 현재 프로세스의 구조를보고 우리를 요청하지 전에 서버를 실행 한 후

프로세스 ID는 15644 및 15645 오와 같은 것을 참고,이 두 작업자 프로세스, 프로세스가 작업이다. 맥에서 결국 우리는 누가 누구인지 구별 할 수 없습니다.

그런 다음 우리는 클라이언트 요청을 결과에서 세 번 살펴 보자

원래의 프로세스 ID를 발견하지 않았습니다 지금이되었다 15,680의 15,645 같음? 요청 세 번 후에 우리는 작업자 프로세스가 자동으로 철회하고, 공정의 작업자 프로세스 관리자 15680을 끌어 결정합니다.

우리는 다시 한번 네 번째 시간을 요청

동일한 작업 과정 15644가 없어 발견 프로세스 ID는 15704이 다시 생성하는 새로운 자식 프로세스가있다.

그 모든 권리, 공식적인 거짓말이없는 것 같다.

그래서 ... 나는 원래 너무 많은 넌센스의 시작 부분에 도입?

서버 max_request 매개 변수 아래에 몇 가지 제한이 모든 때문이다.

max_request에만 요청에 대한 응답으로 동기 차단, 비 저장 서버 프로그램에 사용
해서는 안 max_request 서버 순수 비동기 설정
기본 모드 max_request를 사용하는이 무효 인
기본 모드가 swoole의 작동 모드이고, 우리는 멀티 프로세스 모드를 소개합니다.

요약 :

    1. 영구 메모리가 오버 헤드가 작은되지 않습니다 감소, swoole 좋은
    2. 우리는 글로벌 변수를 사용하여 피하려고한다,하지 최고에, 쓸데
    3. 제한 장면 max_request 있기 때문에 max_request 메모리 오버 플로우 문제는 PHP는 해결 될 수 있지만, 주로 사용 가능한 메모리의 습관을 개발하기 위해

추천

출처www.cnblogs.com/wadhf/p/11809003.html