Php 如何使用Request::factory()->;execute()从同一主机中的另一个库调用脚本
我使用的是Kohana 3.2,我希望能够调用另一个脚本(与Kohana无关,在其“管辖范围”之外),该脚本返回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
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请求是一种方式。上个星期回答你