2009-08-27 110 views
2

我有一個簡單的C++應用程序,它可以在我的web應用程序的後端生成報告(簡單的LAMP設置)。問題是後端加載的數據文件在內存中大約需要1.5GB。如果多個用戶同時運行它,這不會很好地擴展,所以我的想法是分成幾個程序:

程序A是一直運行在服務器上的主要可執行文件,並且始終裝入數據,並且實際上可以運行報告。

程序B是從PHP衍生出來的,並提出一個簡單的請求,讓程序A獲得它所需的信息並返回數據。

所以我的問題是這樣的: 什麼是B讓A做某事的好機制? 當A無關時它應該如何工作?我並不是真的想要投票任務或輪換我的輪胎。C++中的進程間通信

+0

對不起...這一切都在Linux中運行。 – captncraig 2009-08-27 20:45:51

+1

自從您提到LAMP以來,我添加了linux標記。 IPC取決於平臺,所以這很重要。 – 2009-08-27 20:46:01

回答

4

使用一個命名的互斥/事件,基本上這是允許一個線程(在你的情況下的進程A)坐在那裏等待。然後進程B出現,需要完成一些事情,併發出這個喚醒進程A的互斥/事件的信號,然後繼續。

如果你是微軟:

MutexEvent

IPC在Linux上的工作方式不同,但具有相同的功能:

Linux Stuff

或者,對於C++部分你可以使用其中一個多平臺的boost IPC庫。我不確定什麼PHP可用,但它無疑具有相同的東西。

+1

+1無需打網卡,特別是如果您在同一個盒子上運行網絡服務器。 – Alex 2009-08-27 21:03:15

+0

+1表示提升進程。 http://www.boost.org/doc/libs/1_39_0/doc/html/interprocess.html – Laserallan 2009-08-27 21:06:44

+0

謝謝!我想我會使用一對Boost消息隊列。 – captncraig 2009-08-27 21:57:33

2

使用運行於localhost上的TCP套接字。

  1. 使C++應用程序成爲守護進程。
  2. PHP前端創建到守護進程的持久連接。 pfsockopen
  3. 當發出請求時,PHP向守護進程發送一個請求,然後處理併發回它。 PHP SocketsC++ Sockets

編輯

增加了一些鏈接以供參考。我可能有一些真的很不好 C代碼在某處使用進程間通信套接字,但沒有什麼好用的。

+0

看起來很有趣。但對我來說聽起來很陌生。你知道任何有用的參考資料或例子嗎? – captncraig 2009-08-27 20:54:21

2

IPC在C++上很簡單,只需調用POSIX C API即可。

但是你問的問題會更好地由隊列管理器提供。讓後臺進程等待隊列中的消息,前端PHP只是在那裏添加它想要處理的任務的規範。某些隊列管理器允許將任務的結果添加到同一個對象,或者可以爲完成消息定義一個新的隊列。

最着名的高性能隊列管理器之一是RabbitMQ。另一個非常容易使用的是MemcacheQ

或者,您可以將任務添加到MySQL中,後臺進程只是定期查詢未完成的任務。這是有效的,並且可以非常可靠(有時稱爲貧民窟隊列),但是以高速度/秒來分解。

+0

是的,它真的聽起來像消息隊列是我想要使用的。它將允許後臺進程在沒有消息時阻塞,否則將工作得很好。謝謝! – captncraig 2009-08-27 21:23:31