문제

우리는 데이터베이스 검색, 개체 창작물 (많은) 등을 통해 수많은 루프를 기반으로 모든 종류의 큰 보고서를 생성하는 대규모 관리 소프트웨어를 보유하고 있습니다.

PHP4에서는 64MB의 메모리 제한으로 행복하게 실행될 수 있습니다. 이제 우리는 새 서버로 옮겼으며 동일한 데이터베이스로 동일한 코드로 동일한 보고서가 메모리 제한 공연없이 등장하지 않습니다 ...

나는 PHP5가 후드 아래에서 많은 것들이 바뀌 었다는 것을 알고 있지만, 그것을 행동하게 만드는 방법이 있습니까?

결국 질문은 다이어트에 대한 스크립트가 필요할 때 어떤 전략을 적용합니까?

도움이 되었습니까?

해결책

우리가 겪은 큰 문제는 객체 사이의 원형 참조가 범위를 벗어 났을 때 메모리를 풀지 못하게하는 것이 었습니다.

아키텍처에 따라 __destruct ()를 사용할 수 있고 참조를 수동으로 해제 할 수 있습니다. 우리의 문제에 대해 나는 수업을 재구성하고 원형 참조를 제거하게되었습니다.

다른 팁

모든 스크립트에서 리소스를 최적화 해야하는 경우 항상 코드를 분석, 프로필 및 디버깅하려고합니다. xdebug, 그리고 Xdebug 프로파일 러, 다른 옵션이 있습니다 APD, 그리고 벤치 마크 프로파일 러.

또한이 기사를 추천합니다.

새 서버로 이동 한 이후 MySQL 및 PHP 시스템 변수가 이전 서버의 방식과 동일하다는 것을 확인 했습니까?

PHP5는 많은 새로운 기능을 도입했지만 뒤로 호환성 만트라로 인해 PHP5와 PHP4의 차이로 인해 코드 및 데이터베이스가 변경되지 않은 애플리케이션의 성능에 영향을 미치지 않아야한다고 생각하지 않습니다.

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

PHP4에서 5에서 5로 업그레이드하는 것보다 새로운 시스템 환경과 관련이있는 문제처럼 들립니다.

베르트 랜드,

기존 코드를 리팩토링하는 데 관심이있는 경우 보고서를 실행하는 동안 먼저 CPU 및 메모리 사용량을 모니터링하는 것이 좋습니다. SQL 서버를 잠그고 있습니까?

나는 처음에 MySQL을 심하게 내려 놓아 전체 보고서 생성 프로세스를 리팩터링 해야하는 프로젝트를 수행했습니다. 그러나 우리가 완료되면 부하가 단순히 Apache로 전송되었습니다 (더 복잡한 PHP 코드를 통해). 우리의 최종 솔루션은 데이터베이스 설계를 리팩터링하여보고 기능에 대한 성능을 향상시키고 PHP를 사용하여 MySQL에서 기본적으로 할 수없는 일에 대한 여유를 선택하는 것이 었습니다.

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

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

공연!?!

64MB조차도 큽니다.

환경 간의 불일치를 무시하면 (매우 독특한 소리) 코드가 일부 재면 작용이 필요한 것처럼 들립니다.

데이터베이스 쿼리의 결과 세트가 배열에 덤프되지 않도록 코드를 다시 찾을 수 있습니다. 결과 세트에 대한 반복자를 구성하는 것이 좋습니다. (대부분의 목적으로 배열로 취급 할 수 있습니다) 한 번에 한 레코드를 처리하고 한 번에 10,000 개의 레코드를 처리하는 것 사이의 큰 차이가 있습니다.

둘째, 날씨를 살펴보면 코드가 여러 데이터 인스턴스를 생성하고 있습니다. 객체를 참조하여 전달할 수 있습니까? (사용 '&'). 초기 변형의 호드 프레임 워크를 사용할 때 비슷한 일을해야했습니다. 1MB 부착물은 참조가 아닌 전체 데이터 세트를 사본으로 전달한 수많은 통화에서 50MB로 날려 버릴 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top