Как использовать Request::factory()->execute() для вызова скрипта из другой библиотеки на том же хосте
Я использую Kohana 3.2 и хочу иметь возможность вызывать другой скрипт (не связанный с Kohana, вне его "юрисдикции"), который возвращает application/json
ответ. Когда я пытался использовать:
$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
, Похоже, ему нужен полный помеченный URL с использованием http/https, но как избежать накладных расходов при выполнении реального внешнего запроса?
Делать
Request::factory(url::site('/scripts/index.php?page=s', 'http'))->execute()
работает, но считается ли это "внешним"?
1 ответ
Короткий ответ на ваш вопрос заключается в том, что единственный способ использовать Request::factory()->execute()
чтобы достичь этого, нужно передать ему полный URL-адрес (с какими-либо "накладными расходами", которые влекут за собой, что не должно быть слишком много: ваш сервер, вероятно, неплохо общается с самим собой).
В противном случае в идеале вы бы поставили функциональность scripts
в библиотеку и позвони из Коханы. Однако, похоже, что это не вариант для вас. Если вам нужно уйти /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(), это вызовет предупреждение, если вы уже начали сеанс в этот момент в Кохане.
Обратите внимание, что все переменные установлены в scripts/index.php
останется установленным в контексте, в котором вы находитесь. Если вы хотите избежать возможных конфликтов с этим контекстом, вы должны начать новый контекст, то есть обернуть вышеупомянутое в его собственную функцию.
Наконец, вы также должны убедиться, что /scripts/index.php
не делает ничего подобного Kohana::base_url = 'something_else'
или коснитесь любых других статических атрибутов, или сделайте что-нибудь катастрофическое, используя это.