簡體   English   中英

Linux中C和PHP之間的一種好的進程間通信方法是什么

[英]What is a good Inter-Process Communication method between C and PHP in Linux

我實際上不知道我是否在問一個適當的問題。 讓我先描述我的問題。

最終用戶<-1-> Web服務器(通過PHP)<-2->內部進程(通過C或C ++)<-3->外部硬件

1應該類似於ajax請求。 2應該類似於進程間通信。 3應該是uart RS232通訊。

最終用戶將請求更改硬件上的某些設置,然后該請求將傳播到硬件。 硬件回復成功或失敗,然后結果將傳播回用戶。 硬件回復延遲可以在1秒內。

因此,當Web服務器收到來自最終用戶的Ajax請求時,它將保留並發送IPC請求到c / c ++程序。 c / c ++程序將通過UART發送並保持並等待硬件答復。 對於UART部分,有異步uart模型,因此c / c ++程序不需要持續等待UART。

網絡服務器將等待,直到c / c ++程序返回(再次通過IPC),然后將結果轉發回最終用戶。

由於網絡服務器沒有內存,因此不能有任何異步的東西(據我所知)。

我可以想到一種通過文件或數據庫的簡單方法。 Web服務器不斷讀取文件或數據庫以進行答復。

但是我真的不認為這是一個好方法,因為它會浪費服務器CPU周期。

如果我可以容忍某些延遲,那要視情況而定,但是我認為在用戶方延遲幾秒鍾是可以的。

您能建議我一些實現IPC的好方法嗎?

而且,如果您認為整個過程或任何特定鏈接(包括鏈接1、2和3)有更好的解決方案(比我上面的描述更好),請共享2cent。

希望我清楚地問我的問題。

謝謝。

可能找到的最簡單的解決方案是使用管道 這些過程將有一個開放的管道來讀取“呼叫”並以相同的方式應答。

進行此設置的一種可能方法是在特定位置或可變位置具有一對命名管道( mkfifo )。 這樣的管道對於該過程和PHP都是已知的。 該過程將阻止讀取某些文本“協議”中的請求/命令循環,並通過另一個管道寫回PHP。 這樣,PHP和外部進程都可以被停止/殺死並重新啟動,並且通信路徑仍將保持穩定。

如果需要,您可能需要執行其他操作以驗證該進程是否真正在運行,但是在此“協議”上執行簡單的“ ping”命令就足夠了。

假設:

  • 您可以對與硬件進行通信的流程進行改進(否則,您將被束縛於已提供的功能)
  • 您對性能的要求不高(管道相對較慢)
  • 在從PHP腳本進行並發訪問以進行處理的情況下,沒有並行問題(除非您進行一些鎖定,否則將在管道中混合寫入2個並發請求)

當然,還有其他方法可以實現這一目標,但是我發現很難考慮其他如此簡單的方法。 正如一些注釋中所建議的那樣,排隊(d-bus,其他)只是建立在這個想法之上,但是增加了恕我直言的復雜性,因此,如果不需要這些其他服務提供的功能,管道就足夠了。

僅我的2美分(應該是評論,但我沒有名譽)為您的ipc使用zeromq或其他一些知名的排隊庫。

從理論上講,使用fifos和域套接字確實很簡單,但是,在實踐中,您需要編寫許多邊緣情況。 例如,高水位標記,重新連接等。

您還可以使用純C語言的網絡服務器!

檢查貓鼬civetweb

第一款適用於ESP8266和ESP32等設備。

貓鼬是根據Commercial和GNU GPL v.2開源許可證發行的。

Civetweb使用MIT許可證。

暫無
暫無

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

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