1

(Laravel 8, PHP 8)

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

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

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

问题:

  1. PHP 缓存出现在我的 Laravel 应用程序中。
  2. PHP 缓存出现在中间件中。
  3. PHP 缓存出现在作业的构造函数中。
  4. 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 缓存的内容?

ps 我在 php.ini 中有 apc.enable_cli=1

4

1 回答 1

0

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

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

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

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

于 2021-10-21T11:10:41.163 回答