スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Tag:スポンサー広告 

【PHP】PHP extension でapacheのQUERY_STRINGを受け取る

まずおさらいとしてApacheAPIについて少し触れておきます。

サーバ(apache)に送られるGET method 文字列

つまりURLの?以降

hogehoge.com?hoge=a&hoge2=b

というリクエストの場合

hoge=a&hoge2=b

という文字列をApacheAPIで受け取るにはapacheモジュール内では以下のようにして取得することができます。
query = apr_table_get(r->subprocess_env, "QUERY_STRING");
ちなみにrは

apacheモジュールの主役request_rec構造体のポインタです

apacheモジュールの作り方はここでは詳しく触れません。

PHP extensionでこのような文字列を受け取れたらいろいろな応用ができるかもと思い開発してみようとおもいます。

以下に要点を抜粋をメモしておきます。

今回の例のextensionの名前はget_request関数とします。
この関数はGETでもらう文字列の長さを返します

hoge=hoge&hogehoge=b だったら 20

PHP_FUNCTION(get_request){

    php_struct *ctx = SG(server_context);
    const char *query;

    query = apr_table_get(ctx->r->subprocess_env, "QUERY_STRING");

    RETURN_LONG((long)strlen(query));
}

C/C++でapache handlerを書くときは上記にあげたrequest_rec構造体の扱いと動きのイメージが少し楽なんですが。(apxコマンドがテンプレート作ってくれるし)

extensionからどうやってコントロールする?というのが最初の疑問でした。

PHPのソースからそれらしきものを探してみると

/phpのソースのディレクトリ/sapi/apache2filter/
/phpのソースのディレクトリ/sapi/apache2handler/

あたりを見てみると、それらしき処理をしてるところを発見

./apache2handler/sapi_apache2.c:       http_cookie = apr_table_get(ctx->r->headers_in, "cookie");

でソースを見てみるとどうやら

php_struct *ctx = SG(server_context);
query = apr_table_get(ctx->r->subprocess_env, "QUERY_STRING");



hoge=a&hoge2=b

をextensionで受け取れそうです。

注意しなければいけないのは

php_struct構造体です

/phpのソースのディレクトリ/sapi/apache2filter/
/phpのソースのディレクトリ/sapi/apache2handler/

以下にそれぞれphp_apache.hというファイルがあるのですが、ここで定義されてるのでこれらのようなphp_structの定義が必要になってきます。ちょっと注意です。

あとは適宜http.hなどのApache関連のヘッダーなどはincludeしてください。

ちなみに僕がincludeしているヘッダーファイルは

#include "php.h"
#include "php_main.h"
#include "php_ini.h"
#include "php_variables.h"
#include "ext/standard/info.h"
#include "httpd.h"
#include "http_config.h"
#include "http_protocol.h"
#include "ap_config.h"
#include "apr_strings.h"
#include "php_get_request.h"
#include "php_apache.h"
#include "SAPI.h"

です。上記のようなget_request関数だけだったらこんなにはいりません。

先ほども注意した

php_structの定義

に関しては

自前の

#include "php_apache.h"

で対応してます。

あと少し注意なのは

Makefileのinclude pathの指定には注意してください。

僕の環境(FedoraCore10)では

-I/usr/include/apr-1/ -I/usr/include/httpd

を追加する必要がありました。
スポンサーサイト
テーマ : プログラミング
ジャンル : コンピュータ

Tag:PHP  Trackback:0 comment:0 

Comment

comment form
(編集・削除用):
管理者にだけ表示を許可
プロフィール

6rats

Author:6rats
こんにちは、ITベンチャーで働くエンジニアです
主に自分の周りで起きた技術的なことをメモとして書き残して行きます。
Android以外にもRuby/Ruby on RailsやFuelPHPなどなどたまにやります。基本的なスタンスとしては興味があるもしくは必要になったらいろんなことにチャレンジします。
最近はiOSアプリ開発を始めています。

購読
follow us in feedly
個人プロダクト

Androidアプリ

Twitterクライアント

Webアプリケーション

EcPriceWatch(Amazon価格の推移を計測、最安値を知らせるサービス)
Google AdSense
ブログ村
にほんブログ村 IT技術ブログへ
にほんブログ村
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。