致命错误:类';ZMQ内容';未找到(但它已安装并在终端上工作)


Fatal error: Class 'ZMQContext' not found ( but it is installed and works on the terminal )

我想尝试ZeroMQ,我写了两个php文件,service.php和client.php。我用linux终端运行服务php /web/test/service.php,没关系,终端打印一个"正在等待客户端连接…"

但是,我通过chrome explorer请求我的client.php,发生了错误,我检查了我的错误.log,有消息"php致命错误:找不到类'ZMQContext'……"

并且我使用命令php -m来检查我的php扩展,zmq已经在该列表中了。

问题是ZMQ模块加载在PHP CLI(命令行界面)中,但没有加载到Apache中。因此,service.php可以从命令行顺利运行,但client.php不能使用ZMQContext,因为Apache不加载ZMQ。

有两个不同的.ini-文件。这些可能是(但可能不同,取决于您的发行版):

  • Apache的/etc/php5/apache2/php.ini
  • CLI的/etc/php5/cli/php.ini

但是,/etc/php5/conf.d/目录中的所有.ini文件都加载到Apache和CLI中。

另请参阅:PHP-外部类/库可以从apache访问,但不能从phpunit访问(与您的问题完全相反)

检查加载了哪些php.ini文件

当通过nginx(可能意味着通过php-fpm)请求时,检查(使用phpinfo)哪些php.ini文件被加载——几乎可以肯定的是,它加载的ini文件与cli不同。假设使用php-fpm,可能会加载以下ini文件:

/etc/php5/fpm/php.ini
/etc/php5/fpm/conf.d/*

并且没有列出zmq.ini文件。

为php-fpm加载zmq

按照在php上安装zmq的说明,为zeromq创建一个ini文件(或者从/etc/php5/cli/conf.d/复制这个文件,因为它显然是为cli使用而加载的):

# /etc/php5/conf.d/zeromq.ini
extension=zmq.so

然后重新启动php-fpm

sudo /etc/init.d/php5-fpm restart

并且zeromq应该可以使用。

解决这个问题的一个非常简单的方法是使用phpenmod 全局启用ZMQ(cli+Apache)

例如php5-

php5enmod zmq
service apache2 restart