1

我正在编写一个脚本,该脚本从带有特定主题标签的推文中提取图像。通常这个脚本工作得很好,因为它只在 open_basedir 和 safe_mode 关闭没有问题的专用服务器上实现。

但是,现在,我正试图让这个脚本为一个客户端工作,该客户端将他的网站托管在一个共享服务器上,其中 open_basedir 为 ON。结果:尝试从 Twitter 图片 URL(多个客户端,如 Twitpic、Yfrog)获取重定向 URL 时给我一个错误。

这是我得到的错误:

警告:curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION 在安全模式或 open_basedir 设置时无法激活.....

基本上,脚本会在数据库中生成推文,其中还存储了 URL。但是当尝试在服务器上创建图像时,它给了我结果:“隐藏”,如下面的脚本中所述,因为它无法从直接 URL 中找到 MIME 类型。因此,存储在数据库中的 URL 需要跟随图像路径来拉取图像并创建它。

我的问题是,有没有办法重写 FOLLOWLOCATION 部分?我已经搜索了大约 3 个小时的解决方案,但似乎无法正确实施......

希望有人可以帮助我

剧本:

<?php
# Database gegevens inladen
include('config.php');

$query = mysql_query("select * from tweets where loaded=0 and hidden=0 order by id asc limit ".$maximgload);
if(mysql_num_rows($query) > 0){
while($db = mysql_fetch_object($query)){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $db->url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    $buffer = curl_exec($ch);
    curl_close($ch);
    if(!empty($buffer)){
        # Afbeelding opslaan
        $fp = fopen($imgdir.'/'.$db->id.'.temp', 'x');
        fwrite($fp, $buffer);
        fclose($fp);


        if(!function_exists('mime_content_type')) {

            function mime_content_type($filename) {

                    $mime_types = array(

                        // images
                        'png' => 'image/png',
                        'jpe' => 'image/jpeg',
                        'jpeg' => 'image/jpeg',
                        'jpg' => 'image/jpeg',
                    );

                $ext = strtolower(array_pop(explode('.',$filename)));
                if (array_key_exists($ext, $mime_types)) {
                    return $mime_types[$ext];
                }
                elseif (function_exists('finfo_open')) {
                    $finfo = finfo_open(FILEINFO_MIME);
                    $mimetype = finfo_file($finfo, $filename);
                    finfo_close($finfo);
                    return $mimetype;
                }
                else {
                    return 'application/octet-stream';
                }
            }
        }

        # Bestand omzetten naar juiste formaat
        $mimetype = mime_content_type($imgdir.'/'.$db->id.'.temp');
        # Jpg
        if($mimetype == 'image/jpeg'){
            rename($imgdir.'/'.$db->id.'.temp',$imgdir.'/'.$db->id.'.jpg');
        }
        # Png
        elseif($mimetype == 'image/png'){
            rename($imgdir.'/'.$db->id.'.temp',$imgdir.'/'.$db->id.'.png');
        }
        # Ander (onbekend) formaat? weg er mee!
        else{
            @unlink($imgdir.'/'.$db->id.'.temp');
            @mysql_query("update tweets set hidden='1' where id='".$db->id."'");
            $result = 'file '.$db->id.' onbekend';
            break;
        }

        # Thumbnail maken
        $source_image = imagecreatefromstring($buffer);
        $source_width = imagesx($source_image); 
        $source_height = imagesy($source_image); 
        $source_ratio = $source_width / $source_height; 
        $destination_ratio = $thumbwidth / $thumbheight;
        // landscape
        if($source_ratio > $destination_ratio){ 
            $temp_width = (int)($source_height * $destination_ratio); 
            $temp_height = $source_height; 
            $source_x = (int)(($source_width - $temp_width) / 2); 
            $source_y = 0; 
        }
        // portrait
        else { 
            $temp_width = $source_width; 
            $temp_height = (int)($source_width * $destination_ratio); 
            $source_x = 0; 
            $source_y = (int)(($source_height - $temp_height) / 2); 
        } 
        $destination_x = 0; 
        $destination_y = 0; 
        $source_width = $temp_width; 
        $source_height = $temp_height; 
        $new_destination_width = $thumbwidth; 
        $new_destination_height = $thumbheight;

        $thumb = imagecreatetruecolor($thumbwidth,$thumbheight);
        imagecopyresampled($thumb,$source_image,$destination_x,$destination_y,$source_x,$source_y,$new_destination_width,$new_destination_height,$source_width,$source_height);
        # Thumbnail opslaan
        if($mimetype == 'image/jpeg'){
            imagejpeg($thumb,$imgdir.'/'.$db->id.'_thumb.jpg');
        }
        else{
            imagepng($thumb,$imgdir.'/'.$db->id.'_thumb.png');
        }

        # Bijwerken in database
        mysql_query("update tweets set loaded='1', mime='".$mimetype."' where id='".$db->id."'");
        $result = 'afb '.$db->id.' gemaakt';
    }
    # Kan url niet openen? Dan uit database gooien
    else{
        mysql_query("update tweets set hidden='1' where id='".$db->id."'");
        $result = 'afb '.$db->id.' hidden';
    }
}
}
else{
$result = 'done';
}
echo '<html>
<head>
<meta http-equiv="refresh" content="2">
<title>'.$result.'</title>
</head>
</html>';
?>
4

1 回答 1

1

检查这一功能,它使用递归来模拟跟随定位

/**
 * @param cURL  $ch                     - uchwyt do cURL
 * @param int   $redirects              - przekierowania
 * @param bool  $curlopt_returntransfer - CURLOPT_RETURNTRANSFER
 * @param int   $curlopt_maxredirs      - CURLOPT_MAXREDIRS
 * @param bool  $curlopt_header         - CURLOPT_HEADER
 * @return mixed
 */
function curl_redirect_exec($ch, &$redirects, $curlopt_returntransfer = false, $curlopt_maxredirs = 10, $curlopt_header = false) {
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $data = curl_exec($ch);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    $exceeded_max_redirects = $curlopt_maxredirs > $redirects;
    $exist_more_redirects = false;
    if ($http_code == 301 || $http_code == 302) {
        if ($exceeded_max_redirects) {
            list($header) = explode("\r\n\r\n", $data, 2);
            $matches = array();
            preg_match('/(Location:|URI:)(.*?)\n/', $header, $matches);
            $url = trim(array_pop($matches));
            $url_parsed = parse_url($url);
            if (isset($url_parsed)) {
                curl_setopt($ch, CURLOPT_URL, $url);
                $redirects++;
                return curl_redirect_exec($ch, $redirects, $curlopt_returntransfer, $curlopt_maxredirs, $curlopt_header);
            }
        }
        else {
            $exist_more_redirects = true;
        }
    }
    if ($data !== false) {
        if (!$curlopt_header)
            list(,$data) = explode("\r\n\r\n", $data, 2);
        if ($exist_more_redirects) return false;
        if ($curlopt_returntransfer) {
            return $data;
        }
        else {
            echo $data;
            if (curl_errno($ch) === 0) return true;
            else return false;
        }
    }
    else {
        return false;
    }
}

示例用法:

$ch = curl_init("http://some-website.com");
$redirects = 0;
curl_redirect_exec($ch, $redirects);
$info = curl_getinfo($ch);
curl_close($ch);

代码取自:http ://antczak.org/2009/12/curl-rozwiazanie-problemu-z-curlopt_followlocation/

于 2012-04-25T18:12:35.290 回答