簡體   English   中英

如何在 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 開銷時,我看不到項目擴展。

我寫了(從 APC 分叉並維護)APCu:共享內存緩存不會幫助你。 它們的內部存儲區域已經有一個定義好的結構,你不能改變它。 您可以將您的結構存儲為對象,但這些,而不是其他值,實際上是在 PHP 實例之間共享的。 共享內存 apc 類緩存,為每個請求值的上下文從共享內存中復制出來。

我寫了 pthreads(PHP 擴展):線程不會幫助你。 就像 APC 必須從共享內存中復制出來一樣,線程也必須。

PHP 始終不共享任何內容,否則您會破壞內容。 您可以編寫看起來好像在共享內存的代碼,但事實並非如此; 規則永遠不能被打破。

如果主要要求是效率,我不認為 PHP 是一種明智的目標語言,您似乎在第一段末尾就認識到了這一點。 我可能是錯的,但根據上述所有事實,如果您不同意,我會感到驚訝。

雖然它不是一種明智的語言,但它是一個可以說是明智的平台 我將假設您想在 Web 應用程序上下文中使用它,因此以 PHP 為目標,但更明智的做法是以合適的語言實現結構和算法,並將其公開給您Web 應用程序通過擴展。

合適的語言對於 PHP 擴展通常意味着 C 或 C++,但如果您有足夠的創造力,也可以意味着其他語言。

你仍然無法打破規則,但你不需要。

顯然,這取決於你做這些事情的能力。

我不完全確定我完全得到需要。

要在(同一客戶端的)后續請求之間共享數據,您可以使用會話或一些緩存。

要在后續請求(不是同一客戶端的)之間共享數據,您可以使用一些緩存(Redis?)

要在多個線程之間共享數據(並在協程之間傳遞/保留數據),您需要使用專用的多線程庫(如 Swoole)來解決 PHP 本身是單線程的這一事實。 或者要啟用高效的多路復用,請使用像 RoadRunner 這樣的 PHP 平台而不是 php-fpm。

您可以使用 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();
?>

使用文件(php_get_content、file_put_content 或更改為 NodeJS 服務器,PHP 不會在用戶之間共享數據......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM