cURL FTP 自定义命令:运行 w/o 返回目录索引?
cURL FTP Custom Commands: Run w/o returning dir index?
正在为 PHP 中的 cURL/FTP 编写包装器 class。当我使用特定的 cURL 选项获取或放置文件等标准操作时,cURL 不会 return FTP 目录索引作为默认响应。
但是: 当我 运行 使用 CURLOPT_CUSTOMREQUEST
、CURLOPT_QUOTE
或 CURLOPT_POSTQUOTE
自定义 FTP 命令时,例如 DELE
或 RNFR|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 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
选项。如果您不想记录到文件或标准输出(= 在屏幕上),这里有一种将响应捕获到临时流中的简便方法。 (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 包装器完成并除尘后,将可用。祝大家冰壶快乐。
正在为 PHP 中的 cURL/FTP 编写包装器 class。当我使用特定的 cURL 选项获取或放置文件等标准操作时,cURL 不会 return FTP 目录索引作为默认响应。
但是: 当我 运行 使用 CURLOPT_CUSTOMREQUEST
、CURLOPT_QUOTE
或 CURLOPT_POSTQUOTE
自定义 FTP 命令时,例如 DELE
或 RNFR|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 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
选项。如果您不想记录到文件或标准输出(= 在屏幕上),这里有一种将响应捕获到临时流中的简便方法。 (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 包装器完成并除尘后,将可用。祝大家冰壶快乐。