2011-11-07 94 views
0

我想通過使用erlang端口的erlang來評估php代碼。問題是當要評估的數據比較大時,我得到從php解析錯誤。但是,如果數據較小,那麼我會得到正確的輸出。我認爲當數據長度更大時,erlang是截斷之前的數據,它正在發送給php進行評估。在erlang端口上可以發送或接收的數據長度是否有限制?或者是由於其他原因導致此錯誤?Erlang端口數據傳輸長度

我使用open_port(PORTNAME,PortSettings)打開一個新的端口和在PortSettings我設置[{分組,4},EXIT_STATUS]作爲我的端口選項。

回答

0

{packet, 4}元組表示爲了處理端口的另一端而啓動的程序需要以4字節長度爲前綴的格式的數據。我沒有看到php(1)程序的文檔中有任何內容說明它知道如何處理這些數據。對於短輸入來說,唯一的原因可能是長度前綴看起來像ASCII,如果你斜視,只要你發送的數據少於127字節。一旦你過去了,PHP可能會遇到UTF-8解碼錯誤。

我很肯定你想在這裏說spawn。這可以讓你獲得標準的類Unix管道交互:從端口發送的數據轉到啓動進程的stdin,並且它發送到stdout的任何內容都會返回到你的Erlang進程。

這樣做的唯一問題是它在每個事務上重新啓動php(1)。這可能看起來很昂貴,但是對於任何Unix系統來說,這並不算太壞,因爲fork(2)系統調用的效率相對較高。如果你在Windows上,或者你已經對此進行了基準測試,並發現你確實需要構建像系統一樣的FastCGI,那麼你可能倒黴。似乎沒有libphp將PHP嵌入到您編寫的用於處理分組輸入的程序中,並且無法運行php(1)以使其在端口的另一端保持活動狀態。切換到本地Erlang模板系統可能會更好。

此外,請注意,傳遞給open_port()的原子exit_status什麼也不做,除非您使用spawn

+0

對不起,遺漏的細節。是的,我正在使用spawn作爲portname,你說的正確的是發送的數據是stdin,而php正在發送到stdout,這將回到erlang進程。但是當你說「這樣做的唯一問題是它在每次交易中重新啓動php(1)」時我不明白。「你能解釋一下這個說法嗎? – niting112

+0

我的意思是'php(1)'不會返回處理後的輸出(至少不是全部),直到它的stdin上得到EOF,直到你的Erlang程序調用'port_close() '。然後您必須打開一個新的PHP端口來處理另一個文檔。如果你可以保持PHP進程正常運行,這將會更有效率,這就是打開一個端口時所有的數據包和行分隔符的內容:區分一個事務和下一個事務的方法。由於獨立的PHP解釋器不支持,所以您必須每次重新啓動它。 –