Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 获取远程pdf的文件大小和文件类型。Parallel Curl在获取此信息方面并不总是成功的_Php_Mysql_Curl - Fatal编程技术网

Php 获取远程pdf的文件大小和文件类型。Parallel Curl在获取此信息方面并不总是成功的

Php 获取远程pdf的文件大小和文件类型。Parallel Curl在获取此信息方面并不总是成功的,php,mysql,curl,Php,Mysql,Curl,我的mysql数据库中有大约2500个远程PDF链接。 我已经设置了获取这些链接的代码,并使用multiplecurl(并行curl库)来连接和获取文件大小和文件类型。 基本上我想检查一个文件是否在服务器上被删除/修改。 因此,在数据库中,当我保存所有链接时,我保存了当时文件的大小(以字节为单位)和类型 我有一个cron设置来从数据库获取所有这些链接,并动态获取文件大小和类型。 这是我的密码: $link_details = array(); $max_requests = 400;

我的mysql数据库中有大约2500个远程PDF链接。 我已经设置了获取这些链接的代码,并使用multiplecurl(并行curl库)来连接和获取文件大小和文件类型。 基本上我想检查一个文件是否在服务器上被删除/修改。 因此,在数据库中,当我保存所有链接时,我保存了当时文件的大小(以字节为单位)和类型

我有一个cron设置来从数据库获取所有这些链接,并动态获取文件大小和类型。 这是我的密码:

$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响应)-因此我猜这是远程站点上的一个错误