UPDATE
Но оба файла находятся на том же домене. Могу ли я что-нибудь сделать?
Да, веб-страница, с которой выполняется код, такая же, как и при извлечении имени файла.
Тогда да. Доступ к ним через файловую систему не через URL. Я не знаю, что делает ouputtags
, но я предполагаю, что вы используете file_get_contents
внутри.
Поэтому вместо подачи URL-адреса укажите путь к файлу. Похоже, файлы, которые вы получаете мета-теги из все перечисленные из корневого каталога документов вашего сайта, так что может быть столь же легко, как:
for($i=1;$i<=2;$i++){
$facebookfile = array_rand($facebookfiles);
// filename is now something like
// /var/www/site.com/the_face_book_file.html
$filename = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . $facebookfiles[$facebookfile];
outputtags($filename);
}
Конечно, если они являются .php файлы, которые должны быть обработаны, то вам может быть не повезло, в зависимости от того, как они работают. Если они не нужны реальные свойства запроса, то вы, вероятно, можете уйти с использованием включает тянуть содержание:
// you would add this function and then replace your call
// to file_get_contents_curl() with it
function file_get_contents_php($filename) {
ob_start();
include($filename);
return ob_get_clean();
}
Если они зависят от свойств запроса или могут повлиять на что-то на странице Thats пытается загрузить их то это, вероятно, не очень хорошая идея.
Самое идеальное решение состоит в том, что, поскольку это всего лишь метаконтент, хранить его в базе данных или файле конфигурации где-нибудь, что вы можете загружать из любого места без каких-либо последствий.Вы, возможно, файл с именем metas.json
:
{
"/facebook/file/url_1.php": {
"title": "Url 1",
"og": {
"title": "Url 1",
"description": "This is the og:description for url_1.php",
"image": "http://somesite.com/path/to/url1/image.jpg"
}
},
"/facebook/file/url_2.php": {
"title": "Url 2",
"og": {
"title": "Url 2",
"description": "This is the og:description for url_2.php",
"image": "http://somesite.com/path/to/url2/image.jpg"
}
},
"/facebook/file/url_3.php": {
"title": "Url 3",
"og": {
"title": "Url 3",
"description": "This is the og:description for url_3.php",
"image": "http://somesite.com/path/to/url3/image.jpg"
}
},
"/facebook/file/url_4.php": {
"title": "Url 4",
"og": {
"title": "Url 4",
"description": "This is the og:description for url_4.php",
"image": "http://somesite.com/path/to/url4/image.jpg"
}
}
}
На этих страницах вы могли бы просто создать такую функцию:
/**
* Get a hash of meta tags for a page URI
*
* Returns an associative array of tags and values or false
* if the URI is not present in configuration.
*
* @param String $uri The URI of the page
* @return Array|Boolean
*/
function get_metas($uri) {
$json = file_get_contents('/path/to/metas.json');
$metas = json_decode($json, true);
return $metas && isset($metas[$uri])
? $metas[$uri]
: false;
}
/**
* Includes meta tags for a URI
*
* @param String $uri The URI of the page
* @return void
*/
function include_meta_tags($uri) {
if (false !== ($metas = get_meta_tags($uri))) {
echo $metas;
}
}
/**
* Gets an HTML string of meta tags for a URI
*
* @param String $uri The URI of the page
* @return String|Boolean
*/
function get_meta_tags($uri) {
$metas = get_metas($uri);
if (!$metas) {
return false;
}
$tags = array();
if (isset($metas['title'])) {
$tags[] = sprintf('<title>%s</title>', $metas['title']);
}
if (isset($metas['og']) {
foreach ($metas['og'] as $property => $value) {
$tags[] = sprintf('<meta property="og:%s" content="%s">', $property, $value);
}
}
return impolde("\n", $tags);
}
Итак, в голове всех ваших страниц, которые вы можете сделать:
<?php echo include_meta_tags($_SERVER['REQUEST_URI']); ?>
И тогда ваша функция outputtags будет выглядеть следующим образом:
function outputtags($uri, $other = null, $programming = null) {
$metas = get_metas($uri);
$ogtitle = isset($metas['og']['title'])
? $metas['og']['title']
: $metas['title'];
$ogdescription = isset($metas['og']['description'])
? $metas['og']['description']
: $metas['title'];
$ogimage = isset($metas['og']['image'])
? $metas['og']['image']
: '';
// now your existing logic for outputting the markup
printf(
'<p style="margin:0;"><a href="%s" target="_blank">%s</a></p>'
$uri,
$ogtitle
);
if (!$other) {
printf(
'<a href="%s" target="_blank"><img style="margin:0 0 40px 0;" src="%s" alt="" /></a><br />'
$uri,
$ogimage
);
} else {
if (!$programming) {
printf(
'<a href="%s" target=_blank><img src="%s" alt="" /></a></br>',
$uri,
$ogimage
);
printf('<p style="margin:0 0 40px 0;">%s</p>', $ogdescription);
}
}
}
outputtags()
экстракты мета-теги из URL в $filename
Ну есть ваша проблема, скорее всего. Это по сути то же самое, что и попадание URL-адреса в ваш веб-браузер - вам нужно подождать, пока другой веб-сервер будет обслуживать файл, как обычно, так что время ответа будет сильно отличаться и общее время, затрачиваемое на обслуживание вашей страницы будет, как минимум, временем, которое потребуется для доступа к этим 8 удаленным URL-адресам.
Если вам действительно нужно это сделать, вы можете использовать cURL
, чтобы у вас был некоторый контроль над таймаутом, а что нет, но по сравнению с тем, что вы по-прежнему будете во власти откликов других серверов.
Является ли файл 'path/to/file' локальным? И что такое 'outputtags()'? –
Что именно делает 'outputtags()' do? Получает ли он на самом деле получение контента из URL-адреса в '$ filename'? Если это так, вероятно, проблема - вы по существу загружаете эту страницу через http. И насколько велик файл, на который ссылается 'путь/в/файл'? – prodigitalson
'path/to/file' - это локальный файл' outputtags() 'извлекает метатеги из url в' $ filename' –