laravel redis 扩展冲突的问题分析:Fatal error: Non-static method Redis::keys() cannot be called statically

laravel中,出现 'Fatal error: Non-static method Redis::keys() cannot be called statically' 的问题分析:
	
	1.这里不得不吐槽下。按理说,这个问题,是一个很容易发生的问题!网上各种搜索,很难明白是什么原因。
	最多是一个 'redis命名空间冲突',让我们不要引用 'Redis',而是
		1.将 'config/app.php' 中的 Redis别名,修改为 'Redisxx',换一个不会冲突的
		2.将项目中的 'use Redis;',改为 'Illuminate\Support\Facades\Redis' 反正就是指定全路径
	这确实是正确的,但我之前的环境可以使用,现在的环境不可用,我不能将之前的代码中,所有的都进行替换啊,有点痛苦!

	2.找了很多文章,外加昨天正好总结了 "PHP的扩展安装" - http://blog.csdn.net/beyond__devil/article/details/65934701
		pecl,pear,phpize,php-config 等,都了解了点(原谅我,现在居然才开始看这个,还干了3年PHP了。。。)
	  大概了解产生这个问题的原因了,分析如下:
			1>我现在默认的集成环境中,系统已经安装了 redis,并且,系统的PHP,也已经安装了 'PhpRedis' 的 PECL扩展,也就是 redis.so 		// 它已经占据了 'Redis' 命名空间
			2>laravel框架,文档中,也指出了,我们使用redis,需要安装 composer require predis/predis  		// 它也使用的是 'Redis' 命名空间	  	

		2者都是Redis扩展,使用了 Redis 命名空间,所以导致冲突!

	3.了解了问题所在,我们就可进行修复:
		1>就是上面所说的,修改通过 composer 安装的 predis 的命名空间。又分2种:
			1)修改 'app/config.php',将 'Redis',改为 'RedisDB'。然后,每次引用Redis Facade时,使用 RedisDB 来替换
			2)在每个使用 use Redis; 的文件中,我们改为 use Illuminate\Support\Facades\Redis;

		2>我的服务器项目,只基于laravel,我在php配置文件中,注释掉 ';extension redis.so',不使用 pecl 安装的redis扩展,直接使用 composer 安装的redis扩展(也算推荐吧,以后我们得熟悉 composer 来搭建php应用)

	参考文章:
		https://laravel.com/docs/5.4/redis 			// laravel "英文" 官方文档(中文翻译的之前的版本,有的信息没有)
			1>官方文档中,有这么一句话:
				Alternatively, you may install the PhpRedis PHP extension via PECL. The extension is more complex to install but may yield better performance for applications that make heavy use of Redis.
			意思是:
				你也可以通过PECL安装 PhpRedis 扩展。在大量使用 redis 的PHP应用中,使用 PECL 安装的redis.so扩展,会产生更高的性能(通过我上面的教程,应该了解到 pecl 扩展,是使用 c、c++等开发的),但是就是安装稍微复杂点
			2>接着官方的redis文档,直接红色的警告!!!!
				/*
					If you have the PhpRedis PHP extension installed via PECL, you will need to rename the  Redis alias in your config/app.php configuration file.
				 */
				如果,使用了 pecl 安装的 redis.so,我们在 'config/app.php' 中,就需要重命名 'Redis' 别名。
			3>如果,我们就想使用 pecl 安装的 'redis.so' (扩展名为:PhpRedis),我们需要配置:
				config/database.php
				'redis' => [
					'client' => 'phpredis',
				],
				除了默认的host ,port, database和password配置,PhpRedis还支持 persistent, prefix, read_timeout, timeout。可在 'config/database.php' 中配置

	总结:
		官方文档,就已经解释了很清楚了,我居然不知道。。。
		还是我这个问题,太低级了。。。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个错误可能是因为 Maven 无法找到 `org.springframework.boot:spring-boot-starter-data-redis:2.7.2` 这个依赖。你可以尝试以下几个解决方案: 1. 检查你的 Maven 配置文件,确认是否添加了 Spring Boot 仓库。可以在 `pom.xml` 文件中添加以下配置: ```xml <repositories> <repository> <id>spring-snapshots</id> <name>Spring Snapshots</name> <url>https://repo.spring.io/snapshot</url> <snapshots> <enabled>true</enabled> </snapshots> </repository> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> ``` 2. 检查你的依赖是否写错了,应该是 `spring-boot-starter-data-redis` 而不是 `spring-boot-starter-redis` 3. 尝试更新 Maven 仓库,可以使用以下命令: ```bash mvn clean install -U ``` 如果以上方法都不行,你可以尝试手动下载依赖并安装到本地 Maven 仓库中。具体步骤如下: 1. 在 [https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis/2.7.2](https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis/2.7.2) 下载 `spring-boot-starter-data-redis-2.7.2.jar` 和 `spring-boot-starter-data-redis-2.7.2.pom` 2. 运行以下命令将依赖安装到本地 Maven 仓库中: ```bash mvn install:install-file -Dfile=spring-boot-starter-data-redis-2.7.2.jar -DpomFile=spring-boot-starter-data-redis-2.7.2.pom ``` 安装完成后,再次运行你的项目即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值