2012-10-12 2 views
20

PHP에서 자주 메모리 제한 문제가 있습니다. 특히 고도와PHP의 memory_limit가 더 좋은가?

내가 뭘 여기 알고 싶은 것은 등, 드루팔 같은 통합 시스템 자원 :

  • 이 2기가바이트 같은 매우 높은 PHP 메모리 제한이 좋은가요?
  • 큰 단점이 있습니까?

편집 : 시나리오로

은, 드루팔, 예를 들어, 그것은 너무 많은 메모리를 필요로하는 동안 우리 CLEAR (안 Drush 또는 스크립트에 의해) 웹 패널을 통해 캐시. 심지어 이 경우에만, 나는 현재 512MB 정도의 상한이 필요합니다.

+4

한 마디로 NO. 메모리 한계는 필요한 범위 내에서 가능한 한 낮게 설정해야합니다. 메모리 제한은 전역 적으로 실행되는 것이 아니라 스크립트를 동시에 실행하는 각 개별 스크립트에 적용됩니다. 이 값을 낮게 설정하면 실수로 인해 오류가 발생하는 경우이를 방지하는 데 도움이됩니다. 무한 루프가 발생하면 스크립트가 통제에서 벗어나서 전체 서버를 중단시키는 대신 일찍 종료됩니다. – DaveRandom

+1

동시 요청을 처리하는 데 얼마나 많은 메모리가 필요합니까? 200GB? – JvdBerg

+5

@JvdBerg 메모리 제한은 실제로 얼마나 많은 메모리가 사용되는지를 정의하지 않습니다. 단일 프로세스에서 사용할 수있는 제한입니다. – KingCrunch

답변

27

골든 규칙 : 은 PHP가 작동해야하는 것만 제공합니다.

이 시스템이 불필요하게 PHP 과정에 나막신 때 상황을 방지하고, 또한 버그를 찾는 데 도움이 될 것입니다 (메모리 1GB의 소요 스크립트는 예외적이며, 2GB의 메모리의 한계를 부여하는 것을 숨길 수) . 당신은 하나의 스크립트 파일이 매우 메모리 무거운 알고 예외적 인 경우에 대해서는


, 당신은 실행시 메모리 제한 지침을 변경 ini_set()를 사용할 수 있습니다. thisthis을 참조하십시오.

+0

'내 질문을 편집 해주세요.'그러니 이런! 지금 내 시스템은 그 한계로 인해 속도가 느려지고 있습니까 ??? (캐시 프로세스를 지우는 것만 가능) @ _ @ –

+1

@ 4lvin : 내 대답을 편집했습니다. –

+0

감사합니다.) 두 세트의 문제도 해결했습니다.) –

0

을 알고있는 경우에 많은 양의 메모리가 필요하다는 것을 알고 있다면 완벽하게 안전하며 필요에 따라 제한을 높게 설정하십시오. 사용 가능한 메모리 양 및 실행중인 다른 응용 프로그램과 관련하여 시스템의 한계가 높음으로 설정된 경우 문제가 발생할 수 있습니다.

무한 루프에서 일부 데이터를 처리 할 수있는 오류가있는 스크립트는 메모리 제한이 64MB이거나 이와 비슷한 경우 매우 빠르게 중단됩니다. 이 시나리오에서 메모리 제한을 4GB로 설정하면 무한 루프에서 전체 기울기로 실행되는 시스템이 오랫동안 계속 실행되어 전체 시스템이 응답하지 않을 수 있습니다.

그러나 4-8GB의 메모리가있는 시스템에서는 메모리 제한이 약 2-4GB 인 대규모 데이터 처리 응용 프로그램을 가지고 있습니다. 다른 사용자가 언급 한 것처럼이 응용 프로그램은 하나의 인스턴스였습니다. 대부분의 웹 응용 프로그램과 같이 스크립트의 여러 인스턴스를 실행하는 응용 프로그램을 사용하는 경우 각 인스턴스에서 많은 메모리를 사용하여 주요 문제가 발생합니다. 메모리가 부족해질 때까지 추가 클라이언트는 응용 프로그램을 사용할 수 없습니다.

하지만 문제를 숨기려면 메모리 제한을 늘리면 안됩니다. 응용 프로그램이 많은 메모리를 필요로하는 이유를 검사하고 먼저 수정할 수 있는지 확인하십시오.

5

아니요, 더 좋을수록 좋습니다. 스크립트 하나가 사용할 수있는 메모리 양입니다. 서버에 4GB의 메모리가 들어 있으면 두 개의 스크립트 만 동시에 모든 메모리를 먹을 수 있습니다.

일반적으로 PHP 스크립트는 메모리를 거의 사용하지 않아야합니다. 일반적으로 스크립트가 예약 한 모든 메모리는 종료 될 때 해제되지만 실행 중에 더 이상 필요하지 않은 변수를 명시 적으로 사용하여 메모리를 정리할 수 있습니다. 그렇게하면 스크립트를보다 메모리 효율적으로 만들 수 있습니다.

+0

'unset()'은 일반적으로 전역 변수를 사용하지 않는 한 보통 재구성되지 않습니다. – KingCrunch

+0

@ KingCrunch 심지어 그것이 차이를 만들어서는 안됩니다? 'global'은 여전히 ​​스크립트 실행 범위 내에서만 전역이며, 요청 간에는 지속되지 않습니다. 또한'unset()'은 메모리가 즉시 해제된다는 것을 보증하지 않는다.'gc_collect_cycles()'를 – DaveRandom

+0

'EDITED MY QUESTION PLEASE '와 같이 호출해야한다. 지금 내 시스템은 그 한계로 인해 속도가 느려지고 있습니까 ??? (캐시 프로세스를 지우는 것만 가능) @D @ –

관련 문제