やりたいこと
PHPからNode.jsのプログラムを実行して、実行結果をブラウザに表示したい。その際にnode.jsのプログラムの実行結果(console.logで出力させている文字列とか)をブラウザに表示したい。
※管理者用プログラムなので
あと、タイトルに「最終的な解決策」と勝手に言っているが個人開発だから言えるのであって業務だったらルール守らなきゃだが
背景
apacheでPHP導入しているが、ファイルの書き込み処理で権限的にエラーが出るのはよくあることで、解決先としてはフォルダやファイルの権限を変えたりapacheユーザーの権限変えたり色々あるが、それらはしたくない。
そのファイルは他のユーザーに見られないようにしたい。
まず、出来ない方法
- shell_exec関数を使ってlinuxコマンドとしてnode.jsプログラムを実行する。sudoをつけているとはいえ、やはりapacheユーザーでは実行は出来てもログファイルの出力はできなかった。
解決方法
-
間にシェルを挟む
- 「PHP→shell(sudoで)→Node.js」って流れにしてしまえばいい。(メインプログラムがPHPならこんなことしなくていいのにw)
-
★この時sudoつけないとうまくいかないのでつける。
hoge.php
$cmd_shell = "sudo sh hoge.sh なんか引数";
shell_exec($cmd_shell);
- 上記PHPから呼ばれるシェル
hoge.sh
sudo node hoge.js $1 > hoge.txt 2> error.txt
- これでブラウザからNode.jsを実行した際にログが生成された。
- これをPHPから読み取って送信ボタン押すたびに実行ログがブラウザに表示されるようになった。2重送信防止でリダイレクトも毎回するので、フォーム送信後にリダイレクトを維持しつつファイルの中身を表示できるので自分の管理者画面が便利になった。