CLIで常用でない (php.iniで読み込むようにしていない) エクステンションをちょっと使ってみるのに便利なパッチ。
コマンドラインオプションで --dl foo とすることで -d extension=foo.so や dl("foo.so");
の代用ができます。
僕以外にこれで嬉しい人がいるかどうかは定かではありません。
余談ですが以前のバージョンのPHPではMac OS XにおいてPHP_SHLIB_SUFFIXがdylibとなっており、実際の拡張子(so)と異なっていましたが、いまはちゃんと#define PHP_SHLIB_SUFFIX "so"
になっています。
ちなみにMac OS XではPHPエクステンションはMach-O bundle (MH_BUNDLE)としてビルドされるので、厳密にはbundleが正しい拡張子となります。dylibはMach-O dynamically linked shared library (MH_DYLIB)のものなので論外。
--- sapi/cli/php_cli.c.orig +++ sapi/cli/php_cli.c @@ -161,6 +161,7 @@ {13, 1, "ri"}, {13, 1, "rextinfo"}, {14, 0, "ini"}, + {127, 1, "dl"}, {'-', 0, NULL} /* end of args */ }; @@ -465,6 +466,8 @@ " args... Arguments passed to script. Use -- args when first argument\n" " starts with - or script is read from stdin\n" "\n" + " --dl <name> Load extension <name>\n" + "\n" " --ini Show configuration file names\n" "\n" #if (HAVE_REFLECTION) @@ -706,6 +709,23 @@ } break; } + case 127: { + int len = strlen(php_optarg); + + cli_sapi_module.ini_entries = realloc(cli_sapi_module.ini_entries, + ini_entries_len + len + sizeof(PHP_SHLIB_SUFFIX) + sizeof("extension=\"\"\n\0")); + memcpy(cli_sapi_module.ini_entries + ini_entries_len, "extension=\"", sizeof("extension=\"")); + ini_entries_len += sizeof("extension=\"") - 1; + memcpy(cli_sapi_module.ini_entries + ini_entries_len, php_optarg, len); + ini_entries_len += len; + memcpy(cli_sapi_module.ini_entries + ini_entries_len, ".", 1); + ini_entries_len++; + memcpy(cli_sapi_module.ini_entries + ini_entries_len, PHP_SHLIB_SUFFIX, sizeof(PHP_SHLIB_SUFFIX)); + ini_entries_len += sizeof(PHP_SHLIB_SUFFIX) - 1; + memcpy(cli_sapi_module.ini_entries + ini_entries_len, "\"\n\0", sizeof("\"\n\0")); + ini_entries_len += sizeof("\"\n\0") - 2; + break; + } } } php_optind = orig_optind;