我正在尝试实现一个非常非常大的字典搜索来匹配PHP中句子中的单词。我最初的想法是使用Aho-corasick算法,因为Aho-corasick解决了我的确切问题。我首先用PHP实现了一个Trie。 Trie在缓存时会生成一个足够快的字典;但是,它占用大约3mb的内存。这在PHP中无法很好地扩展。
显然,无论我们使用何种数据结构,大型字典都会占用很多内存。我只需要一个字典实例,因为它是静态的,不需要重建。
如果这个对象可以在所有线程之间共享,那么3mb的内存可以忽略不计,但是,我不确定在PHP中的线程之间共享内存的正确方法。
如何在HTTP请求之间共享此对象?当每个线程需要由Trie创建的3mb开销时,我看不到项目缩放。
答案 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 不会在用户之间共享数据...