4

ftpアップロードスクリプトを使用して、あるサーバーを別のサーバーに転送しています。ブラウザウィンドウで正常に動作し、次のコマンドを実行してsshコマンドラインから正常に動作します:php /var/www/vhosts/domain.com/httpdocs/ftp_shell.php

しかし、cronからまったく同じコマンドを実行すると、次のようになります。

PHP警告:ftp_get(ftp.tmp):ストリームを開くことができませんでした:516行目の/var/www/vhosts/domain.com/httpdocs/ftp_shell.phpでアクセスが拒否されましたPHP警告:ftp_get():ftp.tmpを開くときにエラーが発生しました516行目の/var/www/vhosts/domain.com/httpdocs/ftp_shell.php

私は516行目を調べました。これは次のとおりです。

    if((ftp_get($ftp_from,"ftp".$tmp.".tmp",$fname,FTP_BINARY) ||
        ftp_get($ftp_from,"ftp".$tmp.".tmp",$fname,FTP_ASCII)) &&
       (ftp_put($ftp_to,$fname,"ftp".$tmp.".tmp",FTP_BINARY) ||
        ftp_put($ftp_to,$fname,"ftp".$tmp.".tmp",FTP_ASCII)) &&
       ftp_site($ftp_to,"chmod ".base_convert($chmod,10,8)." $fname") &&
       f_size()&&unlink("ftp".$tmp.".tmp")) {echoout(" (".$size_b." bytes) ok<br>");$count_f++;}

ファイルを一時ファイルに書き込んでいることは知っていますが、ブラウザとコマンドラインでそれを実行できるのに、cronでは実行できないのはなぜですか?

4

3 に答える 3

2

おそらく、一時ファイルはphpスクリプト(apacheユーザー)によって作成されており、cronジョブ(rootユーザー)から読み取りたいと考えています。一時ファイルは、セキュリティ上の理由から、あるユーザーから他のユーザーに読み取ることはできません。

apacheユーザーが実行するようにcronジョブを変更する必要があります。または、一時ファイルのアクセス許可を変更してすべてのユーザーが読み取れるようにすることもできますが、他のプロセスがファイルを読み取る可能性があるため、これはお勧めしません。

于 2012-09-28T18:03:29.633 に答える
1

cron の下で実行されるジョブは、Web サーバーやコマンド ラインから実行するものとは異なるデフォルトの作業ディレクトリを持ちます。ほとんどの場合、cron でデフォルトとして使用されているディレクトリには、cron ジョブが使用するための適切な権限がありません。

絶対パスを使用してみてください。

ftp_get($ftp_from,"/real/path/to/file/ftp".$tmp.".tmp",$fname,FTP_BINARY)
                   ^^^^^^^^^^^^^^^^^^^

それ以外の場合に使用している相対パスの代わりに。

于 2012-09-28T18:02:21.567 に答える
0

エラーは次のように述べています。

PHP Warning: ftp_get(ftp.tmp): failed to open stream

行は次のとおりです。

if((ftp_get( $ftp_from, "ftp" . $tmp . ".tmp", $fname ...

したがって、エラーは空の$tmp変数に含まれている必要があります

于 2012-09-28T18:06:26.923 に答える