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

PHP//如果标准包含服务器关闭,则包含来自另一个服务器的文件,php,function,server,include,forward,Php,Function,Server,Include,Forward,我有很多网站,在那里我使用了很多的包含。我包含的那些文件位于外部包含服务器上。我的问题是:我想使这些文件成为冗余文件,因此如果include服务器宕机,它们将从我的第二个include服务器获取。 在每个网站上手动执行此操作将花费太长的时间,因此我想知道是否有一种方法可以在服务器端执行此操作(因此,如果服务器停机,则将其转发到其他服务器) 以下是我通常如何包含文件的示例: <?php $url = 'http://myincludeserver.com/folder/fileiw

我有很多网站,在那里我使用了很多的包含。我包含的那些文件位于外部包含服务器上。我的问题是:我想使这些文件成为冗余文件,因此如果include服务器宕机,它们将从我的第二个include服务器获取。 在每个网站上手动执行此操作将花费太长的时间,因此我想知道是否有一种方法可以在服务器端执行此操作(因此,如果服务器停机,则将其转发到其他服务器)

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

<?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');  
    };

  ?>


谢谢你的阅读

简短回答:

您很可能想要重构代码

更长的回答:

如果您真的想在服务器级别实现这一点,那么您正在考虑实现“故障切换”。您可以阅读本文或本文以获得更深入的解释。简单地说,您基本上需要3台web服务器:

  • 您的包含服务器
  • 备份服务器
  • 监视/主服务器
  • 听起来您已经获得了所有三项,但bullet three理想情况下是通过第三方提供的一项服务,用于处理DNS的额外冗余(在传播DNS更新时,仍然可能会出现停机)。当然,这引入了一些可能会导致最终重构的陷阱。例如,你可能会遇到挑战;您的应用程序现在需要考虑服务器之间的共享资源,如写入磁盘、会话或数据库的任何东西。像这样的工具会有所帮助

    更简单的选择,尤其是当与include关联的域对用户隐藏时,是重构并简单地用类似于
    get_data
    函数的脚本替换bullet three:

    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文件并通过或使用。如何实现此选项完全取决于实际代码以及每个站点之间的差异

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


    我希望这会有所帮助。

    只需检查包含是否成功,如果不包含另一个。使用Jquery ajax并使用
    $.ajax({/..success:function(data,textStatus,xhr){console.log(xhr.status);},complete:function(xhr,textStatus){console.log(xhr.status);});这样您就知道服务器是否出现故障了。谢谢您的回答,但这是最简单的部分!如果我这样做,我必须在我使用的每一个include上都这样做(比如1000+)。我正在寻找一种方法来做到这一点,这样我就不必编辑每一个文件上的每一个website@jogoe你是说
    get_data
    函数已经被复制了1000多次吗?你不是真的要通过不安全的http连接传输要包含/执行的代码,是吗?老实说,这是一种从不同地点使用代码的可怕方式,通过网络加载文件的开销非常高,而且也很危险。使用NFS托管公共文件,看在上帝的份上,不要为此使用internet!谢谢你调查我的问题,并提出了这些好主意!我要调查一下,试试看!