获取远程pdf的文件大小和文件类型。并行卷曲并不总是成功获取此信息

时间:2017-04-20 06:50:44

标签: php mysql curl

我的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似乎也不成功。请帮忙。

0 个答案:

没有答案