我正在编写一个脚本,该脚本从带有特定主题标签的推文中提取图像。通常这个脚本工作得很好,因为它只在 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>';
?>