php5.2.14とapache2.4.3
php5.2.14とapache2.4.3でコンパイルリンクしてhttpdを動作させるとエラーになるという報告。こんなエラー。
httpd: Syntax error on line 146 of /usr/local/apache2/conf/httpd.conf: Cannot load modules/libphp5.so into server: /usr/local/apache2/modules/libphp5.so: undefined symbol: unixd_config
"unixd_config"というシンボルが見えないといっています。apache2.2+php5.2.14では問題なし。apache2.4+php5.3でも問題なし。
早速ソースを調査してみる。まずphpの方。当該シンボルを使っているのは以下の一箇所だけ。
./sapi/apache2hander/php_functions.c中のPHP_MINFO_FUNCTIONという関数です。
PHP_MINFO_FUNCTION(apache) { char *apv = php_apache_get_version(); smart_str tmp1 = {0}; char tmp[1024]; int n, max_requests; char *p; server_rec *serv = ((php_struct *) SG(server_context))->r->server; #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE) AP_DECLARE_DATA extern unixd_config_rec unixd_config; #endif (中略) #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE) snprintf(tmp, sizeof(tmp), "%s(%d)/%d", ap_unixd_config.user_name, unixd_config.user_id, ap_unixd_config.group_id); php_info_print_table_row(2, "User/Group", tmp); #endif
変数宣言でexternしているので、どうもapacheの外部変数を参照しているようです。
apache2.2.22のソースで当該箇所を探すとos/unix/unixd.cの54行目にありました。
unixd_config_rec unixd_config;
次にapache2.4.3の同じファイルの同じところをチェック。
unixd_config_rec ap_unixd_config;
ほう。名前が変わったんですね。構造体の中身まではチェックしていませんが。
そうすると、php側で参照している変数名をapacheに合わせればいいってことでunixd_configをap_unixd_configへ変更するパッチがこちら。
--- sapi/apache2handler/php_functions.c.orig 2012-09-07 15:15:37.403662055 +0900 +++ sapi/apache2handler/php_functions.c 2012-09-07 14:58:38.755648593 +0900 @@ -383,7 +383,7 @@ char *p; server_rec *serv = ((php_struct *) SG(server_context))->r->server; #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE) - AP_DECLARE_DATA extern unixd_config_rec unixd_config; + AP_DECLARE_DATA extern unixd_config_rec ap_unixd_config; #endif for (n = 0; ap_loaded_modules[n]; ++n) { @@ -414,7 +414,7 @@ php_info_print_table_row(2, "Hostname:Port", tmp); #if !defined(WIN32) && !defined(WINNT) && !defined(NETWARE) - snprintf(tmp, sizeof(tmp), "%s(%d)/%d", unixd_config.user_name, unixd_config.user_id, unixd_config.group_id); + snprintf(tmp, sizeof(tmp), "%s(%d)/%d", ap_unixd_config.user_name, ap_unixd_config.user_id, ap_unixd_config.group_id); php_info_print_table_row(2, "User/Group", tmp); #endif
このパッチでphpを再makeしてinstall,httpdを再起動。
真面目に動作確認はしていませんが、httpdはちゃんと起動してくれました。修正したところはphpinfo()でユーザ名など表示させるところだと思うんだけど、phpinfo()もちゃんと見えたので多分問題ないかと思われます。