にしし ふぁくとりー(西村文宏 個人サイト)

Presented by Nishishi via Movable Type. Last Updated: 2016/10/28. 16:56:55.

FTPで数百・数千ファイルをウェブサーバ上へ高速にアップロードする方法

WordPressやMovable TypeのようなCMSツールをウェブ上にセットアップする際、それらを構成する数百~数千ファイルをウェブサーバ上にアップロードする必要があります。FTPソフトを使って、それらの膨大なファイルを1つ1つアップロードすると非常に時間が掛かってしまいますし、アップロード途中に転送エラーが発生すると作業をやり直さなければならないなどの面倒な問題も起こります。

実はそんな無駄な方法を使わなくても、ファイル数が数百・数千・数万個でも楽にウェブサーバへアップロードでき、かつ、転送エラーも発生しない(発生しても簡単に対処できる)方法があります。
その高速アップロード方法とは、とても簡単で、

  • ZIPに圧縮した状態のままウェブサーバへアップロードして、
  • ウェブサーバ上でZIPを展開する

という方法です。

これなら、ZIP内に含まれるファイル数が数百・数千個であったとしても、アップロードするファイルは1つだけで済みます。ファイルを1つ1つ転送するわけではないので、サーバとの無駄な通信回数を削減でき、合計の処理時間も短くできます。しかも、1ファイルしかアップロードしないので転送エラーも発生しにくく、たとえ発生してもその1ファイルの転送を再度やり直せば良いだけです。
しかも、圧縮されてデータサイズが縮まっていますから、総データ転送量も低く抑えられます。

大量ファイルをアップロードするならZIPのままで。ローカルで展開しちゃダメ

大量のファイルが含まれるシステムなどをウェブサーバ上にアップロードしたいとき、「×:やってはいけない方法(時間が掛かりすぎる方法)」と「○:望ましい方法(高速に済む方法)」は下図に示すとおりです。

ZIPに圧縮された状態のままをアップロードして、ウェブサーバ上でZIPを展開する方法が望ましい。

  • [×]の方法は、「ローカルでZIPファイルの中身を展開してから、FTPソフトで全ファイルをアップロードする」という方法です。これだと、ファイルの転送に激しく時間がかかるので、待ち時間が長くなりますし、転送エラーが発生したときに面倒なことになります。
  • [○]の方法は、「ZIP形式に圧縮された状態そのままをアップロードして、ウェブサーバ上でZIPファイルを展開する」という方法です。この方が高速で済む理由は下記に記します。

▼ZIPのままアップロードして、サーバ上で展開する方が速い

上図で、[○]の方が望ましいのは、以下の3点からです。

  • 大量のファイルをアップロードするには、データを転送する時間以外にも、ファイルの転送をリクエストする処理(サーバとの通信処理)自体にも膨大な時間が掛かってしまいます。
  • しかし、1ファイルだけの転送なら無駄な処理がなく速くアップロードできます。(しかもZIPで圧縮も効いているので転送するデータ総量も少なくて済みます。)
  • ローカルPC上だろうとサーバ上だろうと、ZIPファイルの中身を展開するのには大して時間は掛かりません。

というわけで、大量のファイルを高速にアップロードするには、ZIPファイルに圧縮された1ファイルの状態でアップロードするのが望ましいわけです。

ウェブサーバ上でZIPファイルを展開する方法

上記の手順で問題になるのは、ウェブサーバ上にアップロードしたZIPファイルをどうやって展開するのか、という点でしょうね。
WindowsなどのPC上であれば、ZIPファイルをダブルクリックするなり右クリックするなりで展開できますが、ウェブサーバ上ではそうはいきません。
しかし、ウェブサーバ上でunzipコマンドが使用可能であれば、簡単に展開が可能です。

以下に、ウェブサーバ上でunzipコマンドを実行する2通りの方法を紹介しておきます。

▼TELNET(SSH)でシェルにログインしてunzipコマンドを使って展開する方法

例えば、TELNET(SSH)でウェブサーバのシェルにログインして、下記のようにunzipコマンドを実行すれば、任意のZIPファイルをサーバ上で展開できます。下図はTeraTermを使って「archive.zip」ファイルをunzipコマンドで展開する場合の操作例です。ZIPファイル内の9ファイルが展開されていることが分かります。

