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

时间:2015-10-07 17:31:36

标签: php shared-memory

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

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

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

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

4 个答案:

答案 0 :(得分:5)

我写的(从APC分叉并维护)APCu:共享内存缓存不会对你有所帮助。它们的内部存储区域已经定义了结构,您无法对其进行更改。您可以将结构存储为对象,但实际上在PHP实例之间共享这些,而没有其他值。共享内存apc类高速缓存,为请求值的每个上下文复制出共享内存。

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

PHP一直没有任何共享,否则你就会破坏东西。你可以编写好像分享内存的代码,但它不会;绝不能破坏规则。

如果主要要求是效率,我不认为PHP是一种合理的目标语言,您似乎在第一段结尾处认识到这一点。我可能是错的,但是如果你不同意的话,我会对上述所有事实感到惊讶。

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

合适的语言通常意味着用于PHP扩展的C或C ++,但如果您具有足够的创造力,则可能意味着其他语言。

你仍然无法违反规定,但你不需要。

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

答案 1 :(得分:0)

我不完全确定我完全得到了需要。

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

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

要在多个线程之间共享数据(并在协程之间传递/保留数据),您需要使用专用的多线程库(如 Swoole)来解决 PHP 本身是单线程的事实。或者要启用高效的多路复用,请使用像 RoadRunner 这样的 PHP 平台而不是 php-fpm。

答案 2 :(得分:-3)

你可以使用PThreads在php中进行多线程处理。

https://github.com/krakjoe/pthreads

它使用posix线程并为线程对象提供同步,线程池和读/写/可执行支持。

它在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();
?>

答案 3 :(得分:-3)

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