cURL文件下载适用于PHP5.3,而不是5.5
我有两台服务器在不同的软件版本中运行类似的web应用程序 两台服务器都运行CentOS 6.5 一个是Apache2.2PHP5.3 另一个运行Apache2.4PHP5.5 此应用程序的关键功能之一是定期从远程URL下载CSV文件 这是使用cURL和以下代码完成的:cURL文件下载适用于PHP5.3,而不是5.5,php,apache,curl,download,php-5.5,Php,Apache,Curl,Download,Php 5.5,我有两台服务器在不同的软件版本中运行类似的web应用程序 两台服务器都运行CentOS 6.5 一个是Apache2.2PHP5.3 另一个运行Apache2.4PHP5.5 此应用程序的关键功能之一是定期从远程URL下载CSV文件 这是使用cURL和以下代码完成的: $filename = 'export.csv'; $url = 'http://www.someaddress.com/export/' . $filename; $curl = curl_init(); $fd = fopen
$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);
正如您所看到的,一段非常简单的代码在PHP5.3中非常有效
这是curl_getinfo()的结果
这些都是在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扩展已经做了一些更改,但是我可以通过谷歌搜索找到上传问题的点,我也尝试了完全不同的选项,比如使用file_get_内容,但仍然没有,只是超时
两台服务器位于同一个位置,URL完全打开,因此我真的怀疑问题是否在文件位置内,因为我在5.3服务器上运行代码时仍能正常工作。来自手册
现在,仅当CURLOPT_SAFE_UPLOAD选项设置为FALSE时,才支持使用@file语法的上载。应该改用CURLFile
多部分POST请求中存在“@”问题
结果是我试图访问的URL被服务器的IP阻止了 我可以联系网站管理员并列出我的IP地址,现在代码可以正常工作,不需要任何更改
还有一点需要记住,是什么使调试变得困难,它只是超时,没有错误消息或任何类型的错误。我知道这一点,正如我在评论中所说,我知道CURLFile类,但这个文件对象仅用于从您已有的本地文件上载到服务器。但是,即使我使用curl_setopt($curl,CURLOPT_FILE,$fd);从代码中取出并尝试获取内容,我仍然在资源上获得了一段时间…还有一个参考链接,我尝试使用CURLOPT_SAFE_UPLOAD,但没有成功,但我想我最终发现了问题,显然我尝试获取请求的服务器拒绝了我服务器IP的所有内容,这就解释了为什么相同的代码可以在不同的服务器上工作,并且可以从任何其他网站下载。谢谢你的回答,仍然要确认这一点,只要网站管理员白名单我的IP的
[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
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
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.