cURL 文件下载适用于 PHP 5.3,不适用于 5.5

cURL file download works on PHP 5.3 not on 5.5

我有两台服务器在不同的软件版本中运行类似的 Web 应用程序。

两台服务器都运行 CentOS 6.5

一个有 Apache 2.2 php 5.3

而另一个正在运行 Apache 2.4 php 5.5

此应用程序的主要功能之一是定期从远程下载 CSV 文件URL

这是使用 cURL 和以下代码完成的:

$filename = 'export.csv';
$url = 'http://www.someaddress.com/export/' . $filename;
$curl = curl_init();
$fd = fopen(DIR_FS_ADMIN . 'temp/' . $filename , "w");
curl_setopt ($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_FILE, $fd);
curl_exec ($curl);
curl_close ($curl);

如您所见,一段非常简单的代码在 PHP 5.3

中运行良好

这是 curl_getinfo()

的结果
[content_type] => text/csv
[http_code] => 200
[header_size] => 209
[request_size] => 95
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 1.98925
[namelookup_time] => 0.816404
[connect_time] => 0.817009
[pretransfer_time] => 0.831392
[size_upload] => 0
[size_download] => 13564110
[speed_download] => 6818705
[speed_upload] => 0
[download_content_length] => 13564110
[upload_content_length] => -1
[starttransfer_time] => 0.834829
[redirect_time] => 0
[certinfo] => Array
    (
    )

[redirect_url] => 
)
Error Code: 0

这些是相同代码在 5.5 上运行的结果

[content_type] => 
[http_code] => 0
[header_size] => 0
[request_size] => 0
[filetime] => -1
[ssl_verify_result] => 0
[redirect_count] => 0
[total_time] => 126.332476
[namelookup_time] => 0.000369
[connect_time] => 0
[pretransfer_time] => 0
[size_upload] => 0
[size_download] => 0
[speed_download] => 0
[speed_upload] => 0
[download_content_length] => -1
[upload_content_length] => -1
[starttransfer_time] => 0
[redirect_time] => 0
[redirect_url] => 
[primary_ip] => 
[certinfo] => Array
    (
    )

[primary_port] => 0
[local_ip] => 
[local_port] => 0
)
7 Failed to connect to www.someaddress.com/export/: Connection timed out

当然,在发帖之前我已经研究并尝试了很多选项,增加超时时间,尝试资源的 SSL 版本,并且玩了很多不同的 curl_setopt 但是,我总是得到无法从 5.5 应用连接。

我知道 5.5 上的 cURL 扩展做了一些更改,但我可以通过 Google 搜索找到上传问题,我也尝试了完全不同的选项就像使用 file_get_contents 但仍然没有,只是超时。

两个服务器都位于同一个地方,URL 是完全打开的,所以我真的怀疑问题出在文件位置,因为当我在 5.3 服务器上运行代码时仍然可以正常工作。

来自 php 手册

Uploads using the @file syntax are now only supported if the CURLOPT_SAFE_UPLOAD option is set to FALSE. CURLFile should be used instead.

curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true); 

There are "@" issue on multipart POST requests.

    Solution for PHP 5.5 or later:
    - Enable CURLOPT_SAFE_UPLOAD.
    - Use CURLFile instead of "@".

    Solution for PHP 5.4 or earlier:
    - Build up multipart content body by youself.
    - Change "Content-Type" header by yourself.

The CURLFile class

原来 URL 我试图访问的服务器 IP 被阻止了!

我可以联系网站管理员并将我的 IP 地址列入白名单,现在代码可以正常工作,无需任何更改。

还有一点要记住,是什么让调试变得如此困难,因为它只是超时,没有任何错误消息或任何类型。