関数の挙動をソースを追って調べてみよう

d:id:maru_cc:20080207:1202364374

$_ENVとか$_SERVERとかはvariables_orderの設定に依存するから getenvを使ったほうがいいよ。という突っ込みを同僚から受けました。

ということがあった時に、getenv関数は$_SERVERと$_ENVの両方に同じキーで違う値が入っている場合にどういう挙動になるんだろう?という疑問が沸いた。
もちろん、実際の挙動はWebを調べればすぐにわかるのだろうが、せっかくだからCのソースから追っかけてみたら面白いかもしれないと思った。

id:mirさんに教えてももらったcscopeを使ったソース読みも最近できていないので、いい機会かな。


MySQLのソースを見ようとした時の自分の記事を参考に、落としてきたphp-5.2.5のソースを覗いてみる。
http://blog.maru.cc/archives/97


該当する箇所は、すぐに見つかった。
basic_functions.c

/* {{{ proto string getenv(string varname)
   Get the value of an environment variable */
PHP_FUNCTION(getenv)
{
    char *ptr, *str;
    int str_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
        RETURN_FALSE;
    }
    ptr = sapi_getenv(str, str_len TSRMLS_CC);
    if(ptr) RETURN_STRING(ptr, 0);
    ptr = getenv(str);
    if(ptr) RETURN_STRING(ptr, 1);
    RETURN_FALSE;
}
/* }}} */

もうちょっと深くいろいろ追っかけてみよう。
他の関数とかも見てみたら面白いかもしれない。