我在Amazon Web Services上有一个EC2实例,在同一VPC中,还有一个ElastiCache(Redis)实例。
我的EC2实例已安装Amazon Linux AMI 2015.09。我还配置了它以使用mpm_worker_module而不是prefork。配置工作正常,我可以从浏览器访问页面。

然后,我已经安装了redis客户端,并且redis-cli命令可以从ssh完美地工作。

然后,我安装了phpredis(https://github.com/nicolasff/phpredis/zipball/master -O phpredis.zip),并创建了一个简单的PHP脚本来检查其是否正常工作(一个简单的index.php)。

如果我从ssh控制台(即php index.php)启动此脚本,则效果很好。如果我启动试图从浏览器打开页面的相同脚本,则会出现此错误:Fatal error: Class 'Redis' not found
我在apache中的php.conf文件如下:

<IfModule prefork.c>
  LoadModule php5_module modules/libphp-5.6.so
</IfModule>
<IfModule !prefork.c>
  LoadModule php5_module modules/libphp-zts-5.6.so
</IfModule>

在文件夹/etc/php-zts-5.6.d中,我在其中添加了文件“redis.ini”
extension = redis.so

我还注意到redis安装会将redis.so仅添加到此文件夹
 /usr/lib64/php/5.6/modules/

而不是/usr/lib64/php-zts/5.6/modules/文件夹,因此我将其从一个文件夹复制到另一个文件夹。但它仍然无法正常工作,并出现相同的错误:
Fatal error: Class 'Redis' not found

相反,如果我使用带有Preload的autoload.php的“include”,它可以正常工作。但是我想安装phpredis,因为我们的系统每秒将对Redis Server进行数千次调用,并且phpredis自编译以来将会更快。

我究竟做错了什么?

编辑
在我的redis错误日志中,我收到此消息
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib64/php/5.6/modules/redis.so' - /usr/lib64/php/5.6/modules/redis.so: undefined symbol: compiler_globals in Unknown on line 0

另外,如果我使用prefork模块,则效果很好。如果使用工作程序,则会出现上述错误。

最佳答案

该解决方案正在执行以下步骤来安装phpredis:

  • 下载并解压缩phpredis
  • 命令zts-phpize
  • 命令./configure --with-php-config=/usr/bin/zts-php-config
  • 命令make && make install

  • 我在做phpize而不是zts-phpize,并且我没有添加--with-php-config选项:这就是问题所在

    当然,您必须在文件内的以下位置将redis.ini添加到/etc/php-zts-5.6.d/文件夹中:
    extension=redis.so
    

    重新启动Apache,它应该可以工作

    希望能对某人有所帮助

    附言如果要从命令行(即“php script.php”)运行,则必须同时使用phpize和简单的./configure命令进行安装。

    10-07 17:35