ある特定のPHPスクリプトを実行してexec()を呼び出し、PDFをJPGに変換するコマンドを実行します。このコマンドはbashで正常に動作します。
最初のトラブルシューティングの推測を先制するには、次の点に注意してください。
これをブラウザからPHPスクリプト( http://www.example.com/script.php にアクセス)と呼ぶと、exec()は引数を実行しません。
[〜#〜] important [〜#〜]:スクリプトまたはbashコマンドの作成方法に問題がないことを知っています。 bashから、 'php'を使用してスクリプトを実行でき、動作します(たとえば、 'php script.php'はファイルを変換します)
System()でexec()を切り替えることも試みました。
最後に、私は過去に一度この問題に遭遇しましたが、どのようにそれを修正したか思い出せません。
私が欠けているものがあることを知っているので、私が持っているように他の誰かがこれを経験し、それを修正する方法を覚えていることを願っています!
あなたが提供できる支援を事前にありがとうございます。
アレックス
追加 2>&1
コマンドの最後まで。エラーをstderrからstdoutにリダイレクトします。これにより、何が問題なのかが明確になります。
ご想像のとおり、ウェブサーバープロセスのユーザーにはその権限がありません。
それはコマンドラインから(あなた自身のユーザーアカウントの下にあるとき)動作するので、Webサーバーが実行されているアカウント(多くの場合「www-data」)は変換プログラムに対する実行権限を持っていないように聞こえます。
ファイルの許可を検討しましたか?ブラウザーでは、phpは1人のユーザーで実行されていますが、bashで実行すると、ユーザー権限で実行される可能性があります。
それは私がチェックする最初のものです。
エイミー
Apache/webserverユーザーには、シェルコマンドを実行するために必要な権限がありますか?
Clから実行する場合、別のユーザーとして実行している可能性が高いため、どのclが機能するかを説明できますが、ブラウザーでは機能しません。
Apacheのユーザー_www-data
_には、Sudo
を使用して特定のアプリケーションを実行するための特権を付与する必要があります。
Sudo visudo
_を実行します。実際には、_etc/sudoers
_のファイルを編集します。これを行うには、ターミナルで_Sudo visudo
_を使用して、編集する複製(temp)sudoers
ファイルを作成します。_www-data ALL=NOPASSWD: /etc/init.d/smokeping/restart, /bin/mount
_
(これは、スーパーユーザー(root)特権を使用してrestart
およびmount
コマンドを実行することを前提としています。)
ただし、スーパーユーザー権限を使用してすべてのアプリケーションを実行する場合は、上記の代わりに次を追加します。ALL
コマンドではなく、非常に危険です。
_www-data ALL=NOPASSWD: ALL
_
3。 sudoersファイルを編集した後(visudo
によるsudoers
の一時ファイルを編集するので、sudoers
ファイルに書き込むために一時ファイル(visudo)を保存して終了します。(_wq!
_)
4.それで、次のようにexec()
を_xxx.php
_ script内で使用します。 phpスクリプトでコマンドを使用する前にSudo
を使用することを忘れないでください。
例:-
_exec ("Sudo /etc/init.d/smokeping restart 2>&1");
_
したがって、あなたの問題では、使用したいコマンドをstep no (2.)
に追加します。PHPスクリプトを追加し、必要に応じて変更します。
これは、Webサーバーを介してスクリプトを実行しているユーザーと、bashを介してスクリプトを実行しているユーザーが原因である可能性があります。
通常、ユーザー「www」と同じようにサーバーを介して呼び出されるスクリプト/ execは、このユーザーはあなたのエリアへの書き込みアクセス権を持っていません。ただし、bashでスクリプトを実行すると、書き込み権限が付与されます。
これはImageMagickの問題であり、PHPの問題ではないと判断しました。私はいくつかの修正を試みていますが、それらが機能しない場合は、代わりにPHP共有ライブラリ(おそらくimagick))を使用して作業を行うことになります。
デフォルトの出力デバイスが変更されます。
(有効化後)wwwとしてログインすると、シェル経由で出力されますが、php経由では出力されません。