2013-04-17 2 views
1

우분투 12.04 64 비트 컴퓨터에서 무거운 작업을 수행하는 php (버전 5.3.10) cli 응용 프로그램이 있습니다. 이 스크립트는 수신하는 데이터 세트에 따라 오랜 시간 동안 실행할 수 있습니다. 이 데이터 세트는 많은 XML, 이미지 및 MS doc 파일이 포함 된 zip 파일입니다.Php ZipArchive의 open/addFile 메서드가 큰 데이터 집합에서 치명적인 오류와 충돌합니다.

이전에이 스크립트는 작업을 완료하기 위해 몇 가지 시스템 명령 (shell, perl, java)을 사용했습니다. 그때 우리는 문제가 없었습니다. 최근에 우리는 RabbitMQ를 여러 동시 호출에 사용하기 위해 cron 기반 작업에서 자동 복구 및 모니터링을 위해 수퍼 바 이드로 이동했으며 가능한 한 쉘 호출을 피하기 위해 php의 핵심 라이브러리와 함수를 사용했습니다.

이제 프로덕션 환경에 배포 한 후 ZipArchive가 아카이브를 작성하는 데 사용 된 행에서 스크립트가 치명적으로 손상되었음을 발견했습니다. 구체적으로, "open"및 "addFile"메소드에서만. 문제가되는 데이터 세트를 여러 번 테스트 해 본 결과 실제 문제가있는 것으로 나타났습니다.

발생 된 오류는 "치명적인 오류 : 최대 실행 시간이 300 초를 초과했습니다."입니다. 우리는 exp 시간에 대한 php의 한계를 알고 있으며, "/etc/php5/conf.d"폴더 아래의 php.ini와 그 모든 설정을 두 번 확인했으며, "max_execution_time"을 0으로 설정 한 모든 곳에서 스크립트의 sapi 모드는 "phi_sapi_name()"을 사용하여 "cli"였습니다. ini_get ("max_execution_time")도 0을 반환합니다.

스크립트가 감독자에 의해 관리되는 경우에도 위의 모드와 실행 제한은 동일합니다. 이 "max_execution_time"한계 값이 300 초 동안 트리거되는 것을 알 수 없습니다.

한 가지 더,이 메시지로 인해 실제로 스크립트가 600 초 이상 실행되었습니다. 우리는 또한 ZipArchive가 그 자체로 300 초 이상을 걸렸을 때만 이것이 일어난다 고 생각합니다. 그러나 우리는 확실하지 않습니다. 또한이 때 발생하는 부분적인 zip 아카이브는 280MB에서 290MB 사이입니다. 그래서 우리는 저장소에서 PHP 소스를 다운로드하고 ZipArchive의 코드베이스에 그러한 제한이 있는지 확인하기 위해 빠른 grep을 수행했습니다. 우리는 아무것도 발견하지 못했습니다.

이제는 ZipArchive PHP 코드를 셸 명령으로 대체하려고합니다. 우리는 아직 그것을 시험하고있다. 나는 곧 우리의 연구 결과를 올릴 것이다.

이전에 그런 문제가 발생 했습니까? ZipArchive와 관련이 있습니까? ZipArchive를 사용하여 거대한 아카이브를 만드는 것이 좋습니다? 크래시되기 전에 만든 부분 zip 파일은 280MB에서 290MB 사이였습니다.

답변

0

파일 크기가 500MB 이상인 zipArchive를 사용할 때 한 번 같은 문제가있었습니다. 어떤 경우에는 크기가 상당히 작 으면 작동하지만 파일 수가 더 많을 수도 있습니다. 마지막으로 나는 리눅스 zip/unzip 명령에 대한 래퍼를 작성하고 코어에서 기본적으로 OS 레벨에서 exec()를 수행하도록 사용했다. 절대로 그런 문제가 없었습니다. 물론 당신은 모든 권한을 설정하기 위해 sysad가 필요하지만 안정적인 솔루션입니다.

+0

시도해보십시오. 그러나 그것이 던지는 오류 메시지는 근본 원인을 찾는데 도움이되지 않습니다. 이 데이터 세트에는 크기가 100MB에 가깝거나 3 개가 넘습니다. 그것은 또한 우리가 조사하고있는 것입니다. –

+0

@PeroliSivaprakasam 아파치의 타임 아웃 지시어에서 오는 것 같습니다. Apache 구성을 확인하십시오. – raidenace

+0

참. 하지만 그것은 아파치와 관련이 없습니다. 우리는 커맨드 라인에서 이것을 실행합니다. 우리는 심지어이 스크립트의 시작 부분에 ini_set ("max_execution_time", 0)을 썼습니다. 아직도 추락했다. –