2017-01-28 5 views
0

를를 끝까지 읽어되지 않는 PHP, 간부는 명령을 정렬 출력 파일이 잘립니다 '표시'만 입력 파일은 완전히 내가</p> <p><code>exec('sort /var/www/website/file_in.txt -o /var/www/website/file_out.txt');</code></p> <p>에 정렬 명령의 출력 파일을 PHP를 사용하는 경우

입력 파일 크기 = 2,442,541

출력 파일 크기 = 1,146,881


,174,515

을 trunacted되고

PHP 함수 filesize (file_in.txt)를 사용할 때, 터미널 세션에 표시된 올바른 크기가 아니라 반환 된 값 = 1,146,881입니다. filesize()를 호출하기 전에 clearstatcache()를 호출했습니다.

흥미롭게도 filesize는 file_in의 크기를 file_out이 잘리는 값으로보고합니다.

Linux _x86_64 64 비트 PHP 버전을 실행 중이므로 파일 크기가 2MB 인 경우 32 비트 파일 크기 제한 문제가 없어졌습니다. I WWW 사용자 데이터로서 터미널 세션에서 정렬 명령을 실행할 때


는 출력 파일을 입력 파일 잘리는 같은 크기이다.


나는 그것이 가능한 PHP의 버퍼 제한을 우회 바라고, 간부에서 호출하는 쉘 스크립트를 작성했지만,이 같은 잘린 출력 파일이 있습니다.


나는 TOP CPU 및 메모리 사용량을 볼 수있는 별도의 터미널에서 실행,하지만 출력을 절단하지 않는 단말기에서 실행되는 coammdn 때문에, 이것은 PHP의 문제가 될 것으로 보인다.


이 문제를 해결하기 위해 확인해야하는 모호한 구성 .ini 설정이 있습니까?

감사


추가 정보 : 내가 잘립니다되지 않는 출력 파일을 실현 아니라, 입력 파일이 완전히 EOF 때까지 읽을 수 없습니다.

+1

이 도움이 될 수있다 : http://www.computerhope.com/unix/usort.htm, "SIZE 다음에 곱하기 접미사 뒤에 " –

+0

제안 해 주셔서 감사합니다. 그러나 해당 웹 페이지에는 SIZE와 관련된 -S (버퍼 크기) 옵션이 나열되지 않습니다. 그러나 귀하의 제안을 조사 할 때, 다음과 같은 웹 페이지를 발견했습니다 : https://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html, 버퍼 크기에 대한 더 나은 설명을 제공하므로 귀하의 노력은 도움이됩니다. 다음에 버퍼 크기 테스트를 시도 할 것입니다. 또한 절손 (truncation)을 이해하는 데 도움이 될 수있는 --debug 옵션이 있음을 알게되었습니다. –

+0

N.B> --debug를 동시에 사용할 수 없습니다 - 출력 파일이 사용 중입니다. 디버그는 stndout (즉, 터미널 세션 화면)을 사용합니다. –

답변

0

이것은 PHP 스크립트가 실행되는 시점에서 사용 가능한 메모리 부족으로 인한 것으로 보입니다.

시범 테스트를 통해 4K, 5K, 10K, 40K로 시작하는 SORT 명령의 옵션 --buffer-size = 4K가 증가했지만 트릭은 없었습니다.

CPU 사용률이 어떻게보고되었는지 TOP를보고있었습니다.

나는 원래의 질문에서이 문제를 설명하지 않았지만 EXEC를 통해 SORT를 호출하기 전에 EXEC를 통해 pdftotext를 호출하고있었습니다. 프로세스가 실행 중일 때 서버의 CPU 사용량은 최대 98 %까지 증가했습니다. 메모리가 급증했을 수도 있지만 TOP의 재생 빈도로는이를 캡처하지 못했습니다.

SORT 명령이 호출되기 전에 sleep(5)을 추가하여 PHP 스크립트의 실행을 일시 중지하고 CPU 및 메모리 스파이크가 정상적으로 돌아갈 시간을 줄 수 있다고 상상했습니다. SORT가 전체 입력 파일을 읽고 모든 내용을 출력하는 문제를 해결했습니다. 이것은 또한 잘못된 filesize() 결과를 해결했습니다.

프로덕션 환경에서 용량이 큰 서버를 스핀 업하고 sleep(5) 지연을 제거하려고합니다. 나는 시작 수준 "라면 국수"에 도착할 때까지 기다릴 수 없다 :)