使用PHP STDIN和proc_open以及Node JS命令

时间:2016-01-12 20:34:35

标签: php node.js templates

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

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

最终我想要实现的是能够将未编译的模板数据发送到STDIN / OUT管道,并让它从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;
}

我已经搜索了堆栈溢出并找到了这个How to pass variables as stdin into command line from PHP。我遇到的一个奇怪的问题是我的代码昨天工作但今天没有。也许一双新鲜的眼睛可以帮助我。

1 个答案:

答案 0 :(得分:2)

我已经找到了问题,我在向管道发送数据时错过了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;
}