使用PHP STDIN和proc_open和Node JS命令

我试图利用一个名为can-compile的节点js包,它从ejs文件中读取内容,然后将数据转换为可用和canjs友好的输出。 我试图避免将模板数据保存到服务器上的文件,并使用该文件来转换模板数据。 这是我一直在尝试使用PHP的STDIN / OUT。

编译器将模板文件的名称作为参数读取。 我已经尝试了将模板数据传递给节点命令行的各种方法,但都没有成功。

最终,我试图实现的是能够将未编译的模板数据发送到STDIN / OUTpipe道,并让它从can-compile节点包中返回已编译的代码。

有人可以请指出我应该做的正确的方向。 这里我使用一个小模板的例子(见$ input)。 但是模板大小可以变化到数百行和字符。

$template_name = 'template_'.$template_data['name'].'.ejs'; $can_compiler = "/node_modules/can-compile/bin/can-compile --can 1.1.5 $template_name"; $input = "<img src="/media/<%==category.attrs.image%>" style="width:100%; height:100%;" />"; $cmd = sprintf("node %s",$can_compiler); $descriptorspec = array( 0 => array('pipe','r'), 1 => array('pipe','w'), 2 => array('pipe','w') ); $process = proc_open($cmd, $descriptorspec, $pipes); if (is_resource($process)) { fwrite($pipes[0], $input); fclose($pipes[0]); $template_content = stream_get_contents($pipes[1]); fclose($pipes[1]); $error_content = stream_get_contents($pipes[2]); fclose($pipes[2]); $return_value = proc_close($process); return $template_content; } 

我已经通过堆栈溢出进行search,发现如何将variables作为标准input从PHP传递到命令行 。 我遇到的奇怪问题是我的代码昨天工作,但不是今天。 也许一个新的眼睛可以帮助我。

我已经find了这个问题,我发送数据到pipe道时,丢失了file_put_contents()函数…

这是工作代码…

  $template_name = 'template_test.ejs'; $input = '<img src="/media/<%==category.attrs.image%>" style="width:100%; height:100%;" />'; $cmd = "node /node_modules/can-compile/bin/can-compile --can 1.1.5 $template_name"; $descriptorspec = array( 0 => array("pipe", "r"), 1 => array("pipe", "w") ); $process = proc_open($cmd, $descriptorspec, $pipes); if (is_resource($process)) { fwrite($pipes[0], file_put_contents($template_name,$input)); fclose($pipes[0]); $template_name = stream_get_contents($pipes[1]); fclose($pipes[1]); $return_value = proc_close($process); echo $template_name; }