我在 PHP 项目中使用 Redis。我使用 phpredis 作为客户端。有时,在较长的 CLI 脚本中,我会遇到 PHP 分段错误。
我之前就遇到过phpredis在连接超时的时候出现问题。由于我的 Redis 配置被配置为在 300 秒后自动关闭空闲连接,我猜这会导致分段错误。
为了能够选择是增加连接超时还是默认为0(这意味着“永不超时”),我想知道可能的优点和缺点是什么?
为什么我永远不应该关闭连接?
为什么我应该确保连接不保持打开状态?
谢谢
我安装了nginx,php,php-fpm,php-pecl-redis.所有这些都有效,但最后一个有效.
当我跑步时/usr/sbin/php-fpm,我得到了这个:
PHP警告:PHP启动:无法加载动态库'/usr/lib/php/modules/redis.so' - /usr/lib/php/modules/redis.so:未定义符号:第0行未知的igbinary_unserialize
我不知道"igbnary_unserialize"是什么意思以及如何解决它.
我检查了正确路径下的redis.so文件.我添加extension=redis.so到"php.ini"
php版本:5.3.3 phpredis版本:2.2.7
EXISTS除了检查 key 是否存在于 redis 之外,还有其他更快的方法吗?
我的问题是,我在 redis 中有超过 100 万条记录,我需要进行 key_exists 检查。这应该在 10 毫秒内发生。
对此有什么想法吗?
我的 Laravel 应用程序有问题 - 日志中有很多错误,如下所示:
READONLY 您无法针对只读副本进行写入。{“例外”:“[对象](RedisException(代码:0):READONLY您无法针对只读副本进行写入。位于 /var/www/app/vendor/laravel/framework/src/Illuminate/Redis/连接/PhpRedisConnection.php:30
我正在使用predis和laravel/horizon,但是使用phpredis也失败了。我的排队作业运行良好,但有时会因该错误而失败。
我正在使用:
Laravel 6 (QUEUE_CONNECTION = redis)
Laravel Horizon + Supervisord
默认 Redis 安装
我不知道...这是 Redis 的问题吗?
通过使用phpredis,我在分页中保存了一些数据,如下所示:
review/itemA/1
review/itemA/2
Run Code Online (Sandbox Code Playgroud)
其中1和2是页码。我在文档中读到您可以使用通配符来检索多个键。
$allKeys = $redis->keys('*'); // all keys will match this.
$keyWithUserPrefix = $redis->keys('user*');
Run Code Online (Sandbox Code Playgroud)
但是,当有人发布新评论时,我是否也可以使用通配符删除所有旧密钥?我可以做这样的事情:
$redis->delete('review/itemA/*'); // or $redis->delete('review/itemA*')
Run Code Online (Sandbox Code Playgroud)
然而它并没有奏效。
我正在尝试将 phpredis 扩展设置为我的应用程序的要求。这是我的composer.json:
"ext-redis": ">=2.2.7"
Run Code Online (Sandbox Code Playgroud)
A 也尝试过这些选项:"^2.2.7",2.2.7@dev
但我一直收到以下错误:
Problem 1
- The requested PHP extension ext-redis >=2.2.7 has the wrong version (2.2.8-devphp7) installed. Install or enable PHP's redis extension.
Run Code Online (Sandbox Code Playgroud)
为什么我的要求与似乎适合此版本约束的>=2.2.7实际版本不重叠?2.2.8-devphp7
我将 Laravel 5.5 应用程序移至另一台服务器 - 我在那里使用完全相同的代码(做了 a git clone)以及完全相同的composer.json文件composer.lock(甚至NGINX配置也相同)。
当我运行我的应用程序时,出现以下错误:
Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR)
Call to undefined method Illuminate\Support\Facades\Redis::connect()
Run Code Online (Sandbox Code Playgroud)
这是代码:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
...
public function somefunction() {
$redis = new \Redis();
$redis->connect(env('REDIS_HOST')); <-------------
...
Run Code Online (Sandbox Code Playgroud)
作曲家软件包已安装,但我的系统上predis/predis没有。php-redis
在两个系统 (debian) 上都安装了 redis 并在127.0.0.1. .env两个系统在和 中使用相同的配置config/*:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
Run Code Online (Sandbox Code Playgroud)
唯一不同的是,我在一个系统(旧系统)上运行php7.0,而在我运行的新系统上php7.3- 我切换到php7.0新系统以检查是否存在错误,但我仍然遇到异常。
再一次 - 在我的另一台服务器上,一切都运行良好,代码完全相同,这让我感到沮丧 - …
phpredis会话锁定内部是如何工作的?它是否在内部存储一个值并不断检查它?如果我有很高的redis.session.lock_retries意愿,如果需要 10 秒才能获得锁定并且必须尝试数千次,那么会给服务器带来负载?
以下是配置参数。
\n\n; Should the locking be enabled? Defaults to: 0.\nredis.session.locking_enabled = 1\n; How long should the lock live (in seconds)? Defaults to: value of max_execution_time.\nredis.session.lock_expire = 60\n; How long to wait between attempts to acquire lock, in microseconds (\xc2\xb5s)?. Defaults to: 2000\nredis.session.lock_wait_time = 50000\n; Maximum number of times to retry (-1 means infinite). Defaults to: 10\nredis.session.lock_retries = 10\nRun Code Online (Sandbox Code Playgroud)\n 按照 Laravel 的建议,我在互联网上搜索并试图找出如何正确安装和使用 PhpRedis 后,我无法找到一个单一的事实来源或指南,但问题却多于答案。
我希望在社区的帮助下,在这里创建并不断改进该指南。
根据 Laravel 7 文档,Predis 似乎已被放弃,在 Laravel 的未来版本中,它可能不再受支持。此外,PhpRedis 的性能优于 Predis。
如何在 Ubuntu 上为 Laravel 安装 PhpRedis
Laravel 中的 PhpRedis - Redis 系列第 2 集
在全新安装 Homestead PHP7 上安装 PHP REDIS PHP7 分支
本指南假设您在 Homestead 开发环境中使用 Laravel 7。
我在 Windows 计算机上使用 PHP 8.2 启动 Redis 5.3.7 时遇到困难。当我尝试启动它时,会显示一个对话框,其中包含以下消息:
“无法在动态链接库c:\Program Files\php\ext\php_redis.dll中定位过程入口点_zend_get_parameters_array_ex”
我已包含以下错误的屏幕截图:

phpredis ×10
redis ×7
php ×6
laravel ×3
predis ×3
composer-php ×1
laravel-5.5 ×1
laravel-7 ×1
timeout ×1