使用嵌入在 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,但我似乎无法让 buildconfconfigure 提供 --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]

您现在可以运行 nmakenmake 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 *

将 WireGuard 嵌入到 Windows 上的 Go 应用程序中

在 Windows 7 嵌入式标准上安装 MSVC 可再发行组件