如何在不同的远程服务器上 运行 相同的 PHP 脚本?
How to run the same PHP script on different remote servers?
我在 www.principaldomaine.com
上有一个本机 PHP 脚本
我想 运行 每个客户的仪表板上都有这个独特的脚本:
www.client1.com
www.client2.com
www.client3.com
等等
为此,我使用了原生 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 请求。
我在 www.principaldomaine.com
我想 运行 每个客户的仪表板上都有这个独特的脚本:
www.client1.com
www.client2.com
www.client3.com
等等
为此,我使用了原生 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 请求。