Как использовать 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'или коснитесь любых других статических атрибутов, или сделайте что-нибудь катастрофическое, используя это.

Другие вопросы по тегам