こんにちは。
個人レベルの内製ツールをPHPで開発しているのですが、その時にffmpegを動かそうと思いパスを通して実行したもののなぜか実行できません。
実行したコマンドをターミナルで実行しても普通に動くし、なんでじゃと思ったらMAMPのapache2(以下MAMP)はユーザとは別でパスを通しているようでした。
ググっても/usr/binに置けとか出てきますが、最新のmacOSはroot権限でも書き込めないのでどうしてもパスを通す必要があります。
ということで、今回はMAMPに独自のパスを通してみます。
検証環境
項目 | 詳細 |
---|---|
OS | macOS 10.14.6 |
MAMP | MAMP 4.5 |
デフォルトでMAMPに通っているパス
デフォルトで通っているパスはPHPでecho $PATHを実行すると確認できます。
$out = 0; $ret = 0; exec('echo $PATH', $out, $ret); var_dump($out); var_dump($ret);
するとMAMPで通っているパスが表示されます。
/Applications/MAMP/htdocs/index.php:5:
array (size=1)
0 => string '/usr/bin:/bin:/usr/sbin:/sbin' (length=29)
/Applications/MAMP/htdocs/index.php:6:int 0
案の定ユーザで通したパスはMAMPでは通っていません。
既に通っているパスにシンボリックリンク
手っ取り早いのが既に通っているパスの場所にシンボリックリンクを貼る方法なんですが、macOSの場合は「/usr/bin」「/bin」「/usr/sbin」「/sbin」4つのうちどれもroot権限があっても書き込みができません。
どうやらOS X 10.11から権限周りが変わったみたいで、このバージョン以降はやはりパスを通す必要があります。
パスを通す
シンボリックリンクを作成
まずは/usr/local/binにシンボリックリンクを貼ります。
バイナリがある場所を直接通せば不要な手順なんですが、ややこしいので今回はroot権限で編集可能な/usr/local/binに貼ることに。
$ sudo ln -s ~/ffmpeg/bin/ffmpeg /usr/local/bin $ ffmpeg --help ffmpeg version N-94664-g0821bc4eee Copyright (c) 2000-2019 the FFmpeg developers built with Apple LLVM version 10.0.1 (clang-1001.0.46.4) ...
とりあえずちゃんとffmpegコマンドが通ればOKです。
MAMPに環境変数を適用させる
MAMPは独自の環境変数を適用させる場合、envvarsに書き込むことで適用できるようです。
私のバージョンではenvvarsは存在しないファイルで、新規作成することで適用できましたが、別のバージョンでは既に存在する可能性もあるので書き換える場合は要注意です。
なお、envvarsは/Applications/MAMP/Library/binに作成します。
$ nano /Applications/MAMP/Library/bin/envvars
エディタで開くといつも通りパスを通すコマンドを記述します。
export PATH=/usr/local/bin:$PATH
今回は/usr/local/binを通します。
もしシンボリックリンクを貼ってない場合は直接ffmpegの場所を指定しましょう。
あとはMAMPのサーバを再起動すれば完了です。
念の為PHPでちゃんとパスが通っているか確認しておきましょう。
/Applications/MAMP/htdocs/index.php:5:
array (size=1)
0 => string '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin' (length=44)
/Applications/MAMP/htdocs/index.php:6:int 0
ffmpegを動かす
最後にffmpegの動作が確認できたら完了です。
$out = 0; $ret = 0; exec('ffmpeg --help', $out, $ret); var_dump($out); var_dump($ret);
/Applications/MAMP/htdocs/index.php:5: array (size=110) 0 => string 'Hyper fast Audio and Video encoder' (length=34) 1 => string 'usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...' (length=86) 2 => string '' (length=0) 3 => string 'Getting help:' (length=13) 4 => string ' -h -- print basic options' (length=34) 5 => string ' -h long -- print more options' (length=33) ... /Applications/MAMP/htdocs/index.php:6:int 0