MySQLnd 不见了?我如何与主机提供商合作?

MySQLnd gone missing? How can I work with host provider?

我在共享主机上有几个 PHP8 项目 运行,它们使用 mysql 功能,例如 get_result()。一夜之间,一切都停止了, get_result() 现在被报告为未定义的函数。根据 Call to undefined method mysqli_stmt::get_result 我怀疑 mysqlnd 不是 installed/enabled.

示例代码:

$sql = 'SELECT * FROM projects WHERE projects.id = ? LIMIT 1';
$stmt = mysqli_prepare($db, $sql);
$stmt->bind_param("i", $project_id);
$stmt->execute();
$result = $stmt->get_result();

错误:

Fatal error: Uncaught Error: Call to undefined method mysqli_stmt::get_result()

使用来自 How to know if MySQLnd is the active driver? 的这段代码,我显然已经确定 mysqlnd 没有被使用,而 libmysqlclient 正在被使用。

<?php
if (function_exists('mysql_connect')) {
    echo "- MySQL <b>is installed</b>.<br>";
} else  {
    echo "- MySQL <b>is not</b> installed.<br>";
}

if (function_exists('mysqli_connect')) {
    echo "- MySQLi <b>is installed</b>.<br>";
} else {
    echo "- MySQLi <b>is not installed</b>.<br>";
}

if (function_exists('mysqli_get_client_stats')) {
    echo "- MySQLnd driver is being used.<br>";
} else {
    echo "- libmysqlclient driver is being used.<br>";
}

结果:

- MySQL is not installed.
- MySQLi is installed.
- libmysqlclient driver is being used.

托管服务提供商说没有任何变化,但我的代码在过去 24 小时内全部开始失败,而我没有进行任何更改。通过 phpinfo 的 PHP 构建日期是 7 天前。 PHP 版本为 8.0.10。 php 配置命令确实包含 '--with-mysql=mysqlnd',但这是 phpinfo 输出中对 mysqlnd 的唯一引用。

完整配置命令:

'./configure' '--build=x86_64-linux-gnu' '--prefix=/usr' '--includedir=${prefix}/include' '--mandir=${prefix}/share/man' '--infodir=${prefix}/share/info' '--sysconfdir=/etc' '--localstatedir=/var' '--disable-silent-rules' '--libdir=${prefix}/lib/x86_64-linux-gnu' '--libexecdir=${prefix}/lib/x86_64-linux-gnu' '--disable-maintainer-mode' '--disable-dependency-tracking' '--program-suffix=8.0' '--libdir=/usr/lib/php8.0' '--with-config-file-path=/etc/php8.0' '--with-pear=/usr/lib/php8.0' '--bindir=/usr/bin' '--includedir=/usr/include' '--with-zlib' '--enable-debug=no' '--enable-safe-mode=no' '--enable-discard-path=no' '--with-gd' '--with-png-dir' '--enable-track-vars' '--with-db' '--with-gdbm' '--enable-force-cgi-redirect' '--with-ttf' '--enable-ftp' '--with-mcrypt' '--enable-memory-limit' '--enable-calendar' '--enable-wddx' '--enable-bcmath' '--enable-gd-imgstrttf' '--enable-shmop' '--with-openssl' '--with-dom' '--with-dom-xslt' '--with-dom-exslt' '--with-imap' '--with-curl' '--with-iconv' '--with-freetype-dir' '--with-bz2' '--with-gettext' '--enable-exif' '--enable-mbstring=all' '--with-kerberos' '--with-sqlite' '--with-imap-ssl' '--with-libxml-dir' '--with-xsl' '--with-xslt-sablot' '--with-jpeg-dir' '--with-tidy' '--enable-soap' '--enable-xslt' '--enable-sqlite-utf8' '--enable-zip' '--enable-intl' '--with-mysqli=/usr/bin/mysql_config' '--with-pdo-mysql=/usr/bin/mysql_config' '--with-mysql=mysqlnd' '--with-gmp' '--with-webp-dir' '--with-sodium' '--with-password-argon2' '--with-zip' '--enable-gd' '--with-external-gd' '--with-freetype' '--with-jpeg' '--with-webp' '--with-xpm' 'build_alias=x86_64-linux-gnu'

我还能做些什么来诊断这个问题,或者挑战主机提供商的配置吗?是否有可能 mysqlnd 从未启用并且我的代码能够工作(并损坏)是出于不同的原因?

更新: 托管公司绝对坚持认为没有任何改变并且 mysqlnd 已启用,尽管有上述所有线索。还有什么可以解释这个吗?

对于 mysqli 中的 mysqlnd,正确的配置选项是 --with-mysqli,对于带有 PDO 的 mysqlnd,正确的配置选项是 --with-pdo-mysql。您的 PHP 版本编译时没有使用 mysqlnd 或 mysqlnd 未启用(某些托管服务提供商可以选择您使用的扩展程序,例如 cPanel)。但是,这通常不会显示在 phpinfo() 中。

如果您的托管服务提供商在您不知情的情况下更改了您的 PHP 版本,这会给他们留下不好的印象。我鼓励您更改托管服务提供商。提供PDO或者mysqli没有mysqlnd是不可原谅的。

在您决定升级之前,您使用的 PHP 版本应该保持不变。这很重要,因为某些版本包含重大更改。您的 PHP 可执行文件无法在您不知情的情况下静默升级,因为这可能会导致您的应用程序突然中断。