私は専用サーバーでexiftoolを動作させようとしています。問題は、PHP execがコマンドをユーザーとして実行する場合とは異なるように見えることです。奇妙なことに、PHPはログインに使用したのと同じユーザーとして表示されますが、システムコマンドと同じようには動作しません。
奇妙なことに、すべてが私のローカルホストでうまく機能しますが、私のサーバーでは機能しません。
そのため、前述のように、sshを介してログインしたexiftoolコマンドを実行しても問題ありません。
しかし、phpテストスクリプトで実行すると(テストした各ディレクトリにexiftoolをインストールし、sshを介して実行することに注意してください)、何もアクセスできませんが、ユーザーorangemanとして実行しています...
そして失敗する
ここに更新があります -これは一日中されています:
シェル上:
-bash-4.1$ which exiftool -a
~/perl5/bin/exiftool
/usr/bin/exiftool
~/perl5/bin/exiftool
PHPで shell_exec('exiftool -a');
/usr/bin/exiftool
そして、そのファイルのリンク先は次のとおりです。
lrwxrwxrwx 1 root root 33 May 15 02:10 exiftool -> /home/orangeman/perl5/bin/exiftool
また、さまざまな種類のシンボリックリンクを作成しputenv();
、php を介してメインの$ PATH変数を改ざんしようとしました...私は本当にここで暗闇の中にいます。専用サーバーではなく、ローカルホストで動作します。
私はこれを賞金で更新しました-それは開発における深刻な問題です。
専用サーバーを使用していますが、問題は上記のとおりです。
UPDATE @gcbの提案に従って、phpのexec()関数がシステムコマンドを実行しても何の効果もないときに発生するエラーを出力することができました。
PHP
<?php
exec('exiftool 2>&1', $output, $r);
var_dump($output, $r);
?>
出力:
array(2) {
[0]=>
string(230) "Can't locate Image/ExifTool.pm in @INC (@INC contains: /bin/lib /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /bin/exiftool line 33."
[1]=>
string(59) "BEGIN failed--compilation aborted at /bin/exiftool line 33."
}
更新
@gcbのソリューションは機能しました。どうもありがとうございました。
ですから、今のところphpの問題はありませんが、perlの問題です。インクルードパスが不正です。
ここで答えhttp://u88.n24.queensu.ca/exiftool/forum/index.php?topic=2217.0
You either have to install the ExifTool libraries in the
standard location (ie. somewhere in the @INC directories
listed in your post), or add the location to the include path,
something like this:
Code:
#!/usr/bin/perl
BEGIN { unshift @INC, "PATH_TO_DIRECTORY_CONTAINING_LIBRARIES" }
use Image::ExifTool;
You should be able to add "Image/ExifTool.pm" to the path you add
to find the ExifTool module.
- Phil
前の回答からの提案#3を使用することでまだ解決すると思います。そうではなく、本当に理由を知りたい場合は、内容を出力するだけの新しいperlスクリプトを作成@INC
し、シェルとphpを介して実行します。あなたは違いを見るでしょう、そしてあなたはどのログインスクリプトがphpで尊重されていないかを見つけ、それをshell_exec
尊重しないためにphpに対するバグを開く必要があります...
ただし、(説明にあまり興味がないように見えないので)問題を簡単に解決するには、スクリプトを呼び出す前にPERLLIB変数を設定するだけです。
だから、ただやる:
find / -name ExifTool.pm
これにより、libがインストールされている場所がわかります。これが戻るとしましょう/example/perl/Image/ExifTool.pm
PERL5LIB=/example/perl/
exec()呼び出しに追加します。この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加