2016-01-12 64 views
2

我試圖利用一個名爲can-compile的節點js包,它從ejs文件讀取內容,然後將數據轉換爲可用和canjs友好輸出。我試圖避免將模板數據保存到服務器上的文件並使用該文件來轉換模板數據。那是我一直在嘗試使用php的STDIN/OUT的地方。使用PHP STDIN和proc_open和Node JS命令

編譯器將模板文件的名稱作爲參數讀取。我嘗試過將模板數據傳遞給節點命令行的各種方法,但都沒有成功。

最終,我試圖實現的是能夠將未編譯的模板數據發送到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。我遇到的奇怪問題是,我的代碼昨天工作,但不是今天。也許一套新的眼睛可以幫助我。

+0

關閉頂部我錯過了file_put_contents()函數我的頭我不確定當你沒有傳遞STDERR文件句柄時,PHP的'proc_open'行爲如何,也許就是這個問題。在任何情況下,您都可能想要傳遞stderr管道,以讀取節點寫入該流的任何錯誤消息。 – helmbert

+0

我拿出來試圖解決這個問題,我會嘗試添加它並將回報。謝謝。 – NoToBagels

+0

我重新添加了stderr句柄,但仍然沒有成功。它什麼都不返回。我更新了上面的代碼。 – NoToBagels

回答

2

我想通了這個問題,當發送數據到管......

這裏是工作的代碼...

$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; 
}