使用PHP获取进入过程重载以动态设置元标记

时间:2015-05-21 04:47:06

标签: php html hosting

我正在使用RapidWeaver在www.chocchoc.club/blog/index.php上创建博客页面

由于程序的工作方式,我无法手动为每个页面设置元标记,因此尝试使用某些PHP进行操作,这样我就可以设置一些OG的Twitter卡元信息。在这种情况下,我正在使用一个函数从HTML获取URL和站点标题。这是我到目前为止所拥有的......

在php页面的最开头:

<?php

    $url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

    function getTitle($url){
      $str = file_get_contents($url);
      if(strlen($str)>0){
        preg_match("/\<title\>(.*)\<\/title\>/",$str,$title);
      return $title[1];
        }
      }
?>

这应该将变量$ url设置为页面的URL,并设置函数getTitle以获取页面的<title>标记内的文本。

以下是我用于将其放入文档的HTML和PHP:

<meta property="og:url" content="<?php echo $url; ?>" />
<meta property="og:title" content="<?php echo getTitle("$url"); ?>" />

现在这可以工作并生成我想要的HTML ...

<meta property="og:url" content="http://www.chocchoc.club/blog/files/important-news.php" />
<meta property="og:title" content="'We're stockpiling Flakes!' Brits in US aghast at Cadbury's ban | #ChocChoc Blog" />

但是,我在Godaddy共享托管上托管,自从实现此代码后,我收到了很多服务不可用错误。

检查CPU和并发连接页面时,我收到以下消息:

  

您的网站在过去24小时内受到限制   进入流程(同时运行的php和cgi脚本的数量,   以及cron作业和shell会话)限制712次

以下是过去24小时的输入流程图(我在网站上工作后的早上写这篇文章,然后查看它们就这样了。)

http://www.chocchoc.club/images/ep_godaddy.tiff

(无法发布图片,因为这是我的第一篇文章)

以下是日志中的详细信息:

http://www.chocchoc.club/images/cpu_connections_usage_details.tiff

奇怪的是,对我来说,15:00是午夜,当我独自离开时。但是...之后的过程持续了几个小时。

任何想法,如果这个PHP代码可能是罪魁祸首?!我的一个朋友说它可能是一个没有正确终止的功能?

感谢您收到任何帮助!

-Neil

1 个答案:

答案 0 :(得分:0)

任何想法,如果这个PHP代码可能是罪魁祸首? 是的,您的代码处于循环

导致问题的原因

您的函数正在使用file_get_contents此函数正在请求文件或网页的内容并将其放入字符串中。如果是网页,则将html从本网站中删除,并像普通的http请求一样运行。

因此,您要求使用当前所在的同一网站。当您加载网站时,它会一次又一次地加载网站。所以他们处于循环中。

$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";«一遍又一遍地加载网站。

修复?

当我理解正确时,RapidWeaver软件无法通过简单的功能获取页面标题。当你有权访问核心时,你可以从那里改变它,也许写一个钩子/扩展使它成为可能。

如果您想使用file_get_contents方式,可以这样做。因此,只解析来自用户的请求。但请注意,它是一种“脏”方式,可能导致内存过载和DDOS漏洞

$url = "http://" . $_SERVER[HTTP_HOST] . $_SERVER[REQUEST_URI] . "?mode=skip";

function getTitle($url){
  if($_GET['mode'] != 'skip') {
    $str = file_get_contents($url);
    if(strlen($str)>0){
        preg_match("/\<title\>(.*)\<\/title\>/",$str,$title);
        return $title[1];
      }
    }
  }