cURL FTP 自定义命令:运行 w/o 返回目录索引?

cURL FTP Custom Commands: Run w/o returning dir index?

正在为 PHP 中的 cURL/FTP 编写包装器 class。当我使用特定的 cURL 选项获取或放置文件等标准操作时,cURL 不会 return FTP 目录索引作为默认响应。

但是: 当我 运行 使用 CURLOPT_CUSTOMREQUESTCURLOPT_QUOTECURLOPT_POSTQUOTE 自定义 FTP 命令时,例如 DELERNFR|RNTO,FTP 服务器 return 除了 运行 命令之外,还将目录索引作为默认响应。 (如果命令成功。)

这是预期的行为,因为 CURLOPT_URL 也被传入,没有 upload/download 索引就是你得到的。 (而且我无法使用 CURLOPT_URL 连接到服务器 w/o,我可以吗?)但我真的不想浪费 bandwidth/RAM 来接收我 运行。大目录或大量单个命令会有问题。

当然,我可以通过将所有操作捆绑到一个 curl_exec() 调用中来最大程度地减少浪费。我可以通过添加 CURLOPT_FTPLISTONLY 来最小化响应,但这仍然是一大堆不必要的数据 returned。或者我可以附加一个失败的命令,非常骇人听闻,尽管 cmd 已完成,但只给我一个失败的结果。或者我最终可以 CWD 进入一个我知道是空白的目录,对吧? {^_^}

然后: 有没有办法告诉 cURL 不要打扰 returning 目录索引?使用 class 为来自其他代码中的各种 times/locations 的 cURL FTP 调用实现请求池也会阻止我 returning 中的个人 success/fail 响应实时。

所以。毕竟有一个选项。要从您的 cURL 请求中排除响应正文:

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

...成功了。如果命令失败,则命令 returns 一个空字符串或 bool falsecurl_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 选项。如果您不想记录到文件或标准输出(= 在屏幕上),这里有一种将响应捕获到临时流中的简便方法。 (N.B。我们在这里使用包装器 class/object。)

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);

使 cURL 事务调试变得更加容易。此外,如果您只想获取日志的相关部分,这里有一个快速的正则表达式可以提供帮助($cmd 是您发送的命令,开始匹配):

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

当我的 FTP PHP 的 cURL 包装器完成并除尘后,将可用。祝大家冰壶快乐。