2016-11-26 56 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卷曲包装完成并拂去灰尘,将会变得可用。快乐卷曲你们都。