如何在不同的远程服务器上 运行 相同的 PHP 脚本?

How to run the same PHP script on different remote servers?

我在 www.principaldomaine.com

上有一个本机 PHP 脚本

我想 运行 每个客户的仪表板上都有这个独特的脚本:

等等

为此,我使用了原生 PHP 函数 include_one(),像这样:

$host_client = (isset ($_ SERVER ['HTTPS']) && $_SERVER ['HTTPS'] === 'on'? "https": "http"). ": // {$_SERVER [ 'HTTP_HOST']} {$_SERVER [ 'REQUEST_URI']}";

$include = 'https://principaldomain.com/script_client.php?key=5458978&host='.$host_client;

if (!@include_once($include)) {
    echo $error_msg;
}
else
    include_once($include);

但问题是模块 allow_url_include 没有激活,我的虚拟主机 "PlanetHoster" 出于安全原因不允许它。

我试过像这样用 HTACCESS 激活它: php_flag allow_url_include On

但效果不佳,因为 allow_url_include 是一个 PHP_INI_SYSTEM 指令。

我考虑过在 include_once () 中手动使用 $ _SERVER['DOCUMENT_ROOT'],如下所示:

$include = '/home/MyNameHosting/public_html/script_client.php';

if (! @include_once($include)) {
    echo $error_msg;
}
else
    include_once($ include);

=> 它有效!但这还不够,因为我无法像这样传递变量“key”和“host”:

$include = '/home/MyNameHosting/public_html/script_client.php?key=5458978&host='.$host_client;

你知道在这种情况下如何传递 GET 变量吗?

非常感谢。

解决方案

我认为您需要的是在另一台服务器上执行 HTTP 请求。一种解决方案可能是这样做:

// With Guzzle
// Documentation here : http://docs.guzzlephp.org
$res = $client->request('GET', 'https://principaldomain.com/script_client.php', [
    'query' => ['key' => '5458978', 'host' => $host_client]
]);

// With Curl
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://principaldomain.com/script_client.php?key=5458978&host=" . urlencode($host_client),
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}

我描述了实现您的目标的两种方法,一种使用 Guzzle,一种您需要添加到项目中的现代 PHP 库,另一种使用经典的 curl 库,它可能已经可用。

对于 Guzzle,文档在此处 Guzzle

安全问题

您 "can" 需要或包括一个远程 PHP 脚本,但它主要会增加很多安全问题,您可能真的不想这样做。这就是为什么,我认为你想做的并不完全是你问的。

这也是为什么,我不会解释如何去做。因为只有开发人员确切地知道他们在做什么,才应该 include/require 直接远程脚本。 99.9999% 的时间,您需要的是执行安全的 HTTP 请求。