使用嵌入在 Windows 7 上的 MySQLi 编译 PHP
Posted
技术标签:
【中文标题】使用嵌入在 Windows 7 上的 MySQLi 编译 PHP【英文标题】:Compiling PHP with MySQLi embedded on Windows 7 【发布时间】:2014-10-13 07:03:50 【问题描述】:我正在尝试确定是否可以在 Windows 7 环境中使用嵌入在 php 中的 mysql。 The PHP manual 表示 MySQLi 扩展具有启动和停止嵌入式 MySQL 服务器的能力。
但是 PHP.net 的 Windows 分布式构建似乎没有启用该选项。我的互联网搜索向我展示了这个问题:Compiling PHP with --enable-embedded-mysqli and --with-mysqli 这似乎表明如果我编译 PHP,我可以启用嵌入式 MySQL 服务器命令。
虽然我可以成功构建普通 PHP,但我似乎无法让 buildconf
为 configure
提供 --enable-embedded-mysqli
选项。谁能帮帮我?
【问题讨论】:
我已经确定buildconf
使用config.w32
文件来查找它的选项(我相信)。对于 MySLQi 扩展,config.m4
文件(用于在基于 Unix 的系统上构建)定义了 --enable-embedded-mysqli
选项,它允许您使用 MySLQ 嵌入式服务器编译 PHP,但是文件 config.w32
的 windows 版本没有定义这个选项。似乎我的选择是要么了解更多关于构建扩展的一般信息并“修复”问题,要么了解 Windows 上的 PHP 根本不支持 MySQL Embedded。 . .
【参考方案1】:
好的,经过广泛的研究和测试,我找到了解决方案
在 windows 上编译 PHP 依赖于 config.w32 文件来提供配置和 make 文件来配置和编译 PHP 的必要指令。 Unix 变体是 config.m4 文件。
问题是 Windows 版本没有激活嵌入式服务器的逻辑。
原始代码(只是感兴趣的部分)
if (CHECK_LIB("libmysql.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
"\\include;" + PHP_PHP_BUILD +
"\\include\\mysql;" + PHP_MYSQLI))
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
else
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"
您需要修改此代码以允许嵌入服务器。
if (PHP_EMBEDDED_MYSQLI != "no")
if (CHECK_LIB("libmysqld.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
"\\include;" + PHP_PHP_BUILD +
"\\include\\mysql;" + PHP_MYSQLI))
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
AC_DEFINE('HAVE_EMBEDDED_MYSQLI', 1, 'Embedded MySQL support enabled');
MESSAGE("\tEmbedded MySQL build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
else
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"
else
if (CHECK_LIB("libmysql.lib", "mysqli", PHP_MYSQLI) &&
CHECK_HEADER_ADD_INCLUDE("mysql.h", "CFLAGS_MYSQLI", PHP_MYSQLI +
"\\include;" + PHP_PHP_BUILD +
"\\include\\mysql;" + PHP_MYSQLI))
EXTENSION("mysqli", mysqli_source);
AC_DEFINE('HAVE_MYSQLILIB', 1, 'Have MySQLi library');
MESSAGE("\tlibmysql build");
PHP_INSTALL_HEADERS("ext/mysqli", "php_mysqli_structs.h");
else
WARNING("mysqli not enabled; libraries and headers not found");
PHP_MYSQLI = "no"
您还需要在文件顶部的 ARG_WITH() 行正下方添加以下行。
ARG_ENABLE("embedded-mysqli", "Enable the embedded mysqli server", "no");
运行 buildconf
现在将生成一个配置文件,其中包含嵌入 mysqli 和配置选项。
configure --with-extra-includes=[path-to-mysql-dir\include] --with-extra-libs=[path-to-mysql-dir\lib] --without-mysqlnd --with-mysqli=shared,libmysqldclient --enable-embedded-mysqli [other options here]
您现在可以运行 nmake
和 nmake snap
来编译 PHP :)
您需要将 libmysqld.dll 复制到 C:\mysql\php(或放置 php 的任何位置)。您可以像往常一样通过 php.ini 启用 php。
将 PHP 构建为共享模块而不是静态模块的原因是 nmake snap
失败,因为它启动 PHP 以打包 php 发行版,如果 MySQLi 是静态构建的,它现在将在启动时查找其 mysql 依赖项-当它找不到它们时,启动并静默失败(没有给出错误)。
将 mysql 配置文件 (my.ini) 放在 php.exe 上方的一个目录中,这将确保您可以指定自定义目录以将 PHP 链接到您的 mysql 构建。使用组 [embedded],而不是 [mysqld] 来传递配置。
如果我能够找到一种方法将 my.ini 文件放在与 PHP 相同的目录中,那么唯一能让这个解决方案工作得更好的方法。我将尝试从源代码构建 MySQL 以在编译时设置此变量。
【讨论】:
以上是关于使用嵌入在 Windows 7 上的 MySQLi 编译 PHP的主要内容,如果未能解决你的问题,请参考以下文章
缺少 mysqli 扩展。请检查您的 PHP 配置,Windows 7 [关闭]
Windows 10/Apache24/PHP 7.4.19 未加载 mysqli
ubuntu 16.04 上的 php 7.2 上缺少请求的 PHP 扩展 ext-mysqli *
ubuntu 16.04 上的 php 7.2 上缺少请求的 PHP 扩展 ext-mysqli *