我在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:
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
命令进行安装。