2013-10-30 4 views
2

내 데이터베이스를 eBay의 목록으로 업데이트하는 스크립트가 있습니다. 상품을 가져 오는 판매자의 양은 항상 다르며 30,000 개가 넘는 판매자가 있습니다. 나는이 목록들을 모두 한 번에 얻을 수 있어야합니다.매우 긴 스크립트가 계속 실패합니다

나는 이것을 위해 클라이언트 측 응용 프로그램을 만들었으므로 이미 모든 데이터를 가져 오거나 저장하고 있습니다. 이제는 DB의 각 판매자를 거쳐 목록을 가져 오는 자동화 된 방법이 필요합니다.

내 생각은 CRON을 사용하여 데이터베이스를 채울 PHP 스크립트를 실행하는 것이 었습니다.

실행하는 데 오랜 시간이 걸리는 스크립트를 실행하려고 할 때 내부 서버 오류 페이지가 계속 표시됩니다.

이미 스크립트에

ini_set('memory_limit', '2G'); 
    set_time_limit(0); 
    error_reporting(E_ALL); 
    ini_set('display_errors', true); 

를 설정 한하지만 여전히 약 45 초 지점 실패 유지합니다. 나는 ini_get_all()을 체크했는데 설정이 고집 스럽다.

스크립트를 필요한만큼 실행할 수 있도록 조정해야하는 다른 설정이 있습니까?

+1

_ "내부 서버 오류 페이지가 계속 나타남"_ 표준 메시지 ... _ "이 오류에 대한 자세한 정보는 서버 오류 로그에서 사용할 수 있습니다"_ ...? – CBroe

+0

실제로 잘못된 오류 로그 파일을보고 왜 유용하지 않은지 궁금해했습니다. –

답변

0

사실, 브라우저를 통해 스크립트를 테스트하고 있다는 사실을 간과했습니다. 이는 Apache가 PHP 프로세스를 처리하고 있었음을 의미합니다. mod_fcgid는 정확히 45 초의 시간 제한을 가졌습니다.

쉘과 CRON에서 직접 스크립트를 실행하면 문제가 없습니다.

0

참고 set_time_limit 함수의 경고 :

이 기능은 PHP가 안전 모드에서 실행되면 아무 효과가 없습니다. php.ini에서 안전 모드를 끄거나 제한 시간을 변경하는 것 이외의 다른 해결 방법은 없습니다.

안전 모드로 실행 중입니까? 전원을 끄십시오.

이 하나 더 큰 :

set_time_limit() 함수와 설정 지시어는 스크립트 자신의 실행 시간에 영향을 max_execution_time이라는. 스크립트가 실행 된 최대 시간을 결정할 때 system()을 사용하는 시스템 호출, 스트림 작업, 데이터베이스 쿼리 등과 같은 스크립트 실행 이외의 상황에서 발생하는 활동에 소요되는 시간은 포함되지 않습니다. 측정 된 시간이 실제 인 Windows에서는 그렇지 않습니다.

외부 시스템 호출을 사용하여 eBay에 요청하고 있습니까? 또는 데이터베이스에 대한 긴 호출?

특히 긴 작업을 profiling your php script으로 찾고 긴 작업 (> 45 초)을 찾으십시오. 이러한 작업을 작은 덩어리로 나누십시오.

+0

safemode가 꺼져 있습니다. eBay 또는 데이터베이스에 대한 긴 호출이 없습니다.각 eBay 호출은 완료하는 데 약 1-2 초가 걸리며 데이터베이스를 삽입/업데이트 한 다음 eBay 호출 페이지 2를 요청합니다. 특정 작업을 수행하는 데 오랜 시간이 걸리지 않도록 이미 모두 세분화되어 있습니다. 순서대로 많은 액션이 있습니다. –