php - docker中的php Curl冲突CURLOPT_FILE和CURLOPT_RETURNTRANSFER
问题描述
当我使用带有 CURLOPT_FILE
and 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 对其进行测试。
解决方案
CURLOPT_FOLLOWLOCATION
需要在设置为文件句柄true
之前设置为。CURLOPT_FILE
似乎在设置 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 STDOUT和fclose以获取有关如何将输出恢复到 STDOUT 以及在 curl 完成后需要关闭文件指针/流句柄的更多信息。
推荐阅读
- javascript - Bootstrap 4 - 附加侧边栏时无法保持相同的宽度
- sql - 需要为 SQL Server 创建函数
- c# - C# 无法从 Excel 文件中获取完整的数据表
- java - 框架的应用
- c# - 从 C# 中的特定标题名称读取 csv 文件
- c# - NCalc Evaluate() 给出错误答案
- windows - 从 Windows 7 通过 USB 连接到 Orbbec Persee 时出现问题
- java - JavaFX - 如何在可编辑的 TableView 中检查用户输入
- crm - Odoo vs 自制 cakephp 开发
- javascript - 创建自定义搜索管道以动态过滤结果后,我仍然失败:解析错误:找不到管道“过滤器”