2015-11-26 74 views
0

我試圖從php運行一個節點文件。以下作品...在linux上通過.php運行一個節點文件

運行從終端 節點運行的運行從終端 運行從PHP一個.SH節點文件中.SH,寫入一個文本文件(所以PHP是成功地觸發.SH )

但是,當我運行.sh文件時,從php運行節點文件失敗。我試過用wait 30(這個過程大概需要10秒),以確保它在完成之前不會退出。我是否需要設置任何特殊權限才能使php - > .sh - >節點正常工作?做了很多搜索找不到任何東西。

+0

你能告訴我們最簡單的代碼展現問題嗎? – davejagoda

+1

這聽起來像是一個可怕的權限問題。當你在終端中時,Apache實例的所有者是否具有與執行'node filename.js'相同的權限?嘗試執行'su * apache_user *',然後嘗試運行該文件。它是否從終端以這種方式工作? – Ohgodwhy

+0

當然... php ... shell_exec('sh t.sh'); .SH ... #!/斌/慶典 須藤節點nodeWriteFile.js 回聲> thisAlwaysWorksFromPhp.txt 節點 '非節點從這裏工作' ...... 變種FS =需要(「FS-額外') fs.writeFile(「butThisNeverWorksFromPhp。TXT」, 「」, 'UTF-8',功能(ERR){ \t如果(ERR){ \t \t擲犯錯; \t} }) – Michael

回答

1

理解文件和執行鏈如何完成以瞭解爲什麼這不起作用(假定)非常重要。

假設下面一個很常見的設置...

當Apache被初始化,它有一個擁有者,我們說,在這種特殊情況下www-data。現在,Apache將執行並在端口80上偵聽,作爲www-data用戶。這意味着它從現在開始處理的所有請求將作爲www-data用戶執行。

所以當你去http://example.com/my-page.php時,Apache會收到這個請求。然後,它將根據VirtualHost指令中的DocumentRoot找到文件系統中與my-page.php關聯的文件。完成此操作後,附加到.php文件的PHP解釋器將對該文件進行自頂向下的解釋。

一旦它到達你的bash腳本,www-data仍然是所有者。在這種情況下,bash script已被執行爲www-data,並且我敢打賭,www-data(或您的Apache用戶)不在sudoers(以及正確的)列表中。

爲了解決這個問題,您應該確保node實例可以在您的paritcular配置中沒有sudo權限的情況下被調用。如果這只是一個本地主機,外部世界不會觸及它,我會說www-data(或你的Apache用戶)到的名單不會是一件壞事。

+0

是的,我要去抽出時間來得到了權限,以加快 – Michael