2016-11-26 124 views
0

在PHP中爲cURL/FTP編寫包裝類。當我使用特定的cURL選項獲取或放置文件等標準操作時,cURL不會將FTP目錄索引作爲默認響應返回。cURL FTP自定義命令:運行不返回目錄索引?

但是:當我運行自定義FTP與CURLOPT_CUSTOMREQUESTCURLOPT_QUOTECURLOPT_POSTQUOTE命令,例如DELERNFR|RNTO,FTP服務器返回目錄索引除了運行命令的默認響應。 (如果命令成功)

這是預期的行爲,因爲CURLOPT_URL也被傳入,沒有上傳/下載索引就是你得到的。 (並且我無法使用CURLOPT_URL連接到服務器W/O,或者我可以嗎?)但我真的不在乎浪費帶寬/ RAM來接收我運行的每個命令的索引。大型目錄或大量單個命令會出現問題。

當然,我可以通過將所有操作集成到一個單一的curl_exec()調用中來最大限度地減少浪費。我可以通過添加一個CURLOPT_FTPLISTONLY來最小化響應,但這仍然是一個不必要的數據被返回的負載。或者我可以附加一個失敗的命令,非常黑客,並且只給我一個失敗結果,儘管cmd已經完成。或者我終於可以將CWD放入一個我知道是空白的目錄吧? {^_^}

然後:有沒有辦法告訴cURL不要打擾返回目錄索引?爲cURL實現請求池使用該類的其他代碼中的不同時間/位置進入的FTP調用也會阻止我實時返回單獨的成功/失敗響應。

回答

1

所以。畢竟這有一個選擇。從您的cURL請求中排除響應主體:

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

...有竅門。如果該命令失敗,該命令會返回一個空字符串或bool false。有關上次失敗的請求的信息可在curl_error($this->curl)中找到。

現在,有些捲曲響應FTP命令是在晦澀側,顯示例如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); 

使捲曲交易調試方便很多。此外,如果你想要得到的只是日誌的相關部分,這裏有一個快速的正則表達式,可以幫助($cmd是命令你送,開始比賽):

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

當我對PHP FTP捲曲包裝完成並拂去灰塵,將會變得可用。快樂捲曲你們都。