mixi のログイン用画像が大きいので、ImageMagick を使って縮小する
$ wget "http://developer.mixi.co.jp/about-platform/policies/image_guidelines/m_balloon_icon.png" $ sudo yum install ImageMagick --exclude=*.i386 $ convert -geometry 32x32 m_balloon_icon.png mixi.png
$ wget "http://developer.mixi.co.jp/about-platform/policies/image_guidelines/m_balloon_icon.png" $ sudo yum install ImageMagick --exclude=*.i386 $ convert -geometry 32x32 m_balloon_icon.png mixi.png
[192.168.162.128] cat parse_ini.php
<?php
$ret1 = parse_ini_file("sample.ini");
$ret2 = parse_ini_file("sample.ini");
[192.168.162.128] cat sample.ini
[first_section]
one = 1
five = 5
animal = BIRD
[second_section]
path = "/usr/local/bin"
URL = "http://www.example.com/~username"
parsekit にかけてみると、
[192.168.162.128] php -r 'var_dump( parsekit_compile_file("parse_ini.php", $error, PARSEKIT_SIMPLE));'
array(10) {
[0]=>
string(37) "ZEND_SEND_VAL UNUSED 'sample.ini' 0x1"
[1]=>
string(42) "ZEND_DO_FCALL T(0) 'parse_ini_file' UNUSED"
[2]=>
string(26) "ZEND_ASSIGN T(1) T(0) T(0)"
[3]=>
string(37) "ZEND_SEND_VAL UNUSED 'sample.ini' 0x1"
[4]=>
string(42) "ZEND_DO_FCALL T(2) 'parse_ini_file' UNUSED"
[5]=>
string(26) "ZEND_ASSIGN T(3) T(0) T(2)"
[6]=>
string(27) "ZEND_RETURN UNUSED 1 UNUSED"
[7]=>
string(42) "ZEND_HANDLE_EXCEPTION UNUSED UNUSED UNUSED"
["function_table"]=>
NULL
["class_table"]=>
NULL
}
当たり前かもしれないが、INI ファイルは、opコードに展開されない。つまり、APCではキャッシュしない。
[192.168.162.128] strace php parse_ini.php 2>&1
open("/home/sikaku/dev/fuwarin/trunk/php/exp/ini/sample.ini", O_RDONLY) = 8
fstat(8, {st_mode=S_IFREG|0664, st_size=130, ...}) = 0
lseek(8, 0, SEEK_CUR) = 0
read(8, "[first_section]\none = 1\nfive = 5"..., 8192) = 130
read(8, "", 8192) = 0
read(8, "", 8192) = 0
close(8) = 0
getcwd("/home/sikaku/dev/fuwarin/trunk/php/exp/ini", 4096) = 43
open("/home/sikaku/dev/fuwarin/trunk/php/exp/ini/sample.ini", O_RDONLY) = 8
fstat(8, {st_mode=S_IFREG|0664, st_size=130, ...}) = 0
lseek(8, 0, SEEK_CUR) = 0
read(8, "[first_section]\none = 1\nfive = 5"..., 8192) = 130
read(8, "", 8192) = 0
read(8, "", 8192) = 0
close(8) = 0
どうやら、同じファイルにも関わらず毎回パースしてるようだ。
bool MysqlUtil::init(const char *host, const char *user, const char *pass, const char *dbname){
if( _isInit ){
if(0 == mysql_ping(_mysql) ){
return true;
}
mysql_close(_mysql);
}
_mysql = mysql_init(NULL);
if( !mysql_real_connect(_mysql, host, user, pass, dbname, 0, NULL, 0) ){
fprintf(stderr, "ERROR:mysql_real_connect()\n");
return false;
}
if( 0 != mysql_set_character_set(_mysql, "utf8") ){
fprintf(stderr, "ERROR:mysql_set_character_set()\n");
return false;
}
_isInit = true;
return true;
}
mysql 側の設定
apreq_handle_t *hl = apreq_handle_cgi(r->pool);
apr_table_t *params = apreq_params(hl, pool);
どこでquery string をパースしてるのかを調べてみた。
library/module_cgi.c
655 APREQ_DECLARE(apreq_handle_t *)apreq_handle_cgi(apr_pool_t *pool)
671 req->handle.module = &cgi_module;
677 req->args_status =
678 req->jar_status =
679 req->body_status = APR_EINIT;
cgi_module がどこにも定義されていないと思ったら以下のMACROが
653 static APREQ_MODULE(cgi, 20050425);
以下に展開される
static const apreq_module_t cgi_module = { "cgi", 20050425, cgi_jar, cgi_args, cgi_body, cgi_jar_get, cgi_args_get, cgi_body_get, cgi_parser_get, cgi_parser_set, cgi_hook_add, cgi_brigade_limit_get, cgi_brigade_limit_set, cgi_read_limit_get, cgi_read_limit_set, cgi_temp_dir_get, cgi_temp_dir_set, };
library/module.c
32 APREQ_DECLARE(apr_table_t *)apreq_params(apreq_handle_t *req, apr_pool_t *p)
33 {
34 const apr_table_t *args, *body;
35 apreq_args(req, &args);
36 apreq_body(req, &body);
37
38 if (args != NULL)
39 if (body != NULL)
40 return apr_table_overlay(p, args, body);
41 else
42 return apr_table_copy(p, args);
43 else
44 if (body != NULL)
45 return apr_table_copy(p, body);
46 else
47 return NULL;
48
49 }
apreq_args が cgi_argsを呼んでGETパラメータ,
apreq_body が cgi_body, cgi_read を呼んでPOSTパラメータに対応する
./library/param.c
140 APREQ_DECLARE(apr_status_t) apreq_parse_query_string(apr_pool_t *pool,
141 apr_table_t *t,
142 const char *qs)
library/parser.c
114 default_parsers = apr_hash_make(default_parser_pool);
115
116 apreq_register_parser("application/x-www-form-urlencoded",
117 apreq_parse_urlencoded);
118 apreq_register_parser("multipart/form-data", apreq_parse_multipart);
119 apreq_register_parser("multipart/related", apreq_parse_multipart);
URL エンコードされた POST に対しては以下の関数で処理される。
./library/parser_urlencoded.c
158 APREQ_DECLARE_PARSER(apreq_parse_urlencoded)