2015-08-31 74 views
0

我試圖單獨運行一個PHP代碼。 php代碼只需要以所需參數的間隔調用節點腳本。 Node.js腳本另一方面計算參數從mongoDb獲得附加數據,然後在其中派生子進程,用這些參數調用Phantomjs並創建熱圖圖像文件。如何在PHP中產生一個新進程來調用需要子進程的節點腳本

現在Node.js腳本運行良好時,從命令行使用正確的參數。

但無論我嘗試什麼,我都無法在從PHP調用時使其工作。

我已經試過了shell_exec和exec象下面這樣:

$node = '/usr/local/bin/node'; 
$scriptPath = $this->basePath . '/web/scripts/node/heatmaps_node_wrapper.js'; 
$clickmapCmd = $node . ' ' . $scriptPath . ' ' . $url . ' ' . $groupId . ' ' . $heatmapId . ' click'; 
$mousemovemapCmd = $node . ' ' . $scriptPath . ' ' . $url . ' ' . $groupId . ' ' . $heatmapId . ' mousemove'; 
$asyncCmd = ' >' . $this->basePath . '/logs/heatmap.io.log 2>'. $this->basePath . '/logs/heatmap.err.log &'; 

exec($clickmapCmd . $asyncCmd); 
exec($mousemovemapCmd . $asyncCmd); 

使用symfony中的組件的ProcessBuilder也試過,像這樣 -

$builder = new ProcessBuilder(); 
$builder->setPrefix('/usr/local/bin/node'); 
$builder->setArguments(array($scriptPath, $url, $groupId, $heatmapId, 'click')); 
$process = $builder->getProcess(); 
$process->setTimeout(1000); 
$process->setIdleTimeout(1000); 
$process->start(); 
$output = $process->getOutput(); 

雙方無法創建熱圖的圖像。

但調試symfony代碼和學習symfony的過程對象幫助我發現了可能的問題。在對象的標準錯誤我看到下面的消息 -

events.js:85 
    throw er; // Unhandled 'error' event 
     ^
Error: spawn phantomjs ENOENT 
at exports._errnoException (util.js:746:11) 
at Process.ChildProcess._handle.onexit (child_process.js:1053:32) 
at child_process.js:1144:20 
at process._tickCallback (node.js:355:11) 

所以我的猜測是,這個問題是與節點試圖創建的子進程PHP的子進程(??)的。

所以我的問題是,這個問題的解決方案是什麼?

乾杯!

回答

1

問題是節點找不到phantomjs。如果執行節點腳本的用戶不在$PATH中,則可以嘗試使用phantomjs二進制文件的完整路徑。您可能還需要檢查phantomjs二進制文件上的可執行權限。

+0

嗯,這很奇怪phantomjs在'$ PATH'中,並且可以在從控制檯調用時執行,但是當我確實更改了js腳本以使其具有phantomjs的完整路徑時,它停止生成錯誤。但該圖像仍未創建。任何想法爲什麼? – ShalomSam

+0

如果您的PHP腳本通過Apache,php-fpm或類似的方式運行,那麼您從控制檯執行它的用戶很可能與您的PHP腳本執行的用戶不同(例如,Apache通常使用' apache「或」www-data「用戶)。 – mscdex

+0

是固定該問題的文件夾上的設置權限。謝謝 :) – ShalomSam

相關問題