2008-10-23 3 views
6

우리는 수많은 루프를 기반으로 데이터베이스 검색, 개체 생성 (다수) 등 모든 종류의 큰 보고서를 작성하는 대규모 관리 소프트웨어를 보유하고 있습니다.PHP5에서 메모리 소비를 처리하기위한 전략은 무엇입니까?

PHP4에서 64MB의 메모리 제한으로 행복하게 실행할 수 있습니다. 이제 새로운 서버와 동일한 데이터베이스로 이동 했으므로 동일한 코드로 동일한 보고서가 메모리 한도없이 나오지 않습니다 ...

나는 PHP5가 상당히 많은 것들로 변경되었다는 것을 알고 있지만 그것이 동작하도록 만드는 방법이 있습니까?

결국 질문은 스크립트를 다이어트에 넣어야 할 때 어떤 전략을 적용합니까?

답변

6

큰 문제는 범위를 벗어날 때 메모리를 확보하지 못하게하는 개체 간의 순환 참조입니다.

아키텍처에 따라 __destruct()를 사용하고 참조를 수동으로 설정 해제 할 수 있습니다. 우리 문제에 대해 나는 수업 구조 조정과 순환 참조 제거를 끝내었다.나는 모든 스크립트에 자원을 최적화해야하는 경우

0

새 서버로 이전 한 후 MySQL과 PHP 시스템 변수가 기존 서버와 동일한지 확인 했습니까?

PHP5는 많은 새로운 기능을 도입했으나 이전 버전과의 호환성에 대한 의문 때문에 PHP5와 PHP4의 차이가 코드 및 데이터베이스의 응용 프로그램 성능에 큰 영향을 미치지 않아야한다고 생각하지 않습니다. 변경되었습니다.

Apache 또는 IIS의 동일한 버전에서도 실행 중이십니까?

그것은 가능성이 5

0

버트 랜드에 PHP4에서 업그레이드보다는 새로운 시스템 환경과 관련된 문제 같은데, 그런 다음 기존 코드를 나는 것 리팩토링에 관심이 있다면

보고서를 실행하는 동안 CPU 및 메모리 사용을 먼저 모니터링하는 것이 좋습니다. SQL 서버를 잠그고 있습니까, 아니면 Apache를 잠그고 있습니까? (PHP 코드로 인해 많은 스트레스가 시스템에 걸리면 발생합니다)?

처음에는 MySQL을 심각하게 숙청하여 전체 보고서 생성 프로세스를 리팩토링해야했던 프로젝트에서 작업했습니다. 그러나 작업이 끝나면 더 복잡한 PHP 코드를 통해 Apache에로드가 전달되었습니다. 우리의 최종 솔루션은보고 기능을위한 더 나은 성능을 제공하고 PHP를 사용하여 MySQL에서 기본적으로 수행 할 수 없었던 것에 대한 불만을 해결하기 위해 데이터베이스 디자인을 리팩토링하는 것이 었습니다.

보고서의 특성에 따라 보고서에 사용되는 데이터를 비정규 화하는 것이 좋습니다. 데이터웨어 하우스 역할을하며 OLTP 원칙보다는 OLAP 원칙을 중심으로 설계된 두 번째 데이터베이스를 구축하는 것을 고려할 수도 있습니다. OLAP 및 데이터웨어 하우징에 대한 일반적인 설명은 Wikipedia에서 시작하십시오.

그러나 심각한 리팩토링을 시작하기 전에 phpinfo()를 보면 환경이 충분히 유사하다는 것을 확인 했습니까? PHP와 SHOW VARIABLES 용; MySQL의 ?

0

공연!?!

심지어 64MB가 큽니다.

환경 간의 불일치를 무시하면 (매우 특이하게 들립니다.) 코드가 다시 팩토링해야 할 수도있는 것처럼 들립니다.

코드를 다시 입력하여 데이터베이스 쿼리의 결과 집합이 배열로 덤프되지 않도록 할 수 있습니다. 결과 집합에 대한 반복자를 생성하는 것이 좋습니다. (그로 인해 대부분의 경우 배열로 처리 할 수 ​​있습니다.) 한 번에 하나의 레코드를 처리하고 한 번에 10,000 개의 레코드를 처리하는 것과 큰 차이가 있습니다.

두 번째로, 코드에서 날씨가 여러 가지 데이터 인스턴스를 만드는 모습을 살펴보십시오. 개체를 참조로 전달할 수 있습니까? ('&'사용). horde 프레임 워크의 초기 변형을 사용할 때도 비슷한 작업을 수행해야했습니다. 1 MB 첨부 파일은 참조가 아닌 전체 데이터 세트를 사본으로 전달한 수많은 호출에서 50MB로 끊어집니다.

+1

PHP5의 객체는 자동으로 참조로 전달됩니다. – grantwparks

+0

정말요?! 범위의 아이디어를 이기지 못할 것입니다. 개체를 함수에 전달하면 해당 함수는 실제 개체가 아닌 개체의 복사본에서 작동합니다. (객체를 참조로 전달하지 않는 한) – Bingy

+0

@grantwparks는 총 단순화라고 말했습니다 ... http://php.net/manual/en/language.oop5.references.php '키 중 하나 PHP 5 OOP의 핵심은 종종 "객체는 기본적으로 참조에 의해 전달됩니다"라는 것입니다. 이것은 완전히 사실이 아닙니다. 이 섹션에서는 몇 가지 예를 사용하여 일반적인 생각을 수정합니다. ' – MrMesees

관련 문제