使用 php 包括来自另一台服务器的 php 文件

Posted

技术标签:

【中文标题】使用 php 包括来自另一台服务器的 php 文件【英文标题】:including php file from another server with php 【发布时间】:2011-02-14 17:13:21 【问题描述】:

我有两个 php 文件位于不同的服务器上,一个位于 http://www.mysite.com/main.php,另一个位于 http://www.sample.com/includeThis.php

我想包含第一个文件中的第二个文件。

第二个文件的内容是这样的:

<?php
$foo = "this is data from file one";

还有第一个文件:

<?php
include "http://www.sample.com/includeThis.php";
echo $foo;

有什么办法可以做到吗?

【问题讨论】:

刚刚在谷歌上搜索到这里。如果另一台服务器在同一台服务器的内网中怎么办?这对于公司级别的代码重用和 PHP 原生负载平衡非常有用。 如何使用上传到服务器 1 的 API,而不是在其他服务器上的 php 代码中使用该 API。 【参考方案1】:

不,此设置在大多数 Web 服务器 (php.ini) 中默认禁用/不允许,因此出于安全原因,您不能使用 include 包含来自远程地址的文件.

如果您仍想允许包含远程文件,则必须在 php.ini 中将指令 allow_url_include 设置为 On

但从面向安全的角度来看,这又是一种不好的做法;因此,它通常被禁用(实际上我从未见过它启用)

如果你想读取远程文件的内容,你可以使用 file_get_contents 函数代替 BUT 这将是作为纯 html 标记代码返回,不会有任何服务器端代码。

【讨论】:

是的,您可以使用file_get_contents 而不是file_put_contents 将其存储在您的服务器上,然后使用include 就可以了。尽管做 IMO 是一件危险且有风险的事情。但有可能。您甚至可以从中提取某些代码,并仅从文件中编写您需要的代码。 我有权限使用 php.ini 我已经启用了 allow_url_include。但是当我使用提到的方法时。我在变量中什么都没有。表示变量为空。我不知道如何将它传递给 main.php 我正在使用这种方法来防止人们破解我的脚本。所以我的服务器上会有一部分脚本。这就是为什么我需要使用这种方法 如果你允许_url_include,我需要知道为什么有风险而不是好的做法。因为我需要建立一个系统,我可以在其中制作带有许可证到期日期的 Php 表。【参考方案2】:

在阅读了您的 cmets 之后 - 您在其中声明您希望这样做作为一种复制保护手段 - 我的回答是强调,算了。这不是复制保护的工作原理。

您可以使用include() 做的唯一事情是从其他地方获取源代码以在本地解释器上进行解释。这很容易破解:恶意客户只需 echo() 获取的代码。

远程执行远程脚本(在您的服务器上)对您没有帮助,因为该脚本的状态(变量、函数...)不会出现在您调用它的脚本中。

您有以下选择:

编译/编码/混淆脚本,可能需要特定的 PHP 模块来执行它(SO 上有很多关于此的问题)

创建在您的服务器上运行并执行请求的操作的真实 Web 服务(例如使用 SOAP)

尽管如此,我个人不购买,也不建议客户购买编码脚本和需要“打电话回家”才能工作的脚本。我相信通过严格的许可协议来保护你的产品(这会吓到商业客户购买你的产品,因为被抓到偷窃的风险太高了。)

【讨论】:

【参考方案3】:

我想知道 OP 是否曾为自己找到解决方案。据我所知,唯一可行的方法是将您的所有客户帐户与您要包含的脚本放在同一台服务器上 - 我做了类似的事情:

/path_to_myserver_root/httpdocs/clients/client01/wwwroot/scriptA.php /path_to_myserver_root/httpdocs/clients/client02/wwwroot/scriptA.php 等等……

那么: /path_to_myserver_root/privatefiles/myapp/scriptB.php

wwwroot 是每个客户端域指向的位置。

scriptA.php 有一些业务逻辑,然后包含 scriptB.php 的功能,上面的完整路径:

require('/path_to_myserver_root/privatefiles/myapp/scriptB.php')

scriptB.php 位于服务器上受保护的私有目录中,http 无法访问,客户端也无法访问。

现在请注意,我这样做的原因是为了保持多个帐户的版本一致性,而不是从我的客户那里保留一些专有的神奇 php 代码 - 但我想它可以为此目的实现。

嗯,YMMV。

【讨论】:

【参考方案4】:

当您按照您的建议尝试跨域时,您实际上并没有包含一个已经准备好执行的文件 - 过程是不同的。机器需要通过 http 带回文件,这不是 include 语句的全部内容。

此外,如果您使用共享主机,PHP 通常会配置为防止您离开自己的域。

如果您不受此限制,一种解决方案可能是使用 PHP 从另一台服务器复制回该文件的副本,然后将其包含在您的域中。另一种方法可能是编写一个小的“部署”脚本,在您进行更改时将其复制到需要的任何地方......

希望这会有所帮助...

马丁

【讨论】:

我不想复制另一边的文件。因为正如我之前所说,我使用这种方法来防止人们破解我的脚本。所以我的服务器上会有一部分脚本。这就是为什么我需要使用这种方法。 在互联网上拥有脚本如何帮助保护您的脚本?我不确定我是否理解你的方法...... 我有 2 个脚本,第一个是我将要卖给我的客户的主要脚本。第二个具有第一个脚本的主要功能。所以为了使用带有函数的脚本。用户必须经过身份验证才能获得包含的功能。表示主脚本取决于函数脚本。如果任何破解者试图使脚本为空,它将无法工作。换句话说,由于包含文件保存在我的服务器上,因此无法破解它。所以除非他是合法客户,否则没有人可以访问它。我希望你明白我在这里想要做什么。【参考方案5】:

将第一个重命名为 .txt 那么三思而后行,你确定需要跨域包含吗

【讨论】:

【参考方案6】:

使用file_get_contents,打开文件,将其附加到第二个文件,如下所示:

$secondFile = file_get_contents('http://www.sample.com/includeThis.php');
file_put_contents('your_file', $secondFile, FILE_APPEND);

如果您想将它放在文件的末尾,这将起作用。不仅仅是在你的文件中包含。

无论如何,就像我说的那样,这是有风险和危险的 IMO,尤其是如果您不确定其中包含的内容。

此外,your_file 需要是实际的服务器路径,而不是 URL。

【讨论】:

您也可以使用file_put_contents 将其存储在您的服务器上,而不是将其写入文件。

以上是关于使用 php 包括来自另一台服务器的 php 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PHP 中将上传的文件移动到另一台主机

PHP 通过CURL上传文件到另一台服务器

php网站的独立文件服务器

php 在一台机器上解析失败,但在另一台机器上解析失败

使用php从localhost连接到另一台服务器的数据库[关闭]

在另一台服务器上移动 PHP 应用程序时无法访问 MySQL 视图