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)