다음

2013-12-21 15 views
2

간단한 PHP 스크립트입니다 PHP 스크립트 aria2c에서 독서 STDOUT :다음

<?php 
is_resource($process = proc_open('aria2c http://speedtest.rinet.ru/file100m.dat', [ 
    ['pipe', 'r'], 
    ['pipe', 'w'], 
    ['file', '/tmp/error-output.txt', 'a'] 
], $pipes, '/tmp', [])) || die(); 
fclose($pipes[0]); 
fpassthru($pipes[1]); 
fclose($pipes[1]); 
proc_close($process); 

문제는 aria2c이 완료 될 때까지 출력에서 ​​진행 데이터가 "교착 상태"된다는 것이다. aria2c 프로세스가 끝나면 모든 스크립트가 즉시 출력됩니다. 그것은 fpassthru()와 관련이 없으며 동일한 결과를 가진 일반 fread()를 시도했습니다.

흐름 :

[주의 사항] 파일이 이미 존재합니다. /tmp/file100m.dat.4로 이름이 변경되었습니다. 다음

< ... 큰 지연과 버스트 ...>

[#의 edb1dc 70MiB/100MiB (70 %) CN : 1 DL : 8.4MiB ETA : 3S]

[# edb1dc 81MiB/100MiB (81 %) CN : 1 DL : 9.7MiB ETA는 : 1S]

[#의 edb1dc 92MiB/100MiB (92 %) CN : 1 DL : 10MiB]

I과 같은 라인을 얻을 필요 정보 수집을 위해 aria2c를 기다리지 않고도 "[# edb1dc 92MiB/100MiB (92 %) CN : 1 DL : 10MiB]" 현재 진행 상황.

필자가 콘솔 aria2c에서 똑같은 명령을 실행해도 괜찮습니다.

+0

이 문제에 대한 해결책을 찾았습니까? –

+0

Nope. 다른 소프트웨어를 사용했습니다. – user2848443

답변

1

PHP에서 Aria2 다운로드 진행률 (읽기)을 모니터링하는 동안 같은 문제가 발생했습니다.

이 문제는 Aria2 코드에서 fflush(stdout)이 누락 되었기 때문에 발생하지만 PHP 코드에서 STDOUT 버퍼링 모드를 재구성하는 데 사용할 수있는 수정 사항이 있습니다. 당신과 같이 버퍼링을 사용하지 않도록 리눅스에서 stdbuf 유틸리티 나 OSX에서 unbuffer 유틸리티를 사용할 수 있습니다 :

proc_open('stdbuf -o0 aria2c ...'); // on Linux 

나 :

proc_open('unbuffer aria2c ...'); // on OSX 

(다른 비슷한 질문에이 answer에 대한 @ hek2mgl 덕분에)