2011-08-25 1 views
3

웹 사이트에서 특정 데이터를 긁어 내고 관련 정보를 찾아이를 데이터베이스에 저장하는 PHP 스크립트를 만들었습니다. 스크립트는 로컬 컴퓨터에서 제대로 작동하지만 cron 작업을 사용하는 라이브 서버에서 실행하면 10 개의 데이터베이스 삽입을 수행 한 후 중지합니다PHP : 로컬 컴퓨터에서 메모리 사용량이 낮을 때 프로덕션 서버에서 메모리 사용량이 매우 높음

"치명적인 오류 : 사용 가능한 메모리 크기가 67108864 바이트로 고갈되었습니다 (35 바이트를 할당하려고했습니다.) 라인 /home/content/36/78632936/html/scripts/simple_html_dom.php 809
는 "

나는 내 로컬 사용 get_memory_peak_usage에서 동일한 스크립트를 확인() 및 최대 사용량이 약 8 온다 MB.

나는 내 코드의

엿볼 .. 메모리 사용량이 어떤 도움을 이해할 수있을 것이다 .. 라이브 시스템에서 화려 높은 이유에 대해 의아해하고

:

DB_table1 :의 60000 행의 목록이 포함되어 있습니다 데이터

메인 코드는 DB1을 호출하고 데이터를 가져온 다음 데이터의 각 행을 사용하여 URL을 형성하기 시작합니다. 이러한 각 URL은 simple_html_dom() 함수를 사용하여 스크랩되고 스크립트는 각 페이지의 특정 정보를 찾고이 데이터를 다른 테이블 DB_table2에 저장합니다.

다른 정보가 필요하면 알려주십시오. 감사합니다 :)

+1

라이브 및 로컬 서버는 어떤 OS, PHP 버전 및 MySQL 버전을 사용합니까? – gnur

+2

simple_html_dom.php 809 행 (그리고 그 위와 아래의 줄, 이상적으로는 전체 블록 ...)에서 어떤 일이 발생하는지 알 수없는 한이 사실을 추측 할 수 있습니다. – ty812

+0

전체 웹 사이트를 긁어서 삽입 작업을 시작 했습니까? ? 또는 insert-you-you-go? – Quamis

답변

0

업데이트 :
php change log 보면 주소입니다 메모리 문제가 많이있다. 5.2에서 누수가있는 PHP의 일부를 사용하고 있다면 원인 일 수 있습니다. 확실하게 알고 싶다면 memory_get_usage의 차이점이있는 코드의 메모리 집약적 인 부분을 래핑하고 메모리 사용간에 불일치가 있는지 확인하십시오.


질문/답변 :

afuzzyllama는 : 프로덕션 환경은 지역 환경 같은 것입니까? 프로덕션 DB에 샌드 박스보다 많은 데이터가있을 수 있습니다.

user743914 : 불행히도 이전에 차이점을 알지 못했지만 내 로컬 서버가 5.3.1에있는 동안 프로덕션 서버에서 PHP 5.2를 실행 중입니다 ... 프로덕션 DB에 로컬 호스트와 동일한 양의 데이터가 있습니다 ...


간단한 해결책 :
최대 메모리는 서버가 수 무엇을 제한한다?

this page [php.net]에서 'memory_limit'를 검색하십시오.

문서에서 볼 수 있듯이, PHP 버전에 따라 제한은 8MB 정도 될 수 있습니다. 나는 당신의 스크립트가 ~ 67mb에서 실패하고 있기 때문에 당신의 한계가 현재 ~ 64M로 설정되어 있다고 추측 할 것이다.

임시로 키워야하는 경우 ini_set()을 사용하거나 PHP에서 설정할 수 있습니다.ini 파일을 열고 서버를 다시 시작하십시오.

+0

귀하의 의견을 많이 주셔서 감사합니다 ... 불행히도 이전에 차이점을 알지 못했어요, 내 프로덕션 서버가 내 localhost가 5.3.1에있는 동안 PHP 버전 5.2를 실행 중입니다 ... 프로덕션 DB에 localhost와 동일한 양의 데이터가 있습니다. ... 버전 차이가 메모리 사용량의 유일한 이유 일 수 있습니까? 나는 가능한 한 각 단계마다 설정을 사용하지 않고있다. – ankit

0

/foreach 동안 unset()을 사용하는 것을 잊지 마시고 더 이상 필요하지 않은 (DB) 결과를 정리하십시오.