2015-02-20 1 views
1

Вот мой кодPHP-код работает очень медленно?

$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; 
} 
+0

Является ли файл 'path/to/file' локальным? И что такое 'outputtags()'? –

+0

Что именно делает 'outputtags()' do? Получает ли он на самом деле получение контента из URL-адреса в '$ filename'? Если это так, вероятно, проблема - вы по существу загружаете эту страницу через http. И насколько велик файл, на который ссылается 'путь/в/файл'? – prodigitalson

+0

'path/to/file' - это локальный файл' outputtags() 'извлекает метатеги из url в' $ filename' –

ответ

0

Я не могу говорить за хостинга, но общие хозяева вообще не велики. Вы «разделяете» все ресурсы этого сервера с другими пользователями/клиентами. Это процессор, оперативная память и пропускная способность.

Все хосты перепроданы, а некоторые хосты будут перегружать серверы. Тем не менее, 8 веб-страниц за 8 секунд звучат не так уж плохо.

Переключение на VPS с неподходящей пропускной способностью, вероятно, поможет, хотя это зависит от того, что вы очищаете веб-сайт, имея достаточную пропускную способность (проблема может быть на другом конце).

Если у вас есть быстрое широкополосное подключение дома или на работе, попробуйте установить Apache или XAMPP и проверить свой скрипт локально. Если это быстро, проблема вашего хозяина.

Еще один момент, который стоит иметь в виду, заключается в том, что целевой сайт может ограничивать ваши соединения, если вы набиваете их запросами.

0

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, чтобы у вас был некоторый контроль над таймаутом, а что нет, но по сравнению с тем, что вы по-прежнему будете во власти откликов других серверов.

+0

Но оба файла находятся в одном домене. Могу ли я что-нибудь сделать? –

+0

Тот же домен, и что более важно, файловая система как код, который вы отправили, который пытается получить к ним доступ? – prodigitalson

+0

Да, веб-страница, с которой выполняется код, такая же, как и при извлечении имени файла. –

 Смежные вопросы

  • Нет связанных вопросов^_^