首页 > 解决方案 > docker中的php Curl冲突CURLOPT_FILE和CURLOPT_RETURNTRANSFER

问题描述

当我使用带有 CURLOPT_FILEand CURLOPT_RETURNTRANSFER选项的 curl 时,文件为空,没有任何 curl 错误:

$fp = fopen($saveTo, 'w+');
$ch = curl_init($fileUrl);
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'ccc.text');

curl_exec($ch);

卷曲错误:没有错误

echo curl_strerror(curl_errno($ch)); //No error

通过删除CURLOPT_RETURNTRANSFER结果为真。

我在 php 5.6 和 7.2 中使用 apache 和 php-fpm 7.2 在 docker 中使用 nginx 对其进行测试。

标签: phpdocker

解决方案


CURLOPT_FOLLOWLOCATION需要在设置为文件句柄true 之前设置为。CURLOPT_FILE

与PHP 手册中的此评论进行比较:

似乎在设置 CURLOPT_RETURNTRANSFER 之前设置 CURLOPT_FILE 不起作用,大概是因为 CURLOPT_FILE 取决于设置的 CURLOPT_RETURNTRANSFER。

所以尝试不同的顺序:

$fp = fopen($saveTo, 'wb');
$ch = curl_init($fileUrl);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FILE, $fp);

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);    
curl_setopt($ch, CURLOPT_COOKIEJAR, 'ccc.text');

$result = curl_exec($ch);

另请参阅 PHP 手册中的这些注释: CURLOPT_FILE to STDOUTfclose以获取有关如何将输出恢复到 STDOUT 以及在 curl 完成后需要关闭文件指针/流句柄的更多信息。


推荐阅读