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それ以外の場合は、の機能をライブラリに入れて、コハナから呼び出すのが理想的です。しかし、それはあなたにとって選択肢ではないように思えます。/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。コハナコードではおそらくこれらを使用しません($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'たり、他の静的属性に触れたり、これを使用して壊滅的なことをしたりする必要もあります。

于 2013-02-16T08:58:29.343 に答える