2016-11-26 9 views
0

PHP에서 cURL/FTP 용 래퍼 클래스 작성하기. 특정 cURL 옵션이있는 파일 등의 표준 작업을 가져 오거나 넣을 때 cURL은 기본 응답으로 FTP 디렉토리 색인을 반환하지 않습니다.cURL FTP 사용자 지정 명령 : dir 인덱스를 반환하지 않고 실행 하시겠습니까?

그러나 : 나는 정의를 실행하면 FTP가 CURLOPT_CUSTOMREQUEST, CURLOPT_QUOTE 또는 CURLOPT_POSTQUOTE와 명령, DELE 또는 RNFR|RNTO에 예를 들어, FTP 서버는 명령을 실행하는 것 외에도 기본 응답으로 디렉토리 인덱스를 반환합니다. (명령이 성공적으로 수행 된 경우)

CURLOPT_URL도 전달되고 색인을 업로드하거나 다운로드하지 않아도 정상적으로 작동합니다. (그리고 난 서버를 사용하여 승/O를 CURLOPT_URL, 또는 내가 사용할 수 있습니까?)하지만 난 정말 낭비 상관 없어/실행하는 모든 명령에 대한 인덱스를 받기위한 RAM을 RAM. 커다란 전화 번호부 나 많은 양의 개별 명령에 문제가있을 수 있습니다.

물론 모든 작업을 번들로 묶어 curl_exec() 전화로 낭비를 최소화 할 수 있습니다. CURLOPT_FTPLISTONLY에 추가하여 응답을 최소화 할 수 있지만 여전히 불필요한 데이터가 반환됩니다. 또는 나는 실패한 명령을 추가 할 수 있습니다. 매우 해킹 당했고 cmds가 완료되었지만 실패한 결과를줍니다. 아니면 마침내 CWD가 내가 아는 디렉토리에 들어갈 수 있겠는가? {^_^}

다음 : 디렉토리 색인을 반환하지 않도록 cURL에 알리는 방법이 있습니까? 클래스를 사용하여 다른 코드의 여러 시간/위치에서 들어오는 cURL FTP 호출에 대한 요청 풀러를 구현하면 실시간으로 개별 성공/실패 응답을 반환하지 않을 수도 있습니다.

답변

1

So. 결국이 옵션이 있습니다. 귀하의 cURL 요청에서 응답 본문을 제외하려면 다음을 수행하십시오.

curl_setopt($this->curl, CURLOPT_NOBODY, true); 

... 트릭을 수행합니다. 그런 다음 명령은 빈 문자열을 반환하거나 명령이 실패하면 bool false을 반환합니다. 마지막으로 실패한 요청에 대한 정보는 curl_error($this->curl)과 함께 제공됩니다.

이제 FTP 명령에 대한 일부 cURL 응답은 모호한면에 표시됩니다. QUOT command failed with 550 실제 FTP 트랜잭션 동안, (실패 이름 변경 시도에 대한) : 더 많은 정보까지 무엇이 잘못되었는지 그대로

> RNFR /foox/test.txt 
< 550 file/directory not found 
* QUOT command failed with 550 

. 그런 다음 CURLOPT_VERBOSE 옵션을 설정하십시오. 파일이나 표준 출력 (= 화면 상)에 로그인하지 않으려면 임시 스트림에 응답을 캡처하는 편리한 방법이 있습니다. (NB 우리는 여기에 래퍼 클래스/객체 내에서 최선을 다하고 있습니다.) 귀하의 로그에 다음과 같은 가져 오기 방법과 같은

curl_setopt(CURLOPT_VERBOSE, true); 
$this->stream_log = fopen('php://temp', 'r+b'); 
curl_setopt(CURLOPT_STDERR, $this->stream_log); 

... 뭔가 :

rewind($this->stream_log); 
return stream_get_contents($this->stream_log); 

훨씬 쉽게 디버깅 컬 거래를 만든다을 .

preg_match("#(> {$cmd}(.*?))\\v\*#s", $log, $m); 
return $m ? $m[1] : ''; 

PHP 내 FTP 컬 래퍼가 완료 : 로그의 단지 관련 세그먼트를 얻으려면 또한, 여기에 도움이 빠른 정규식 ($cmd되는 명령은 경기를 시작, 전송)이다 그리고 가루로 만들어서 사용할 수있게 할 것이다. 모두들 행복한 cURLing.