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的子進程(??)的。
所以我的問題是,這個問題的解決方案是什麼?
乾杯!
嗯,這很奇怪phantomjs在'$ PATH'中,並且可以在從控制檯調用時執行,但是當我確實更改了js腳本以使其具有phantomjs的完整路徑時,它停止生成錯誤。但該圖像仍未創建。任何想法爲什麼? – ShalomSam
如果您的PHP腳本通過Apache,php-fpm或類似的方式運行,那麼您從控制檯執行它的用戶很可能與您的PHP腳本執行的用戶不同(例如,Apache通常使用' apache「或」www-data「用戶)。 – mscdex
是固定該問題的文件夾上的設置權限。謝謝 :) – ShalomSam