PHP apcu 在 Laravel 排队/分派作业中不持久

Posted

技术标签:

【中文标题】PHP apcu 在 Laravel 排队/分派作业中不持久【英文标题】:PHP apcu not persistent in Laravel queued/dispatched jobs 【发布时间】:2021-12-05 02:05:20 【问题描述】:

(Laravel 8,php 8)

嗨。我在 PHP APC 缓存中有一堆数据,我可以使用 apcu 命令在我的 Laravel 应用程序中访问这些数据。

我决定我应该启动一个异步作业来在会话期间为用户处理一些数据并将结果放入数据库中。 所以我制作了一个中间件,当用户访问页面时(正确地)触发,并(正确地)调度一个名为“MemoryProvider”的作业。 调度命令会立即实例化 MemoryProvider 类,运行其构造函数,然后将作业排队等待执行。 大约一秒钟后,队列被处理并运行 MemoryProvider 中的 handle 方法。

我在中间件以及 MemoryProvider 构造函数及其句柄方法中使用“apcu_cache_info()”和“apcu_exists()”检查 php 缓存的内容。

问题:

    我的 Laravel 应用程序中似乎填充了 PHP 缓存。 PHP 缓存显示在中间件中。 PHP 缓存显示在作业的构造函数中。 PHP 缓存在作业的句柄方法中显示为 EMPTY。

这是中间件:

    
        $a = apcu_cache_info();                 // 250,000 entries
        $b = apcu_exists('the:2:0');            // true
        MemoryProvider::dispatch($request); 
        return $next($request);
    

这是作业的 (MemoryProvider) 构造函数:

    
        $this->request = $request->all();
        $a = apcu_cache_info();                 // 250,000 entries
        $b = apcu_exists('the:2:0');            // true
    

这里是作业的(MemoryProvider)句柄方法:

    
        $a = apcu_cache_info();                 // 0 entries
        $b = apcu_exists('the:2:0');            // false
    

问题:这是一个 PHP 限制还是一个糟糕的 Laravel 问题?以及如何在异步类中访问我的 PHP 缓存的内容?

附言我在 php.ini 中有 apc.enable_cli=1

【问题讨论】:

APCu 的 enable_cli 标志默认情况下似乎为 false,并且队列运行器是 CLI 应用程序也许这就是原因 谢谢apokryfos!我忘了提到我有它。我已经更新了问题。 【参考方案1】:

我找到了答案。显然,这是 PHP 的限制。

根据 2017 年 given by gview 的一个很好的解释,cli 进程不与其他 cli 进程共享状态或内存。所以apc内存空间永远不会以这种方式共享。

我确实找到了针对我的特定情况的解决方法:无需运行异步进程来处理后台繁重的工作,我只需发出 AJAX 请求即可获得相同的效果。该请求由 PHP 独立处理,具有对 APC 缓存的完全访问权限,我可以填充我的数据库并让用户知道它何时完成(或逐渐完成,就像这种情况一样)。

我希望我早点想到这一点。

【讨论】:

以上是关于PHP apcu 在 Laravel 排队/分派作业中不持久的主要内容,如果未能解决你的问题,请参考以下文章

《深入探究 php-apcu 实现原理》-- 第一回:apcu的简介优缺点及使用场景

什么是 PHP 中的用户级缓存 APCu 扩展?

php 带密钥和ttl的APCu缓存

如果新版本的脚本正在运行,如何清除 PHP APCu 缓存?

php 缓存之 APC 和apcu

Laravel 嵌套作业