2016-11-26 12 views
1

問題を解決するために投票を受け入れることを嬉しく思います。私はLinuxにはまったく新しいですが、PHPベースのサイトをLinuxクラウドサーバーにホストし、ビデオを変換するためにFFMPEGスクリプトを実行する必要があります。ウィンドウの下で私は完全なアプリケーションが動作しているが、Linuxでは基本的なスクリプトが動作しないようで、誰かが正しい方向に向けるかどうか疑問に思っていた。私はこれについて、例えばRun bash Command from PHPのような無数の記事を読んだが、それは私がそれの底に達するのを助けるものではない。PHPから「Hello World」を返すためのシンプルなLinuxスクリプト

これまで私がこれまで持っていたことは次のとおりです。

$old_path = getcwd(); 
chdir('videos/'); 
$new_path = getcwd(); 
echo('newpath '.$new_path); <-- this outputs 'old_path/videos' 
$temp= shell_exec('./testScript.sh'); 
echo ($temp) <-- produces nothing 

テストスクリプトtestScript.shは、ビデオディレクトリにあり、

echo "hello world" 

おかげ...シェルスクリプトで

+0

動画はどこにありますか?あなたは 'chdir( '../ videos')'できませんか? – David

+0

私はそれがWebルートディレクトリにある問題だと思っているはずはありません。 – TrueBlue

答えて

1

が書くとinterpretatorしなければならないだけです。

これを試してください:shell_exec( 'php ./testScript.sh');

編集:行うには正しいinterpretator変化のPHP(bashのは、SH ...)

+0

興味深い - はい、それを修正しました。私は、なぜこのソリューションがこのトピックの他の記事には登場していないのか、興味をそそられています。 – TrueBlue

+0

通常インタプリタはシェルスクリプトで書かれています。 #!/ bin/sh(ファイルの最初の行) –

2

まず最初は、PHPが実際にシェルスクリプトを実行することを可能にすることを確認しています。

ファイル名を指定して実行コマンドで次のようにプロンプ​​ト

php -i | grep disable_functions 

これは、この

disable_functions => no value => no value 

のように見えます。しかし、それは(このように、もしくはshell_execが含まれた文字列を返す場合、それはかもしれないラインで応答しなければなりません他のコンテンツが含まれています)

disable_functions => shell_exec => shell_exec 

その後、続行することはできません。 現時点では、ローカルのphp.iniファイルを試して、違反ディレクティブをオフにすることができるかどうかを確認することです。

これを行うには、作業中のディレクトリにphp.iniファイルをコピーします。disable_functions => shell_exec => shell_exec行remove shell_execを探します。

、シェルへのアクセスは、明らかに混乱の一定量を作成することができますので、しかし、これはすべての非常にクラウドホスティング環境に制限されることがあり、この

php -c php.ini myscript.php 

のようなコマンドラインにあなたのスクリプトを実行します。

これは、apache configと.htaccessで行うこともできます。

上記のすべてがOKであれば、testScript.shの権限をチェックし、実行可能ファイルとして設定されていることを確認してください。それはあなたのため

chmod +x testScript.sh 

悲しいことに、私の賭けで行うには、制限されたクラウドサーバー環境があなたを停止することです。

+0

インタプリタを指定しないということが判明しましたが、PHPの内部構造についてのこの洞察に感謝します。 – TrueBlue

3

ファイルシステム権限

あなたのケースでスクリプトが不十分なfile system permissionsに実行されていない可能性があります。 Linuxでは、あなたは、ファイルが実行可能ビット、現在のユーザー、またはユーザーのグループ、例えばのために設定している場合だけ、ファイルへのパスを書き込むことによって、ファイルを実行することが許可されています。それ以外の場合は

~/scripts/abc.php 
./script.sh 

、あなたが渡す必要があります適切なプログラムの引数としてファイル、例えば:

php ~/scripts/abc.php 
/usr/bin/php ./script.php 
bash ./script.sh 

あなたは、例えば、ls、またはstatコマンドでファイルシステムのアクセス権を確認することができます。

$ stat --format='perm: %A | user: %U | group: %G' 1.sh 
perm: -rwxr-xr-x | user: ruslan | group: users 

$ ls -l 1.sh 
-rwxr-xr-- 1 ruslan users 1261 Nov 26 11:47 1.sh 

上記の例では、ユーザruslanおよびグループusersに対して実行可能ビットが設定されていますが、以外のビットはr--)に設定されていません。他のファイルはのファイルを読み取ってr)にすることはできますが、実行したり、ファイルに書き込んだりすることはできません。実行可能なビットがshell_exec関数は標準出力記述子に書き込まれた内容を返しchmodコマンド、例えば:

# For the user 
chmod u+x file.sh 
# For the group 
chmod g+x file.sh 

コマンドの実行をより良く制御

を使用し設定する

。コマンドが何も印刷しないか、失敗した場合はNULLを返します。たとえば:

$out = shell_exec("ls -l inexistent-file"); 
var_dump($out); // NULL 

だからshell_execとエラー条件に対して何ら良好な制御を持っていません。私の代わりにprop_openを使用することをお勧め:

$cmd = 'ls -l 1.sh inexistent-file'; 

// Descriptors specification 
$descriptors = [ 
    1 => ['pipe', 'w'], // standard output 
    2 => ['pipe', 'w'], // standard error 
]; 

// Open process for the command 
$proc = proc_open($cmd, $descriptors, $pipes); 
if (!is_resource($proc)) 
    die("failed to open process for $cmd"); 

if ($output = stream_get_contents($pipes[1])) { 
    echo "output: $output\n"; 
} 
fclose($pipes[1]); 

if ($errors = stream_get_contents($pipes[2])) { 
    fprintf(STDERR, "Errors: %s\n", $errors); 
} 
fclose($pipes[2]); 

// Close the process 
if (($status = proc_close($proc)) != 0) 
    fprintf(STDERR, "The command failed with status %d\n", $status); 

シェバング

実行可能なスクリプトのためのshebangを使用することを検討してください。例:

#!/bin/bash - 
#!/usr/bin/php 
+0

これはLinuxの私に与えられた洞察に感謝します。確かに非常に役立つ。 – TrueBlue

+0

あなたのproc_openコマンドを使って、ffmpegが 'Permission denied'を返していることを知ることができましたが、744 ffmpegにすべての権限/権限を設定してもまだ実行されません。 – TrueBlue

+0

@トルーブルー、コードを表示できますか?そうでなければ、推測するのは難しいです。ところで、Bashの 'set -x'コマンドはデバッグモードをオンにします(実行されているコマンドを見ることができます。) –