我的mysql数据库中有大约2500个远程PDF链接。 我已设置代码来获取这些链接并使用多个curl(并行curl LIBRARY)来连接和获取文件大小和文件类型。 基本上我想检查服务器上是否删除/修改了文件。 因此,在数据库中,当我保存所有链接时,我保存了当时文件的大小(以字节为单位)和类型。
我有一个cron设置来从db获取所有这些链接并动态获取文件大小和类型。 这是我的代码:
$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
实际上是一个数组,其URL为数组键。
如果CURL在检索时不成功,我会尝试使用函数get_remote_file_size()
和get_remote_header_info()
来获取大小和类型。
FYI,每次完成CURL请求时都会调用on_request_done()函数。 有时,CURL成功获取这些信息,但有时候,它不是。
我还发现,在302重定向的情况下,即使我将FOLLOW_LOCATION
设置为true,CURL似乎也不成功。请帮忙。