前提・実現したいこと
- ffmpegというライブラリを使って、サイト上で2つの音源を合成(ミックス)できるようにしたい
- phpのexec関数を利用して処理を行おうとしています。
- 開発環境はMac上のDocker
発生している問題・エラーメッセージ
何もおこりません。
特にエラーらしきメッセージも出ず困ってます。
↓該当アクションにアクセスしたときのブラウザ上の表示
Array ( )
output.mp3は生成されません。
該当のソースコード
php
1public function cmd(){ 2 $cmd = 'cd ../storage/app/private && /usr/bin/ffmpeg -i motoongen.wav -i ongen.m4a -filter_complex amix=inputs=2:duration=longest output.mp3'; 3 exec($cmd,$opt); 4 print_r($opt); 5 }
試したこと
①コンテナ内で直接コマンドを実行すれば成功しました
root@90418f2ef79f:/var/www/ecapp02/storage/app/private# /usr/bin/ffmpeg -i motoongen.wav -i ongen.m4a -filter_complex amix=inputs=2:duration=longest output.mp3
output.mp3は生成されます。
②exec関数が正常に動作すること確認
ffmpegの記述の部分をpwdに変えて動作確認しました。
php
1public function cmd(){ 2 $cmd = 'cd ../storage/app/private && pwd'; 3 exec($cmd,$opt); 4 print_r($opt); 5 } 6 7//ブラウザ上に表示される結果 8Array ( [0] => /var/www/ecapp02/storage/app/private )
実行結果が表示されたので、exec関数自体は動いているように見えます。
③ライブラリの参照先の調査
おそらくなのですが、
コマンドを叩いて実行するときに参照しているライブラリ保存先と
exec関数利用時に参照するライブラリの保存先が異なるのではないか?
と考えました。(的外れでしたら申し訳ありません)
コンテナ内にてwhichコマンドで確認すると
root@90418f2ef79f:/var/www/ecapp02/storage/app/private# which ffmpeg /usr/bin/ffmpeg
と表示されることから、ライブラリffmpegは/use/binに保存されているようです。
exec関数利用時にもし別の場所が参照されているのであれば、
そのディレクトリにffmpegのライブラリをコピーすればいいのでは?
と考えています。
ですがexec関数がライブラリ実行時にどのディレクトリを参照しているか、
調べ方がわかりません。
参考にしたサイト
ffmpegをphpのexecで動かそうとしてハマる
④実行権限があるのか
まず、exec関数実行ユーザーを調べました。
public function cmd(){ $user = exec('whoami'); dd($user); } // ブラウザに表示された結果 "www-data"
↑php実行ユーザーは「www-data」のようです。
www-dataがlsした場合ffmpegが存在するのか確認しました。
php
1public function cmd(){ 2if (!exec('cd /usr/bin/ && ls 2>&1', $array)) { 3 echo "NG"; 4} 5 var_dump($array); 6 } 7} 8 9//ブラウザに表示された結果 10array(771) { [0]=> string(8) "411toppm" [1]=> string(9) "JxrDecApp" [2]=> string(9) "JxrEncApp" [3]=> string(3) "X11" [4]=> string(1) "[" [5]=> string(7) "aclocal" [6]=> string(12)~~(中略)
↑たくさん表示されましたがffmpegはなかったです。
root@90418f2ef79f:/usr/bin# chmod 755 ffmpeg
を叩いて権限を変更してから再度試しましたが、結果は同じでlsしても見つからない状態です。
試しに
root@90418f2ef79f:/usr/bin# chmod 777 ffmpeg
にしてみても結果は同じでした。
参考にしたサイト
www-dataユーザーがバイナリファイルを実行するための権限
補足情報(FW/ツールのバージョンなど)
Laravel Framework 6.20.20
PHP 7.3.28-2+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Jun 4 2021 21:23:19) ( NTS )
Docker 20.10.6
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/06 04:33
2021/07/06 05:13
2021/07/06 09:31
2021/07/06 09:42
2021/07/06 09:51 編集
2021/07/06 12:21