Php 如何使用Request::factory()->;execute()从同一主机中的另一个库调用脚本

Php 如何使用Request::factory()->;execute()从同一主机中的另一个库调用脚本,php,request,kohana,kohana-3.2,Php,Request,Kohana,Kohana 3.2,我使用的是Kohana 3.2,我希望能够调用另一个脚本(与Kohana无关,在其“管辖范围”之外),该脚本返回application/json响应。 当我尝试使用: $response=json_decode(请求::工厂('/scripts/index.php?id=json')->execute()->body()); 它错误地说没有到scripts/index.php的路径。所以我尝试使用Request\u Client\u External Request\u Client\u Ex

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

$response=json_decode(请求::工厂('/scripts/index.php?id=json')->execute()->body());
它错误地说没有到
scripts/index.php
的路径。所以我尝试使用
Request\u Client\u External

Request\u Client\u External::factory()->execute(Request::factory('/scripts/index.php?page=s'))->body();
给我
Request\u Exception[0]:获取远程/scripts/index.php时出错?page=s[status 0]无法解析主机:脚本;找不到主机
。看起来它需要一个使用http/https的完整标记URL,但是如何避免它执行真正的外部请求的开销呢

做一个

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

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

您的问题的简短答案是,使用
Request::factory()->execute()
来实现这一点的唯一方法是使用传递完整的url(不管需要多少“开销”,这不应该太多:您的服务器可能非常擅长与自己对话)

否则,您最好将
脚本的功能放入库中,并从Kohana调用它。然而,听起来这不是你的选择。如果您必须保持
/scripts/index.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);
一些警告

首先,代码更改为
$\u GLOBALS
。您可能不会在Kohana代码中使用这些选项(您像使用好的HMVCer一样使用
$this->request->get()
,对吧?)。但如果您这样做了,您应该“记住”并恢复这些值,将
$old\u globals=$globals等,以及
$GLOBALS=$old\u GLOBALS之后

会话:如果您的
/scripts/index.php
使用'session_start(),则如果此时您已经在Kohana启动了会话,则会发出警告

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


最后,您还需要确保
/scripts/index.php
不会执行类似于
Kohana::base\u url='something\u other'
,或触摸任何其他静态属性,或执行灾难性操作。

问题的简短答案是使用
请求::工厂()->execute()的唯一方法
要实现这一点,可以使用传递完整的url(不管需要多少“开销”,这不应该太多:您的服务器可能非常擅长与自己交谈)

否则,您最好将
脚本的功能放入库中,并从Kohana调用它。然而,听起来这不是你的选择。如果您必须保持
/scripts/index.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);
一些警告

首先,代码更改为
$\u GLOBALS
。您可能不会在Kohana代码中使用这些选项(您像使用好的HMVCer一样使用
$this->request->get()
,对吧?)。但如果您这样做了,您应该“记住”并恢复这些值,将
$old\u globals=$globals等,以及
$GLOBALS=$old\u GLOBALS之后

会话:如果您的
/scripts/index.php
使用'session_start(),则如果此时您已经在Kohana启动了会话,则会发出警告

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


最后,您还需要确保
/scripts/index.php
不会做任何类似于
Kohana::base\u url='something\u other'
,或者触摸任何其他静态属性,或者做一些灾难性的事情。

很好的解释,但我想我会坚持
请求::工厂(url::site('/scripts/index.php','http'))
并让主机通过HTTP进行操作。遗憾的是,如果不进行额外的HTTP调用,我就无法调用该文件夹!如果您的目的是避免发出HTTP请求(为什么?),我只是想:您可以使用
exec
启动一个新的PHP(CLI)实例,如下所示:
$response=json\u decode(exec(“PHP-r'\$\u SESSION=json\u decode(''''''''''.json\u encode.)”);\$\u请求[\\\'id\']='u GET[\'id\']='json\'“json\”;包括(\'/scripts/index.PHP\”););。您可能希望以与我传递会话相同的方式传递
$\u COOKIE
。但是,是的,HTTP请求是一种方式。很好的解释,但我想我还是坚持使用
request::factory(url::site('/scripts/index.php','HTTP'))
,让主机通过HTTP来完成。遗憾的是,如果不进行额外的HTTP调用,我就无法调用该文件夹!如果您的目的是避免发出HTTP请求(为什么?),我只是想:您可以使用
exec
启动一个新的PHP(CLI)实例,如下所示:
$response=json\u decode(exec(“PHP-r'\$\u SESSION=json\u decode(''''''''''.json\u encode.)”);\$\u请求[\\\'id\']='u GET[\'id\']='json\'“json\”;包括(\'/scripts/index.PHP\”););。您可能希望以与我传递会话相同的方式传递
$\u COOKIE
。但是是的,HTTP请求是一种方式。上个星期回答你