2014-11-29 2 views
3

리소스 집약적 인 스크립트를 작성하는 데 약 30 분이 걸립니다. 그것의 실행으로 점차적으로 RAM을 소모합니다. 일단 그것이 끝나면 그것은 대략 300mb를 소비했다. 이 스크립트를 여러 번 실행해야 문제가 발생합니다. 램 사용률이 100 %에 도달하고 스크립트가 멈 추면 스크립트를 다시 실행하기를 원할 때마다 서버를 다시 시작해야합니다.스크립트 완료 후 PHP가 메모리를 해제하도록하는 방법

어떻게 강제로 PHP 나 MySQL에서 메모리를 해제 할 수 있습니까? PHP 버전 5.4.29 Centos VPS 2GB RAM PHP 스크립트의 최대 메모리는 512MB로 설정됩니다.

스크립트가 많은 양의 SQL 쿼리를 만듭니다. 1000 년대에 있어야합니다. 또한 5 개의 다른 API를 50 번 호출합니다. 그것은 db 테이블에서 50 행을 선택하고 API를 호출하여 업데이트합니다.

가비지 수집을 사용합니다. var_dump (gc_enabled()); 반환 사실

   total  used  free  shared buffers  cached 
Mem:   2048  1522  525   0   0  182 
-/+ buffers/cache:  1339  708 
Swap:   128   0  128 
+2

쉘을 통해 PHP 스크립트를 실행하고 있습니까? 그렇다면 스크립트 종료 후 남은 프로세스를 확인하십시오. PHP는 지속적으로 실행되는 프로세스가 아니므로 스크립트가 종료 된 후에도 메모리에서 PHP를 찾을 수 없습니다. –

+0

처음에는 wget을 사용하여 실행했지만 지금은 브라우저를 통해 실행하고 있습니다. 스크립트가 끝난 후에는 메모리에 있지 않습니다. mysql은 4 % 램을 사용하고있는 것처럼 보이고 메모리를 사용하여 볼 수있는 것이 전부다. 그 램을 사용하는 어떤 과정이있는 것 같지 않습니다. 방금 누락되었습니다. –

+0

"그냥 누락되었습니다"를 정의하십시오. 메모리가 공개되지 않는다고 생각하는 이유는 무엇입니까? (http://www.linuxatemyram.com/을 참조하십시오) – duskwuff

답변

2

스크립트는 여분의 아무것도 필요하지 않아야 있도록 모든 자원이 해제되어야 완료되면 당신은 버그와 메모리 누수

EDIT 것 같다 PHP/lib 디렉토리를 사용하지 않는

메모리 누수는 PHP 나 그 모듈에서 메모리 누수가 발생하면 PHP와 같은 언어에서 PHP를 업데이트하거나 모듈을 사용하여 다른 방법으로 수정하지 못하게됩니다. 누수가 고쳐 지도록. 어떤 구성 요소가 유출되었는지를 좁히려 고 시도한 다음 작성자에게보고 할 수 있습니다. 일시적인 해결책으로 정기적으로 httpd를 다시 시작하여 PHP 나 모듈이 할당 한 모든 메모리를 해제하는 방법으로이 문제를 해결할 수 있습니다. 하지만 빠른 해결 방법은

+0

누출의 맨 아래까지 어떻게 도달 할 수 있습니까? 또는 그 이상으로 내가 누출 된 메모리를 정리할 수 있도록 스크립트에 코드를 추가 할 수 있습니까? 나는 top 명령을 사용했고이 램을 사용하는 것은 아무것도 없다. PHP는 유창하게도 200MB 램을 사용하므로 PHP도 아닙니다. –

+0

수정 된 답변보기 –

-1

체크 아웃 조정하여 데이터베이스 메모리 제한을 설정해야합니다 생각합니다.

PHP Docs

0

이이 RAM을 차지 PHP 아니다.

php 프로세스가 완료되면 모든 RAM을 시스템에 반환합니다. 그래서 이것은 이것이 원인이되는 PHP가 아닙니다.

서버의 다른 응용 프로그램이 추가 메모리를 차지하고 있으므로 실행시 php에 사용할 수있는 메모리가 부족합니다. 설명하신 내용을 보면 MySQL이라고 상상하기 쉽습니다. 1000 개의 검색어를 실행한다고하셨습니다. MySQL은 내부적으로 프로파일 링 및 캐싱을 수행하여 이러한 쿼리를 최적화합니다. 이렇게하면 PHP 스크립트를 실행 한 후에 추가 메모리를 차지하게됩니다.

기타 서비스에 대해서도 확인하십시오. 스크립트에서 호출 된 서비스가 있으면서도 스크립트 실행간에 계속 실행하면 더 큰 메모리를 차지할 수 있습니다. 이 서비스 중 일부는 더 작은 메모리 풋 프린트로 구성 될 수 있지만 일부는 가능하지 않을 수 있습니다.

물론이 솔루션은 두 개의 다른 서버에서 PHP와 MySQL을 실행합니다. 하나의 서버를 효율적으로 공유하도록 구성하는 것보다 전체 서버를 사용하도록 각 응용 프로그램을 구성하는 것이 훨씬 간단합니다. 실행에 300MB가 필요한 스크립트의 경우 2GB RAM이 부족합니다.

서버 리소스가 고정되어 있으면 더 오래 실행되도록 메모리를 줄이는 것이 가능할 수 있습니다. 어쩌면 가장 큰 데이터를 조각으로로드하고 각 결과를 플러시 한 후 다음 데이터를로드 할 수 있습니다. 하지만 나에게 이는 일시적인 해결책 일뿐입니다.

관련 문제