1

shell_exec コマンドを使用してファイルを別のサーバーに FTP 送信することしかできません。これは、共有サーバーの fastCGI のタイムアウトが原因です。したがって、他のコマンドは使用できません。

どうすれば実装できますか? PC の DOS ウィンドウでスクリプトをテストすると動作しますが、サーバーではコードを使用します。

$output = shell_exec('ftp -s:ftpscript.txt');
echo "<pre>$output</pre>";

次のエラーが表示されます。

ftp: s: unknown option

バッチ ファイルは次のとおりです。

open ftp.server.com
usernamex
passwordx
hash
cd incoming
binary
ls

何か案は?

背景: PHP を使用して Amazon AWS Glacier にファイルをアップロードしていますが、大きなファイル (750Mb) がタイムアウトし、fastCGI (?) のタイムアウトにより 500 Internal Server エラーが報告されます。FTP を使用して大きなファイルをアップロードする方法を見つける必要があります。

アンドレ

4

1 に答える 1

1

*nix では、ftp://ストリーム操作に費やされた時間はスクリプトの時間制限にカウントされないため、ラッパーの使用によってタイムアウトが発生することはありません。スクリプトの先頭で呼び出しset_time_limit(0);て、スクリプトがタイムアウトしないようにしてください。

参照:

ノート:

set_time_limit()関数と構成ディレクティブは、スクリプト自体のmax_execution_time実行時間にのみ影響します。system()を使用したシステム コール、ストリーム操作、データベース クエリなど、スクリプトの実行外で発生するアクティビティに費やされた時間は、スクリプトの最大実行時間を決定する際には含まれません。これは、測定時間が実数である Windows では当てはまりません。

また、転送が完了するまでブラウザを開いたままにしておく必要があるため、HTTP 経由で呼び出されたスクリプトから FTP 経由で 750MB のファイルを転送することは適切な解決策ではないことに注意してください。おそらく行うべきことは、cron ジョブを使用して転送を実行するか、HTTP 要求を使用して転送を非同期的に開始することです。

これが実行可能な解決策でない場合、このshell_exec()アプローチで遭遇する問題は、Windows と *nix FTP プログラムの違いです。

サーバーにコマンドライン cURL バイナリがありますか? インターフェイスはプラットフォームに関係なく標準であるため、これが利用可能であれば、はるかに優れたオプションです。また、スクリプトを使用する必要はありません。コマンド ライン引数を使用してほとんどのことを実行できます。

たとえば、上記のコードは次のコマンドに要約できます。

$output = shell_exec('curl ftp://usernamex:passwordx@ftp.server.com/incoming/');
echo "<pre>$output</pre>";

これはスクリプトからのコマンドを無視しhashますが、ここでの目的がプログラムでディレクトリ リストを取得することである場合は、このオプションは必要ありません。

ローカル サーバーでテストするための Windows cURL バイナリは、こちらから入手できます。次のようにタグ付けされたファイルを使用することをお勧めします (ページのかなり下にあります)。

Win32   7.27.0  binary  SSL SSH Dirk Paehl

cURL コマンド ライン バイナリの使用に関する完全なドキュメントは、ここにあります。

于 2012-09-07T09:10:20.700 に答える