作成: 2021年01月05日
更新: 2021年01月05日
markdownをHTMLに変換するNodeスクリプトをPHP(Laravel)サーバー上で実行したい.
調べるとexecという関数でPythonやShellスクリプトが動かせるみたいなのでNodeスクリプトも動かせそう.
実際に開発環境で以下のようにするとちゃんとNodeスクリプトが動いた.
exec("../scripts/generate-article.js " . $article->id);
しかし本番環境では動作しなかった.
調べるとphp.iniのdisable_functions
でexec関数が無効化されている場合があるらしいというのがあった.
PHP exec won't work - no output produced - Stack Overflow
しかし自分の環境ではdisable_functions
にはexec関数はなかった.
disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsigna led,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_ signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_ex ec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
exec関数は第二引数から標準出力は取れるが標準エラー出力は取れないので以下のようにした標準エラー出力を標準出力に流し込んでログファイルに書き出してみた.(参考: PHP - exec()のエラーハンドリングと標準エラー出力の関係をまとめる - Qiita)
$output = null;
exec("../scripts/generate-article.js " . $article->id . "2>&1", $output);
Log::debug($output);
書き換えながら何度か繰り返すと以下のことが分かった.
よって最終的に以下のように書き換えた
exec("node " . base_path() . "/scripts/generate-article.js " . $article->id);
これで想定通りに実行できた.