如何将请求沙箱到另一个PHP脚本?

时间:2010-08-12 20:52:10

标签: php

我有一个主要由Ajax驱动的站点,其内容通过向“操作员”PHP脚本发出请求来填充。

虽然这些请求通常来自Javascript,但有时候从另一个PHP脚本中查询我的运算符会很有用。

我一直使用的方法是通过file_get_contents()传递带查询字符串的URL - 然后用json_decode()解析返回的JSON。

出于多种原因,我想避免这种实现,但是......我在错误日志中看到,URL请求更容易因为任何原因而失败 - 而且我已经读过它不是很高效。

我首次尝试在输出缓冲区内query_operator($query_string) - require()创建通用operator.php - 类型函数,使用ob_get_contents()捕获。我还使用从$query_string解析的参数临时重置$ _REQUEST数组。

这种方法有太多缺点 - 变量范围问题和MySQL连接,特别是。

我的第二次尝试涉及使用反引号运算符(相当于shell_exec()),并将$argv参数映射到$_REQUEST数组。

这种方法实际上效果很好,但在我使用的主机上,PHP(cli)版本设置为4.4.8 - 我需要5.2.x.假设我无法切换(cli)版本,那么使用查询字符串将请求沙箱化到另一个PHP脚本的下一个最佳方法是什么?任何建议都非常感谢。

这是我的第二次尝试:

function query_operator($query) {
    $query = '--'.str_ireplace('&', ' --', $query);
    $contents = `php operator.php $query`;
    if ($json = json_decode($contents, true)) {
        return $json;
    } else {
        return $contents;
    }
}

1 个答案:

答案 0 :(得分:1)

从长远来看,最好的办法就是考虑你的代码。

无论运行operator.php的逻辑是什么,都应该存在于某个库中,然后可以由operator.php和任何其他需要它的脚本使用。

当你这样做时,你将避免额外PHP进程的所有开销,两个进程之间的通信,以及可能所有的json编码/解码。

如果因素分析现在需要做太多工作,那么您描述的任何一种策略都应该作为一种解决方案。可能值得研究为什么你的make-a-loopback-http-request方法(你描述的第一件事)导致了错误。它确实应该运作良好,即使它效率低下。