Erlang端口数据传输长度

Erlang端口数据传输长度,erlang,port,Erlang,Port,我正在尝试使用erlang端口通过erlang评估php代码。问题是,当要计算的数据较大时,我会从php得到解析错误。但是如果数据更小,那么我得到的是正确的输出。我认为,当数据长度较大时,erlang会在将数据发送到php进行评估之前截断数据。在erlang端口上发送或接收的数据长度是否有任何限制。或者这个错误是由于其他原因造成的 我使用open_portname,PortSettings来打开一个新端口,在PortSettings中,我将[{packet,4},exit_status]设置为我

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

我使用open_portname,PortSettings来打开一个新端口,在PortSettings中,我将[{packet,4},exit_status]设置为我的端口选项。

这个{packet,4}元组表示,为处理端口另一端而启动的程序希望以4字节长度的前缀形式提供数据。我在php1程序的文档中没有看到任何内容表明它知道如何处理此类数据。可能它对短输入有效的唯一原因是,只要发送的数据小于127字节,如果你斜视,长度前缀看起来有点像ASCII。只要你仔细检查一下,PHP可能会遇到UTF-8解码错误

我很确定你想说在这里繁殖。这将实现标准的类Unix管道交互:通过端口发送的数据将在启动的进程上发送到stdin,它发送到stdout的任何内容都将返回到您的Erlang进程

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


另外,请注意,除非您使用spawn,否则传递给open\u端口的exit\u status atom不会执行任何操作。

很抱歉,缺少详细信息。是的,我使用spawn作为portname,您是对的,发送的数据将发送到stdin,php发送到stdout,然后返回到erlang进程。但我不明白你说的唯一问题是这样做会在每个事务上重新启动php1。你能解释一下这句话吗?我的意思是php1不会返回经过处理的输出,至少在它的stdin上获得EOF之前不会返回所有的输出,直到你的Erlang程序调用port_close。然后必须打开一个新的PHP端口来处理另一个文档。如果您能够保持PHP进程运行,那么效率会更高,这就是打开端口时所有数据包和行分隔符的内容:一种区分一个事务和下一个事务的方法。由于独立PHP解释器不支持这一点,因此每次都必须重新启动它。