我正在尝试使用erlang端口通过erlang评估php代码。问题是当要评估的数据更大时,我从php得到解析错误。但如果数据较小,那么我得到正确的输出。我认为当数据长度更大时,erlang在将数据发送到php进行评估之前截断数据。在erlang端口上可以发送或接收的数据长度是否有限制。或者由于其他原因导致此错误?
我使用 open_port(PortName,PortSettings)打开一个新端口,在PortSettings中我设置 [{packet,4},exit_status] 作为我的端口选项
答案 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}}原子不会执行任何操作。