如何在 PHP 中的 HTTP 请求之间共享内存?

How to share memory between HTTP requests in PHP?

我正在尝试实施非常非常大的字典搜索来匹配 PHP 中句子中的单词。我最初的想法是使用 Aho-corasick 算法,因为 Aho-corasick 解决了我的确切问题。我首先在 PHP 中实现了一个 Trie。 Trie 在被缓存时会成为一个足够快的字典;但是,它占用大约 3mb 的内存。这在 PHP.

中不会很好地扩展

显然,无论我们使用何种数据结构,一个大字典都会占用很多内存。我只需要字典的一个实例,因为它是静态的,不需要重建。

如果这个对象可以在所有线程之间共享,3mb 的内存可以忽略不计,但是,我不确定 PHP 中线程之间共享内存的正确方法。

如何在 HTTP 请求之间共享此对象?当每个线程需要仅由 Trie 创建的 3mb 开销时,我看不到项目扩展。

您可以使用 PThreads 在 php 中执行多线程。

https://github.com/krakjoe/pthreads

它使用 posix 个线程并提供同步、线程池和 read/write/executable 对线程对象的支持。

它在 PHP7 上运行。这是一个带有两个异步运行的计数器的程序。

<?php
   $thread1 = new class extends Thread {
       public function run() {
           for ($i = 0; $i < 10000; $i++) {
              echo "Hello thread1 ($i)\n";
           }
       }
   };

   $thread2 = new class extends Thread {
       public function run() {
           for ($i = 0; $i < 10000; $i++) {
              echo "Hello thread2 ($i)\n";
           }
       }
   };

   $thread1->start() && $thread1->join();
   $thread2->start() && $thread2->join();
?>

我写道(从 APC 分叉并维护)APCu: 共享内存缓存不会帮助您。它们的内部存储区已经有一个定义好的结构,你不能改变它。您可以将您的结构存储为对象,但这些而不是其他值实际上在 PHP 的实例之间共享。共享内存 apc 类缓存,为每个请求值的上下文复制共享内存。

我写了 pthreads(PHP 扩展名): 线程不会帮助你。就像 APC 必须从共享内存中复制一样,线程也必须这样做。

PHP 始终不共享任何内容,否则您会破坏内容。您可以编写看起来好像在共享内存的代码,但事实并非如此;规则不能被打破。

如果主要要求是效率,我认为 PHP 不是明智的目标语言,您似乎在第一段末尾就认识到了这一点。我对此可能是错误的,但根据上述所有事实,如果您不同意,我会感到惊讶。

虽然它不是一种明智的语言,但可以说是一种明智的平台。我假设您想在 Web 应用程序上下文中使用它,因此目标是 PHP,但更明智的做法是用合适的语言实现结构和算法,并且通过扩展将其公开给您的 Web 应用程序。

对于 PHP 扩展,合适的语言通常指 C 或 C++,但如果您有足够的创造力,也可以指其他语言。

你仍然不能违反规则,但你不需要。

显然这取决于你做这些事情的能力。

使用文件(php_get_content、file_put_content 或更改为 NodeJS 服务器,PHP 不会在用户之间共享数据...

我不确定我是否完全满足需求。

要在(同一客户端的)后续请求之间共享数据,您可以使用会话或某些缓存。

要在后续请求(不是同一客户端)之间共享数据,您可以使用一些缓存(Redis?)

要在多个线程之间共享数据(以及 pass/persist 协程之间的数据),您需要使用专用的多线程库(如 Swoole)来解决 PHP 本身是单线程的事实螺纹。或者为了实现高效的多路复用,使用像 RoadRunner 这样的 PHP 平台而不是 php-fpm。