オレオレパッチふたたび

CLIで常用でない (php.iniで読み込むようにしていない) エクステンションをちょっと使ってみるのに便利なパッチ。
コマンドラインオプションで --dl foo とすることで -d extension=foo.sodl("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;