【问题标题】:Laravel 4 : Call to undefined method Redis::connection()Laravel 4:调用未定义的方法 Redis::connection()
【发布时间】:2014-11-16 12:29:17
【问题描述】:

我要为这个错误发疯了。 我有一个 Debian 7 的 vagrant VM,用 Puphpet 生成,安装很好。

1。 Redis 已安装并正在运行

redis-server 正在运行:

我可以使用127.0.0.1:6379上的服务器:

2。 php5-redis 已安装

php5-redis 已实际安装:

3。 Laravel Redis 配置已设置

这是我在app/local/database.php 中的redis 配置文件:

'redis' => [

    'cluster' => false,

    'default' => [
    'host'     => '127.0.0.1',
    'port'     => 6379,
    'database' => 0,
    ],
],

4。对 Redis 的调用很简单:

// Get redis
$redis = Redis::connection();

5。我尝试了很多东西

sudo service nginx reload
sudo service redis-server force-reload
composer dumpautoload

但是没有解决这个错误。


我还在吃:

ERROR: exception 'Symfony\Component\Debug\Exception\FatalErrorException' with message 'Call to undefined method Redis::connection()' in /var/www/fd/app/menus/admin.menu.php:16

(第 16 行是我进行连接的地方$redis = Redis::connection();

我哪里错了?

顺便说一句,我讨厌星期一>.>

【问题讨论】:

    标签: laravel laravel-4 redis


    【解决方案1】:

    我在遇到此问题后遇到了这个问题,并想添加另一个答案以防它对其他人有所帮助。

    在我的例子中,有一个别名冲突,因为我的 php 配置启用了 PHP-Redis 模块/扩展——PHP 模块和 Laravel 似乎都有一个名为 Redis 的冲突对象。我可以通过使用整个命名空间标识符来解决这个问题:

    //$r = Redis::connection() 
    $r = Illuminate\Support\Facades\Redis::connection();
    

    【讨论】:

    • 感谢您的解决方案。事实上,我的 vagrant 机器也安装了 php-redis,所以在我的情况下,这是正确的答案;)
    • 或者你可以在 app.php 下添加额外的条目 > 具有相同值的别名。示例:'Redis2' => 'Illuminate\Support\Facades\Redis', 然后执行php artisan dump-autoload
    • @lukaserat 谢谢你,这就是Laravel's docs suggest,但我没有弄清楚它们的确切含义:Note: If you have the Redis PHP extension installed via PECL, you will need to rename the alias for Redis in your app/config/app.php file. 显然这意味着:1. 重命名app/config/app.php 中的别名 from 'Redis' => 'Illuminate\Support\Facades\Redis','LRedis' => ... 2. 发出artisan dump-autoload 命令 3. 在代码中使用重命名的别名:$r = LRedis::connection();
    • 感谢您节省我的时间!
    【解决方案2】:

    问题不在于您的 redis 服务器设置 - 您的系统中存在配置错误或更改的内容。

    您看到的错误

    Call to undefined method Redis::connection()
    

    PHP 是否告诉您它在 Redis 类上找不到名为 connection 的方法。这是一个 PHP 错误,PHP 永远不会尝试与 redis 服务器通信。

    通常,在 Laravel 4.2 系统中,没有名为 Redis 的类。相反,在app/config/app.php 中设置了一个别名

    #File: app/config/app.php
    'Redis'           => 'Illuminate\Support\Facades\Redis',
    

    这会将Redis 变成一个门面。这使您可以拨打Redis::connection 之类的电话。

    所以,您的系统有问题。要么你

    1. 有一个名为 Redis 的自定义类在设置别名之前已加载

    2. Redis 别名为 Illuminate\Support\Facades\Redis 外观类以外的其他东西

    3. 你的Redis门面类已被修改为返回redis以外的服务标识符

    4. 您已将redis 服务反弹为其他类

    5. 根据下面的 cmets,您已经安装了 Redis PHP 扩展并且全局扩展类“wins”

    要找出 PHP 认为 Redis 类在哪里,请尝试

    $r = new ReflectionClass('Redis');
    var_dump($r->getClassFile());
    

    要查看#4是否是问题所在,请尝试直接调用服务

    $app = app();
    $app['redis']->connection();
    

    祝你好运!

    【讨论】:

    • $app['redis']->connection() 替换所有Redis::connection() 有效。一定是其他地方有错误,如果找到了,我会在cmets这里贴出来,谢谢!
    • 我最近在安装 PHP 5.6 时遇到了这个问题,它碰巧正在运行 php-redis 模块——我在这里遇到了这篇文章以及 Laravel github 问题:github.com/laravel/framework/issues/1066。就我而言,并且似乎偶尔会发生,Laravel Redis 别名与 Redis PHP 模块发生冲突。似乎最好的解决方案是在 Laravel 中找到别名定义并将其重命名为 LRedis
    • +1 & tks 用于反射技术,我相信它在很多场景中都非常有用,而不仅仅是这个。
    【解决方案3】:

    那个错误是因为你已经安装并启用了模块 php5-redis,它变成了 Redis 类。为避免该错误并使用 Laravel Redis Facade,您必须更改 app/config/app.php 中的别名(或任何您的环境)。

    'Redis' => 'Illuminate\Support\Facades\Redis'

    'RedisFacade' => 'Illuminate\Support\Facades\Redis' //whatever you like

    或者只是配置你的 cache.php 以使用 Redis 并且只使用 Cache 类。 :)

    【讨论】:

      【解决方案4】:

      在您的 PC 上安装 Redis 扩展程序。

      从以下链接下载 DDL 的正确版本: https://pecl.php.net/package/redis/4.1.0/windows

      把dll放到正确的文件夹里

      Wamp -> C:\wamp\bin\php\php-XXXX\ext
      Laragon -> C:\laragon\bin\php\php-XXX\ext
      

      编辑php.ini文件添加

      extension=php_redis.dll
      

      重启服务器并检查phpinfo();。现在 Redis 应该在那里了!

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-12
        • 2021-02-02
        • 2013-10-23
        • 1970-01-01
        • 2014-05-13
        • 2023-03-21
        相关资源
        最近更新 更多