命令行 php mysqli 失败但通过 Web 服务器工作并在本地工作

Posted

技术标签:

【中文标题】命令行 php mysqli 失败但通过 Web 服务器工作并在本地工作【英文标题】:Command line php mysqli fails but works via web server and works in local 【发布时间】:2012-07-20 02:05:43 【问题描述】:

我有一个 shell 脚本,它在解析文本文件后调用 php 脚本在数据库中插入记录。当它调用 PHP 脚本时,我得到了找不到 mysqli 的错误:

PHP Fatal error:  Class 'mysqli' not found in /path/to/php/file.php on line 5

使用 nginx 和 PHP-FPM 和 Mysql 5.5.x 在 Macbook Pro 上本地失败,在我将套接字参数添加到 mysqli 调用后,它在本地工作。 这适用于本地数据库!

$mysqli = new mysqli("localhost", "user", "pass", "mydb", 3306, "/tmp/mysql.sock");

我部署到安装了 Linux 服务器(CentOS6 安装了 'yum install php' 和 PHP 5.3.x)。我更改了与远程 db 服务器的连接,因此删除了“/tmp/mysql.sock”,因为 db 未在此服务器上运行。

Shell脚本调用php执行脚本:

php -c "/etc/php.ini" -f "/path/to/php/file.php"

鉴于我没有在本地运行 mysql,我如何让它识别 mysqli lib 并执行。它在 CentOS6 上。我什至尝试将 mysqli.so 添加到 php.ini 文件并收到以下错误:

[mike@app2 myapp]# php -version
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/modules/mysqli.so' - /usr/lib64/php/modules/mysqli.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP 5.3.3 (cli) (built: Feb  2 2012 23:47:49) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies

感谢您提供解决此问题的任何帮助。通常我会使用 mysql(query) 但需要 mysqli() 用于脚本中的一些准备好的语句和其他位。

【问题讨论】:

一般不要使用mysql_* 【参考方案1】:

发现mysqli没有安装PHP,运行如下命令:

>php -i

这返回了 phpinfo() 并没有发现 mysqli 的提及。然后我运行 'yum' 命令来安装 php-mysqli:

>yum install php-mysqli

在此之后脚本成功运行。希望这对可能遇到类似情况的其他人有所帮助。

【讨论】:

【参考方案2】:

PHP CLI 将拥有自己的环境设置,来自网络服务器使用的环境设置。如果您在 CLI 环境中没有可用的 mysqli,则会导致此问题。

【讨论】:

谢谢迈克。知道如何添加到 CLI 环境吗? @MikeS。您是否了解如何添加到 CLI 环境?我现在正在经历同样的挑战。 @arya 查看已接受的答案。根据您的操作系统,您可能需要使用不同的软件包安装程序,例如 aptitude @MikeBrant:我在 Ubuntu LTS 14.04 操作系统上安装了 mysqli,使用:sudo apt-get install php5-mysql。同样的挑战依然存在。

以上是关于命令行 php mysqli 失败但通过 Web 服务器工作并在本地工作的主要内容,如果未能解决你的问题,请参考以下文章

PHP,AJAX,MYSQLI,不插入行[重复]

Ubuntu 16.04.4 LTS环境中php7.0使用mysqli失败,数据库无法访问

只有第一个 Mysqli Insert 查询与 PHP 工作,而其他人失败

mysqli事务在insert失败时无法回滚

使用PHP / MySQLI / Apache时,在哪里安全地存储证书/密钥?

使用 PHP 时使用 socks5 代理的 cURL 请求失败,但它通过命令行工作