人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

【Linux】phpにてexec()が使えない

apache2.x+php4.3.x+ffmpeg0.4.9-0.3にて簡単な
Webアプリケーションを製作し、正常に使っていました。
ffmpegはhttp://dag.wieers.com/packages/ffmpeg/
より取得したものをリビルドして使っていました。

今回phpを5.14に、ffmpegもsvnより最新のものに
バージョンを上げたところ、exec()にて戻り値に127が返され、
今までシェルに渡せていたffmpegコマンドが、うまく実行
できなくなりました。

現在の環境は
CentOS4.3+php5.14+Apache2.0.52+ffmpeg SVN-r5876です。

wgetやmkdirなど他のコマンドは正常にシェルに渡され(実行され)、
戻り値にも0が返るので、ffmpegコマンドだけがうまく渡っていない
ようなのですが、何が原因となりそうでしょうか?

ご存じの方がいらっしゃいましたら、何卒ご教授下さい。
よろしくお願いします。

●質問者: extrea
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:2.0 ffmpeg Linux PHP Svn
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● くまっぷす
●27ポイント

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/execl.3.ht...

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/errno.3.ht...

http://www.geekpage.jp/programming/linux-network/perror.php

まずどういうエラーが起きているか確認してください。

大域変数errnoに<error.h>で定義された値が入っているので、perror()でエラー種類を表示させてログに吐くとか。

単純に最新のffmpegがこけているんじゃないかと思いますが…(単品で(コマンドラインから起動して)うごきますか?>ffmpeg)

◎質問者からの返答

ありがとうございます。

記載し忘れて恐縮ですが、コマンドラインから同じコマンドを投げると

無事動作します。(root,一般ユーザー変わらず)

また、topにて監視してみましたが、exec経由で投げた場合は

ffmpegのプロセス自体も起動していないようです。

実行権限?みたいなものがあるのでしょうか?


2 ● kurukuru-neko
●27ポイント

ffmpegを直接起動しない方法にてみては?

ffmpeg.shを作成何かエラーが出ていないか

確認してみては?

#!/bin/bash

set >stdout.log

export >>stdout.log

echo $*>>stdout.log

ffmpeg $* >>stdout.log 2>stderr.log

RC=$?

echo "RC=$?" >>stdout.log

exit $RC

--------------------------

◎質問者からの返答

ありがとうございます。

早速、頂いたコードで実行権限を700とした

ffmpeg.shなるファイルを作成してみました。

結果ですが、

exec("sh ffmpeg.sh",$arr,$ret);

で、戻り値が126、動作しませんでした。

ちなみにコマンドラインではちゃんと

stderr.log、stdout.logの作成が行われました。

php、ffmpegどちらが原因かだけでもわかれば

多少気が楽なのですが・・・


3 ● kurukuru-neko
●26ポイント

stdout.log / stderr.logが作成されたと

言う事は、PHPは無実ですね。

stdout.logの環境変数

PATH

LD_LIBRARY_PATH

等の環境変数は問題ありませんか?

パラメータは意図したとうり渡されてますか?

stderr.log/stdout.logに何かエラーらしい

文字は出ていませんか?


何もエラーがないばあい

以下のようにとりあえず成功

echo ffmpeg $* >>stdout.log 2>stderr.log

するように変更して実行してみて

OKであればffmpegが原因です。



===============================

UNIXのエラーコード確認

コマンドラインで

egrep 12[0-9] /usr/include/*/errno.h

でエラー内容をみてください。

#define ENOKEY 126

/* Required key not available */

#define EKEYEXPIRED 127

/* Key has expired */

であれば

Kernelエラーコードだと

KERNEL KEY RETENTION SERVICE

が返すよう。

が多分違うだろうし。

http://www.cs.fsu.edu/~baker/devices/lxr/http/source/linux/D...

◎質問者からの返答

ありがとうございます。

教えて頂いた情報は、初めて見るものなので

今のスキルでは少し解決に時間がかかりそうです。

提示頂いたURLにて勉強してみます。


あと、関係ないかもしれないのですが

セットアップしたPHPはcli版なので

文末の様なコードをバッシュにて

$php test.php

とすれば通ります。(root、一般ユーザーともに)


httpd経由だと上述の通りエラーコードを

吐くのですが、cliでの挙動との違いは

何が関係しそうでしょうか?


どなたかお気づきの方いらっしゃいませんでしょうか?


#test.php

<?

exec("ffmpeg -y -i test.flv -s 320X240 -r 15 -b 64 -ac 1 -ar 24000 -f 3gp -vcodec mpeg4 -acodec aac -ab 16 test.3gp",$arr,$ret);

echo $ret;

?>

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