1

我正在使用 Kohana 3.2,并且我希望能够调用另一个返回application/json响应的脚本(与 Kohana 无关,在其“管辖范围”之外)。当我尝试使用:

$response = json_decode(Request::factory('/scripts/index.php?id=json')->execute()->body());

它错误地说没有通往scripts/index.php. 所以我尝试使用Request_Client_External

Request_Client_External::factory()->execute(Request::factory('/scripts/index.php?page=s'))->body();

给我Request_Exception [ 0 ]: Error fetching remote /scripts/index.php?page=s [ status 0 ] Could not resolve host: scripts; Host not found。看来它需要一个使用 http/https 的完整标记 URL,但是如何避免它执行真正的外部请求的开销?

做一个

Request::factory(url::site('/scripts/index.php?page=s', 'http'))->execute()

有效,但它被认为是“外部的”吗?

4

1 回答 1

1

对您的问题的简短回答是,Request::factory()->execute()实现这一目标的唯一方法是使用完整的 url 传递它(无论需要什么“开销”,这都不应该太多:您的服务器可能非常擅长自言自语)。

否则,理想情况下,您会将 的功能scripts放入库中并从 Kohana 调用它。但是,听起来这不是您的选择。如果您必须/scripts/index.php保持不变并坚持“内部”请求,则可以使用PHP 的输出缓冲,如下图所示。但是有很多警告,所以我不推荐它:最好的方法是传递一个完整的 url。

    // Go one level deeper into output buffering
    ob_start();

    // Mimic your query string ?id=json (see first caveat below)
    $_GET = $_REQUEST = array('id' => 'json');
    // Get rid of $_POST and $_FILES
    $_POST = $_FILES = array();

    // Read the file's contents as $json
    include('/scripts/index.php');
    $json = ob_get_clean();

    $response = json_decode($json);

一些警告。

首先,代码发生了变化$_GLOBALS。你可能不会在你的 Kohana 代码中使用这些(你$this->request->get()像一个好的 HMVCer 一样使用,对吧?)。但如果你这样做了,你应该“记住”,然后$old_globals = $GLOBALS;在上面的代码之前和之后恢复值、放置等$GLOBALS = $old_globals;

会话:如果您/scripts/index.php使用 `session_start() 如果您已经在 Kohana 中启动了会话,则会导致警告。

请注意,所有设置的变量都scripts/index.php将在您所在的上下文中保持设置。如果您想避免与该上下文可能发生的冲突,您将启动一个新的上下文,即将上述内容包装到它自己的函数中。

最后,您还需要确保它/scripts/index.php不会做任何类似的事情,或触及任何其他静态属性,或使用 thisKohana::base_url = 'something_else'做一些灾难性的事情。

于 2013-02-16T08:58:29.343 回答