Вот мой код
$facebook_from_file = file_get_contents('path/to/file');
$facebookfiles = explode(',', $facebook_from_file);
for($i=1;$i<=2;$i++){
$facebookfile = array_rand($facebookfiles);
$filename = "http://sitename.com/".$facebookfiles[$facebookfile];
outputtags($filename);
}
Подобный код выполняется 8 раз, чтобы получить случайные веб-страницы из другого каталога. Этот код занимает 8 секунд для выполнения. Что-то не так с этим кодом? Думаю, я должен упомянуть, что использую виртуальный хостинг iPage. Серверы iPage работают медленно?
Это код для outputtags()
function outputtags($filename, $other, $programming)
{
$html = file_get_contents_curl($filename);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$nodes = $doc->getElementsByTagName('title');
$title = $nodes->item(0)->nodeValue;
$metas = $doc->getElementsByTagName('meta');
for ($i = 0; $i < $metas->length; $i++) {
$meta = $metas->item($i);
if ($meta->getAttribute('property') == 'og:title')
$ogtitle = $meta->getAttribute('content');
if ($meta->getAttribute('property') == 'og:image')
$ogimage = $meta->getAttribute('content');
if ($other) {
if ($meta->getAttribute('property') == 'og:description')
$ogdescription = $meta->getAttribute('content');
}
}
echo '<p style="margin:0;"><a href=' . $filename . ' target=_blank>' . $ogtitle . '</a></p>';
if (!$other)
echo '<a href=' . $filename . ' target=_blank><img style="margin:0 0 40px 0;" src="' . $ogimage . '" alt=""></a></br>';
if ($other) {
if (!$programming)
echo '<a href=' . $filename . ' target=_blank><img src="' . $ogimage . '" alt=""></a></br>';
echo '<p style="margin:0 0 40px 0;">' . $ogdescription . '</p>';
}
}
Это file_get_contents_curl ()
function file_get_contents_curl($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
Я не могу говорить за ваш веб-хостинг, но общие хосты вообще не велики. Вы «делитесь» всеми ресурсами этого сервера с другими пользователями / клиентами. Это процессор, оперативная память и пропускная способность.
Все хосты перепроданы, и некоторые хосты будут переполнены серверами. Тем не менее, 8 веб-страниц за 8 секунд звучат не так уж плохо.
Переключение на VPS с неконтролируемой пропускной способностью, вероятно, поможет, хотя это зависит от того, какой веб-сайт вы просматриваете, имея достаточную пропускную способность (проблема может быть на другом конце).
Если у вас есть быстрое широкополосное соединение дома или на работе, попробуйте установить Apache или XAMPP и протестировать свой скрипт локально. Если это быстро, проблема в вашем хосте.
Еще один момент, который стоит иметь в виду, заключается в том, что целевой сайт может ограничивать ваши соединения, если вы забиваете их запросами.
ОБНОВИТЬ
Но оба файла находятся в одном домене. Что я могу с этим поделать?
Да, веб-страница, с которой выполняется код, такая же, как и откуда извлекается $ filename.
Тогда да. Доступ к ним через файловую систему, а не через 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, которые необходимо обработать, вам может не повезти, в зависимости от того, как они работают. Если они не нуждаются в реальных свойствах запроса, то вы, вероятно, можете избежать использования include для извлечения контента:
// 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();
}
Если они зависят от свойств запроса или могут повлиять на что-то на странице, которая пытается их загрузить, то это, вероятно, не очень хорошая идея.
Наиболее идеальным решением является то, что, поскольку это всего лишь мета-контент, хранить его в базе данных или конфигурационном файле где-то, что вы можете загрузить из любого места без особых последствий. у вас может быть файл с именем 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
таким образом, у вас есть некоторый контроль над временем ожидания, а что нет, но над всем, что вы все еще будете зависеть от времени отклика других серверов.