我正在使用以下PHP代码从网页中获取og:image
属性:
$site_html = file_get_contents($some_url);
$html = new DOMDocument();
$html->loadHTML($site_html);
$meta_og_img = null;
foreach ($html->getElementsByTagName('meta') as $meta) {
if ($meta->getAttribute('property') == 'og:image') {
$meta_og_img = $meta->getAttribute('content');
}
}
我希望在每个页面加载时需要og:image
信息,因此(1)从外部获取og:image
最好(在页面加载时间方面等)每次用户加载页面时的网站或(2)获取og:image
一次并将其存储在我的服务器上?
其次,如果我要将og:image
图像存储在我的服务器上,我应该如何组织它所在的位置?
例如,如果我需要来自以下网页网址的og:image
,我将如何以及在何处将给定的og:image
存储在我的服务器上:
Link: http://www.huffingtonpost.com/2014/10/20/hong-kong-negotiations-go_n_6016982.html?utm_hp_ref=canada&ir=Canada
og:image: http://i.huffpost.com/gen/2187192/thumbs/o-UMBRELLA-COPS-facebook.jpg
我是否会将URL存储在数据库表中并为其提供唯一ID,以便og:image
的服务器目录如下所示:
/var/www/html/og_images/<ID>/image.jpg
感谢。
答案 0 :(得分:1)
最好是存储它还是每次都能获得它:最好尽可能多地保存本地存储的远程信息。必要的远程调用越多,页面加载时间越慢。如果您担心拥有最新的图像,那么有几种方法可以异步获取内容,而不会影响用户体验。
就存储而言,您可以使用多个方向。您需要确定要存储的图像数量以及空间要求。如果你有足够的磁盘空间,那么你当然可以将图像存储在本地硬盘驱动器上,但是你需要考虑随着流量的增加,对服务器的图像的请求会更多。
更智能的解决方案是研究使用像Amazon S3这样的解决方案,直接从他们的CDN CloudFront提供静态文件。然后,您不会为了提供静态文件而在您的网络服务器上产生额外的流量。
答案 1 :(得分:0)
您可以将所有内容存储到数据库中。
$url = 'http://www.huffingtonpost.com/2014/10/20/hong-kong-negotiations-go_n_6016982.html?utm_hp_ref=canada&ir=Canada';
$ogImageUrl = 'http://i.huffpost.com/gen/2187192/thumbs/o-UMBRELLA-COPS-facebook.jpg';
$image = file_get_contents('http://i.huffpost.com/gen/2187192/thumbs/o-UMBRELLA-COPS-facebook.jpg');
$escaped_url = mysql_real_escape_string($url);
$escaped_ogImageUrl = mysql_real_escape_string($ogImageUrl);
$query = 'INSERT INTO `og_images` (`url`, `og_image_url`, `image`)
VALUES ('.$escaped_url.', '.$escaped_ogImageUrl.', $image)";
我不知道将图像存储到数据库中是不是一个好主意。 归结为这个问题:&#34; blob或不blob&#34;?有关pro / contra参数,请参阅Storing Images in DB - Yea or Nay?。
Pro参数是:非常简单的SELECT查询。
您可以只存储链接和指向缓存文件夹的指针。
您只能存储链接和指向外部CDN的指针。
所有这些决定取决于用例和预期的流量。 如果这是一个低流量站点,存储到db可能就足够了 如果这是一个高流量站点,CDN层可能是更好的选择。