unzipコマンドを使ってZIPファイルをウェブサーバ上で展開

unzipコマンドは、以下の書式で使います。とても簡単です。

unzip (ファイル名)

例えば、カレントディレクトリに存在する「archive.zip」ファイルを展開したいなら、以下のように入力して実行するだけです。

unzip archive.zip

しかし、そもそもウェブサーバ上のシェルにログインできるサービスを提供していないレンタルサーバもあり、上記の方法が常に使えるわけではありません。その場合でも、ウェブサーバ上でunzipコマンドが使用可能であるなら、次の方法でも展開が可能です。

▼unzipコマンドを使ってZIPファイルを展開するCGIを作って実行する方法

要はウェブサーバ上でunzipコマンドが実行できれば良いのですから、以下のようなシンプルなCGIを作ってアップロードし、ウェブサーバ上で実行(=ブラウザでCGIにアクセス)する方法でも任意のZIPファイルを展開できます。

#!/usr/bin/perl
print "Content-type: text/html\n\n";
`/usr/local/bin/unzip archive.zip`;
print "Unzip Complete.";

上記は、Perlで記述した「unzipコマンドを実行するだけ」の簡単なCGIです。

  1. まず、上記の4行をテキストエディタに入力します。「archive.zip」の部分は実際に展開したいZIPファイル名に修正して下さい。
  2. 記述できたら、例えば「unzip.cgi」のような名称で保存します。
  3. 対象のZIPファイルをアップロードした場所と同じ場所に、上記のCGIもアップロードします。
  4. あとはブラウザでこのCGIにアクセスするだけで、ZIPファイルの展開ができます。
  5. 展開作業が無事に終わったらCGIファイルは削除しておきましょう。

※上記ソースの2行目と4行目はなくても構いません。(ただ、これがないとブラウザ上からCGIを実行したときにエラーが表示されてしまいますし、ZIPの展開処理が終わったのかどうかも判断できないので、まあ書いておく方が良いとは思います。)
※3行目の「/usr/local/bin/unzip」部分は、実際にunzipコマンドの存在する場所を指定する必要があります。単にunzipと書くだけで良いかも知れませんが。
※わざわざCGIにしなくても、シェルスクリプトとかでも良いとは思います。(^_^;)

ウェブサーバ上の数百・数千ファイルを一括ダウンロードした場合にも有効

この方法は、もちろん高速アップロードだけではなく高速ダウンロードにも使えます。
ウェブサーバ上にあるシステムをローカルにバックアップしておきたい場合など、ウェブ上の数百・数千ファイルを一気にダウンロードしたいケースがあります。
そんなときは、

  • ウェブサーバ上で対象ファイルを1つのZIPファイルに圧縮する
  • そのZIPファイルをFTPでダウンロードする

という方法なら、たった1つのZIPファイルをダウンロードするだけで済みますから、とても高速にダウンロード作業が完了します。
ウェブ上でZIPに圧縮するには、zipコマンドを実行すれば良いだけです。
先程と同じように、TELNET(SSH)でシェルにログインしてコマンドを打つか、zipコマンドを実行するCGIを書いてウェブ上で実行すれば良いでしょう。

アップロードもダウンロードもZIPファイルを対象にすると楽

というわけで、数百・数千ファイルをローカルとウェブサーバ間で転送したい場合は、アップロードであってもダウンロードであっても、ZIPファイルの状態で転送すれば、高速に作業が済みます、という話でした。
ぜひ、この方法で無駄な時間と手間を省いてみて下さい!

コメント

コメント数: 0件

コメント投稿欄 この日記に対するコメント投稿を歓迎します。

保存しますか?



※本文中にURLは書けません。(書くと投稿が拒否されますのでご注意下さい。)

※投稿内容は、実際にページ上に掲載される前に、管理者によって確認される設定にしている場合があります。その場合は、投稿後にその旨が表示されます。たいてい1~2日以内には表示されるはずですので、気長にお待ち願います。m(_ _)m

トラックバック

このエントリーへのトラックバックURLを表示するにはここをクリック
※スパム防止のため、トラックバックURLは別ウインドウで表示します。(JavaScriptが有効でないと表示されません。)

--- 当サイト内を検索 ---