PHP代码运行得很慢?

时间:2015-02-20 03:10:39

标签: php web dynamic-websites

这是我的代码

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

2 个答案:

答案 0 :(得分:0)

我不能代表您的虚拟主机,但共享主机通常不是很好。您正在与其他用户/客户“共享”所有服务器的资源。这是CPU,RAM和带宽。

所有主机都超载,某些主机会过度拥挤服务器。也就是说,8秒钟内的8个网页听起来并不那么糟糕。

切换到具有无竞争带宽的VPS可能会有所帮助,尽管这取决于你正在抓取的网站有足够的带宽(问题可能在另一端)。

如果您在家中或工作中有快速宽带连接,请尝试安装Apache或XAMPP并在本地测试您的脚本。如果它很快,你的主人就是问题。

值得注意的另一点是,如果您正在通过请求锤击他们,目标网站可能会限制您的连接。

答案 1 :(得分:0)

<强>更新

  

但这两个文件都在同一个域上。我有什么可以做的吗?

     

是的,执行代码的网页与提取$ 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()$filename

中的网址中提取元标记

最有可能是你的问题。这与使用您的Web浏览器访问URL基本相同 - 您必须等待其他Web服务器像往常一样提供文件,因此响应时间会有很大变化以及服务页面所需的总时间将至少访问这8个远程网址所需的时间。

如果你真的需要这样做,你可以使用cURL,这样你可以控制超时,什么不能,但总的来说你仍然会受到其他服务器响应时间的影响。