Php 获取远程pdf的文件大小和文件类型。Parallel Curl在获取此信息方面并不总是成功的
我的mysql数据库中有大约2500个远程PDF链接。 我已经设置了获取这些链接的代码,并使用multiplecurl(并行curl库)来连接和获取文件大小和文件类型。 基本上我想检查一个文件是否在服务器上被删除/修改。 因此,在数据库中,当我保存所有链接时,我保存了当时文件的大小(以字节为单位)和类型 我有一个cron设置来从数据库获取所有这些链接,并动态获取文件大小和类型。 这是我的密码:Php 获取远程pdf的文件大小和文件类型。Parallel Curl在获取此信息方面并不总是成功的,php,mysql,curl,Php,Mysql,Curl,我的mysql数据库中有大约2500个远程PDF链接。 我已经设置了获取这些链接的代码,并使用multiplecurl(并行curl库)来连接和获取文件大小和文件类型。 基本上我想检查一个文件是否在服务器上被删除/修改。 因此,在数据库中,当我保存所有链接时,我保存了当时文件的大小(以字节为单位)和类型 我有一个cron设置来从数据库获取所有这些链接,并动态获取文件大小和类型。 这是我的密码: $link_details = array(); $max_requests = 400;
$link_details = array();
$max_requests = 400;
$curl_options = array(
CURLOPT_NOBODY => 1,
CURLOPT_HEADER => 0,
CURLOPT_FOLLOWLOCATION => 1,
CURLOPT_MAXREDIRS => 3,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT_MS => 20000
);
$parallel_curl = new ParallelCurl($max_requests, $curl_options);
foreach ($unique_links as $link)
{
$parallel_curl->startRequest($link, 'on_request_done', '');
}
$parallel_curl->finishAllRequests();
function on_request_done($content, $url, $ch, $search)
{
global $link_details;
$data = array();
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$content_type = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
$content_length = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);
//echo "$url--$httpcode--$content_type--$content_length<br>";
/*$sql_query = " SELECT 1 ";
mysql_query($sql_query);*/
curl_close($ch);
if (($httpcode != 200 && $httpcode >= 400) || (empty($content_length) && empty($content_type)))
{
$link_details[$url]['file_size'] = get_remote_file_size($url);
$link_details[$url]['content_type'] = get_remote_header_info('content_type', $url);
/*$link_details[$url]['file_size'] = 0;
$link_details[$url]['content_type'] = '';*/
return;
}
else
{
$link_details[$url]['file_size'] = $content_length;
$link_details[$url]['content_type'] = $content_type;
return;
}
}
function get_remote_file_size($url)
{
ini_set('max_execution_time', 0); //no limit
stream_context_set_default(array('http' => array('method' => 'GET')));
$value = strlen(@file_get_contents($url));
/*if(!$value)
{
$value = NULL;
}*/
return $value;
}
function get_remote_header_info($get, $url)
{
ini_set('max_execution_time', 5); //no limit
stream_context_set_default(array('http' => array('method' => 'HEAD')));
$head = @array_change_key_case(@get_headers($url, 1));
$value = '';
if(empty($head))
{
return NULL;
}
else
{
if($get == 'file_size')
{
$value = isset($head['content-length']) ? $head['content-length'] : NULL;
}
else
{
$value = isset($head['content-type']) ? $head['content-type'] : NULL;
}
return $value;
}
}
$link_details=array();
$max_请求=400;
$curl\u options=数组(
CURLOPT_NOBODY=>1,
CURLOPT_头=>0,
CURLOPT_FOLLOWLOCATION=>1,
CURLOPT_MAXREDIRS=>3,
CURLOPT_头=>0,
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_SSL_VERIFYPEER=>false,
CULLOPT_超时_MS=>20000
);
$parallel\u curl=新的ParallelCurl($max\u请求,$curl\u选项);
foreach($unique\u links作为$link)
{
$parallel_curl->startRequest($link,'on_request_done','');
}
$parallel_curl->finishAllRequests();
请求完成时的函数($content、$url、$ch、$search)
{
全球$link_详细信息;
$data=array();
$httpcode=curl\u getinfo($ch,CURLINFO\u HTTP\u代码);
$content\u type=curl\u getinfo($ch,CURLINFO\u content\u type);
$content\u length=curl\u getinfo($ch,CURLINFO\u content\u length\u DOWNLOAD);
//echo“$url--$httpcode--$content\u type--$content\u length
”;
/*$sql\u query=“选择1”;
mysql\u查询($sql\u查询)*/
卷曲关闭($ch);
如果($httpcode!=200&&$httpcode>=400)| |(空($content_-length)&&empty($content_-type)))
{
$link\u details[$url]['file\u size']=获取远程文件大小($url);
$link\u details[$url]['content\u type']=get\u remote\u header\u info('content\u type',$url);
/*$link\u details[$url]['file\u size']=0;
$link\u details[$url]['content\u type']=''*/
返回;
}
其他的
{
$link\u details[$url]['file\u size']=$content\u length;
$link\u details[$url]['content\u type']=$content\u type;
返回;
}
}
函数获取远程文件大小($url)
{
ini_集('max_execution_time',0);//没有限制
流\u上下文\u设置\u默认值(数组('http'=>array('method'=>'GET'));
$value=strlen(@file\u get\u contents($url));
/*如果(!$value)
{
$value=NULL;
}*/
返回$value;
}
函数get\u remote\u header\u info($get,$url)
{
ini_集('max_execution_time',5);//没有限制
流上下文设置默认值(数组('http'=>array('method'=>HEAD'));
$head=@array\u change\u key\u case(@get\u headers($url,1));
$value='';
如果(空($头))
{
返回NULL;
}
其他的
{
如果($get==‘文件大小’)
{
$value=isset($head['content-length'])?$head['content-length']:NULL;
}
其他的
{
$value=isset($head['content-type'])?$head['content-type']:NULL;
}
返回$value;
}
}
$link\u details
实际上是一个数组,其中URL作为数组键。
如果CURL检索不成功,我尝试使用函数get\u remote\u file\u size()
和get\u remote\u header\u info()
来获取大小和类型
仅供参考,每次完成CURL请求时,都会调用on_request_done()函数。
有时,CURL成功地获得了这些信息,但有时却不是
我还发现,在302重定向的情况下,CURL似乎不成功,即使我已将
FOLLOW\u LOCATION
设置为true。请提供帮助。代码可能正确,但服务器可能会拒绝您的请求(负载过高、速率限制等)。设置用户代理和引用者(模仿真实的浏览器)有时会有所帮助好吧,我想,我可以通过以下代码设置代理:CURLOPT_USERAGENT=>“Mozilla/4.0(兼容;MSIE 8.0;Windows NT 6.1)”;但是,我怎样才能添加一个referer呢;没用。我不确定这是否是由于远程服务器的问题。URL是几分钟前的[link],CURL可以获取此远程pdf的大小和类型。现在,它无法使用REST客户端进行测试,并且无法获得良好的响应(这是一个html响应)-因此我猜这是远程站点上的一个错误