Erlang端口数据传输长度

时间:2011-11-07 09:37:53

标签: erlang port

我正在尝试使用erlang端口通过erlang评估php代码。问题是当要评估的数据更大时,我从php得到解析错误。但如果数据较小,那么我得到正确的输出。我认为当数据长度更大时,erlang在将数据发送到php进行评估之前截断数据。在erlang端口上可以发送或接收的数据长度是否有限制。或者由于其他原因导致此错误?

我使用 open_port(PortName,PortSettings)打开一个新端口,在PortSettings中我设置 [{packet,4},exit_status] 作为我的端口选项

1 个答案:

答案 0 :(得分:0)

{packet, 4}元组表示为处理端口另一端而启动的程序需要4字节长度前缀的数据。我在php(1)程序的文档中没有看到任何说它知道如何处理这些数据的内容。可能它适用于短输入的唯一原因是,只要您发送的数据低于127字节,如果您眯着眼睛,长度前缀看起来有点像ASCII。一旦你了解它,PHP可能会遇到UTF-8解码错误。

我很确定你想在这里说spawn。这样就可以获得类似Unix的标准管道交互:从端口发送的数据在启动过程中转到stdin,它发送到stdout的任何内容都会返回到你的Erlang进程。

这样做的唯一问题是它会在每个事务上重新启动php(1)。这可能看起来很昂贵,但由于fork(2)系统调用的相对效率,在任何Unix类型系统上都不算太糟糕。如果您使用的是Windows,或者您已对此进行了基准测试,并发现您确实需要构建类似FastCGI的系统,那么您可能会失败。似乎没有libphp将PHP嵌入到您编写的程序中以处理打包的输入,并且无法以允许它在端口的另一端保持活动的方式运行php(1)。你可能最好切换到原生的Erlang模板系统。

另请注意,除非您使用exit_status,否则传递给open_port()的{​​{1}}原子不会执行任何操作。