2014-02-13 2 views
0

나는 매우 큰 파일과 5GB의 csv 파일을 가지고 있으며 PHP exec 메소드를 사용하여 사용자에게 보여주고 싶습니다.PHP exec와 리눅스 터미널에서 같은 명령을 실행합니다.

내가 대신 모든 라인의 특정 줄 번호 (라인 21 ~ 30)을 읽을 수있는 리눅스 명령을 사용하는 것을 시도했다

:

mycprogram largefile.csv | sed -n "21,30p;30q" 

바로 명령 후에 라인의 정확한 수를 반환 단자를 입력 . 그러나, 나는 PHP를 exec에서 비슷한 명령을 사용할 때, 그것은 내가 원하는 줄 번호를 얻으려면 sed에 들어가기 전에 (매우 오랜 시간이 걸립니다) 메모리에 완전히로드 된 첫 번째 부분 (mycprogram largefile.csv) 기다릴 것입니다.

$cmd = "mycprogram largefile.csv | sed -n '21,30p;30q'"; 
exec($cmd, $output); 

내가 완전히로드에 mycprogram을 기다리지 않고 PHP 방법을 사용하여 나는 그것의 출력 단자에서 얻을 정확히 무엇을 얻을 수있는 모든 아이디어 : PHP 코드는 뭔가처럼?

감사 어떻게

+0

db로 가져 오기, 제안 사항에 대해 –

답변

0

largefile.csv에 라인으로 명령 mycprogram 변환 뭔가 라인합니까? 이 경우라면 완전히 처리 /로드 할 전체 이전 입력을 강요 선으로 기본 나오지 부하 모든 파일 라인으로, 스트림 흐름으로 치료에 나오지에

$cmd = "sed -n '21,30p;30q' largefile.csv > temp; mycprogram temp" ; 
+0

thx 문제가 해결되었습니다. 그러나 이것은'largefile.csv' 전체가 여전히 프로세서에 의해 처리되는 것과 같은 효과를 가지고 있습니다 ('top' 명령을 통해 볼 수 있습니다). 그럼에도 불구하고'mycprogram'에 플래그를 추가하여'sed' 대신에 원하는 줄 수를 얻었습니다. 이 교훈은 터미널에 명령을 입력했을 때와 비교해 PHP'exec'를 사용할 때 모든 프로세스 나 명령이 똑같이 동작하지 않는다는 것입니다. – CheeHow

0

사용 -u 또는 --unbuffered 옵션으로 변경.

관련 문제