PHP // 如果标准包含服务器已关闭,则包含来自另一台服务器的文件

PHP // Include file from another server if the standard-include server is down

我有很多网站,我在其中使用了很多包含。我包含的那些文件位于外部包含服务器上。我的问题是:我想让这些文件冗余,所以如果包含服务器出现故障,它们将从我的第二个包含服务器中获取。 在每个网站上手动执行此操作将花费太长时间,所以我想知道是否有办法在服务器端执行此操作(因此,如果服务器出现故障,它会转发到另一台服务器)。

这是我通常如何包含文件的示例:

<?php

    $url = 'http://myincludeserver.com/folder/fileiwanttoinclude.php';

    function get_data($url) 
    {
      $ch = curl_init($url);
      $timeout = 5;
      curl_setopt($ch, CURLOPT_URL, $url);
      curl_setopt($ch, CURLOPT_POST, 1);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $_REQUEST);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
      $data = curl_exec($ch);
      curl_close($ch);

      return $data;
    }

    $returned_content = get_data($url);

    if(!empty($returned_content))
    {
      echo $returned_content;
    }
    else 
    {
      include('includes/local_error_message.php');  
    };

  ?>

感谢阅读!

简答:

您很可能想要重构您的代码。

更长的答案:

如果您真的想在服务器级别执行此操作,那么您正在考虑实施 "failover." 您可以阅读 wikipedia article, or this howto guide 以获得更深入的解释。简单地解释一下,您基本上需要 3 个 Web 服务器:

  1. 您的包含服务器
  2. 一个备份服务器
  3. 一台监控/主服务器

听起来您已经掌握了所有这三项,但理想情况下,第三项是通过第三方提供的服务,以提供额外的冗余来处理 DNS(传播 DNS 更新时仍可能出现停机) .当然,这会引入一些 陷阱 ,可能会让您最终不得不进行重构。例如,您可能 运行 到 load balancing challenges; your application now needs to consider shared resources between servers such as anything written to disk, sessions or databases. Tools like HAProxy 可以提供帮助。

更简单的选择,尤其是如果与包含关联的域对用户隐藏时,是重构并简单地用类似于您的 get_data 函数的脚本替换第三点:

function ping($domain) {
    $ch = curl_init($domain);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_NOBODY, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $response = curl_exec($ch);
    curl_close($ch);
    return $response ? true : false;
}

$server1 = 'http://example.com';
$server2 = 'http://google.com';

if (ping($server1)) {
    return $server1;
} else {
    return $server2;
}
exit;

这将需要您更新所有文件,但好消息是您可以通过遍历所有 PHP 文件并通过 regex or by using a tokenizer 替换代码来自动执行该过程。您如何实施此选项完全取决于您的实际代码以及每个站点之间的任何差异。

这里唯一需要注意的是,它可能会使您的服务器的点击率翻倍,因此最好以设置环境或全局变量然后定期执行的方式使用它通过 cron.

希望对您有所帮助。