使用HTTP请求中的代码模拟PHP包含语句

时间:2015-08-20 07:46:22

标签: php function http curl include

我有一个用PHP编写的主要“驱动程序”脚本,并且基于某些标准,我希望这个脚本通过HTTP从一个或多个支持服务器中提取代码,以便将函数加载到内存中,就好像我已经完成了所以使用PHP include语句。

是否可以在PHP中使用HTTP请求来提取返回时实际解释为PHP代码的数据?

例如,假设我使用cURL或Web服务返回存储在变量中的以下文本,例如$ URLResponse:

function userKeyGet() {
  return (isset($_SESSION['user_key']) ? $_SESSION['user_key'] : '-1');
  }  

如果我之后使用了诸如eval($ URLResponse)之类的东西,是否会创建在当前执行调用PHP脚本期间使用的函数?我已经使用cURL和Buzz来返回JSON或类似结构化的数据,我已将其转换为数组,但不是函数或类。这可能吗?谢谢。

1 个答案:

答案 0 :(得分:1)

您可以使用include()include_once()require()require_once()函数加载远程PHP代码,它需要在php.ini中启用allow_url_include

$code="function userKeyGet() {
  return (isset(\$_SESSION['user_key']) ? \$_SESSION['user_key'] : '-1');
  }";

eval($code);
eval($code); # Second time using eval on $code with "Fatal error: Cannot redeclare"

# This will work
echo userKeyGet();

# An example for anonymous function way
$code="\$userKeyGet = function() {
       return (isset(\$_SESSION['user_key']) ? \$_SESSION['user_key'] : '-1');
       };";

eval($code); # this wont raise redeclare error 

echo $userKeyGet();

包含的文件应包含代码,而不是服务器将其解释为可执行文件,因此如果您使用的是支持php的Web服务器,则可以为远程文件提供另一个扩展名。

eval()也会起作用。如果你使用eval / include并且声明两次相同的函数,它将引发致命错误,因为它已经被声明了。您可以使用对象或anonymous functions覆盖该功能。

<select name="filter">
  <option selected value="">All</option>
  <option value="newest">Newest</option>
</select>