我在 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
相反,如果我使用带有 autoload.php 的“包含”的 Predis,它可以正常工作。但我想安装 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 模块,效果很好。如果我使用工人,我得到了上述错误。