PHP는 PHP.ini 파일에서 전역적으로 메모리 제한을 설정합니다. 또한 로컬 수준에서 구성할 수 있다는 것도 알고 있습니다.
쿼리 메모리 제한은 132MB로 설정되어 있지만 다음과 같은 오류가 계속 발생합니다.
Fatal error: Allowed memory size of 161480704 bytes exhausted (tried to allocate 32 bytes) in #{removed_file_path}/script.php on line #{line}
우리는 현재 사용자가 페이지를 탐색하고 사용할 때 오류를 캐시하는 오류 로그 파일을 통해 시스템을 모니터링하고 있지만 cron
이러한 파일은 어디에도 기록되지 않습니다.
mysql_query
에 대한 호출을 변경하면 오류를 해결할 수 있지만 mysql_unbuffered_query
서버의 모든 파일을 변경해야 하는 위치를 알아야 합니다. 스크립트에 실제로 메모리 문제가 없다면 서버가 가능하면 결과를 RAM으로 읽어오기를 원하기 때문에 코드를 변경하고 싶지 않습니다.
우리 호스트가 그렇게 하지 말라고 조언했기 때문에 우리는 PHP의 메모리 제한을 늘리고 싶지 않습니다.
메모리 문제를 해결하려면 어떻게 해야 합니까? CentOS 6.7에서 실행 중입니다.
답변1
귀하의 PHP 인터프리터는 132MB 이상의 메모리가 필요한 모든 스크립트를 종료하도록 설정되어 있습니다. 스크립트가 161MB 이상의 메모리를 할당하려고 합니다. 문제는 간단하고 해결책도 간단합니다. 당신은 할 수 있습니다:
- PHP 인터프리터가 더 많은 것을 할당하게 하세요. 호스트가 이를 권장하지 않는 이유는 호스트가 그렇게 하지 않으면 데이터베이스가 계속 커지기 때문에 결국 8GB 이상의 메모리를 할당하게 되기 때문입니다.
- PHP와 더 이상 사용되지 않는
mysql_*
API를 잊어버리고 그러한 메모리 제한을 적용하지 않는 것을 사용하십시오. 통역사가 당신을 괴롭히는 것을 멈추더라도 운영 체제가 어느 시점에서는 아마도 당신을 괴롭힐 것이라는 점을 명심하십시오. - 스크립트를 개선하세요.
mysql_unbuffered_query
솔루션 #3과 일치하는 방법을 사용하십시오 . PHP는 더 이상 MySQL 결과 세트를 버퍼링하지 않으므로 더 이상 많은 메모리를 차지하지 않으며 인터프리터도 더 이상 불평하지 않습니다. 기본적으로 전환 중입니다.버퍼링된 쿼리에서 버퍼링되지 않은 쿼리로(예제 #2 및 #3 참조,PDO로의 전환을 고려하고 있는 시점은 2016년입니다.).PHP를 계속 사용하고 싶고 디자인이 옳다고 생각한다면 이것이 해결책입니다.
가능하다면 서버가 결과를 RAM으로 읽어오기를 원하기 때문에 코드를 변경하고 싶지 않습니다.
DBMS에 종사하는 사람들은 일반적으로 일을 잘합니다. 쿼리가 필요한 것보다 오래 걸리지 않도록 엔진이 최적화되어 있습니다.당신이 PHP와 오래된 mysql_*
API를 사용하고 있다는 점을 고려하면 속도가 실제로 문제가 된다고 생각하지 않습니다. 내 추측으로는 RAM이 아닌 데이터베이스에 데이터를 보관할 수 있다는 것입니다.버퍼링되지 않은 쿼리를 사용하고, 한 번에 한 행씩 가져오거나 처리하며, DBMS에 더 많이 의존합니다(게다가 일부 버퍼링도 수행할 수 있습니다...).
여전히 확신이 없다면 쿼리 자체를 다시 생각해 보는 것이 개선될 수 있습니다. 필요한 것보다 더 많은 데이터를 얻지 못하고 있습니까?SELECT *
(내 말은, 쿼리 시작 부분에 정말 필요합니까?)MySQL이 당신을 위해 뭔가를 처리할 수 없다고 확신합니까? DBMS는 매우 강력한 도구이므로 PHP 스크립트에서 모든 작업을 수행하는 대신 DBMS를 사용하여 작업할 수 있습니다. 전형적인 예는 평균을 계산하는 것입니다. 열의 모든 숫자를 구하고 합산 루프를 사용하는 대신 AVG(column)
그냥 물어보세요.
귀하의 스크립트 없이는 이 부분에 대해 추가 조언을 제공하기가 어렵습니다(스택 오버플로 직원이 더 나은 작업을 수행할 수 있음). 하지만 이 시점에서 스크립트를 충분히 수정했다고 생각되면... 다음으로 제출하세요.코드 검토? 더 이상 개선할 방법을 찾을 수 없다면 누군가가 그렇게 할 가능성이 높습니다.
어떤 시점에서 PHP와 MySQL이 제공하는 모든 옵션을 다 써버렸다고 느낀다면 다른 것을 사용하는 것을 고려해야 할 것입니다. 수행 중인 데이터 처리 유형에 따라 현재 작업에 더 적합한 다른 도구를 찾을 수 있습니다.