先日、10年以上運営していた無料ブログをWordPressに移行した時の事です。
ローカル環境のWordPress(Local by Flywheel)でテストし、いざさくらのレンタルサーバにアップしようとしたところ、サーバーにアップした圧縮(Zip)ファイルがエラーで解凍できないというトラブルに見舞われました。
何度やってもうまく行かなかったのですが、PHPでunzipを起動するという方法で解決する事が出来たので、同じように大きなファイルの解凍がうまく行かない方の参考になれば、そしてまた同様の事があった時の備忘録として残しておきます。
さくらのレンタルサーバのファイルマネージャーでZipファイルが解凍できない現象
さくらのレンタルサーバでは、さくらのコントロールパネルの「ファイルマネージャー」に圧縮ファイルを解凍してくれる機能があります。
今回もローカル環境でテストしたWordPressのフォルダを全て圧縮し、さくらのコントロールパネルの「ファイルマネージャー」で解凍しようとしたところ・・
解凍中・・・の表示が2回繰り返された後、
3回目で力尽きた、という感じで以下のようなエラーが出ます。
エラー 処理が失敗しました。
「再読込」をクリックしても、全く同じ事が繰り返されるだけで改善されません。
さくらサーバでzipファイルが解凍できない原因
さくらに問い合わせる前に別な方法をとる事で解決できたので原因は不明ですが、たぶん、ファイルが大きすぎてタイムアウトになったと思われます。
他のサイトでも、データの少ないzipファイルはこのような症状は出ず、簡単に解凍されます。
今回アップロードしたファイルは1.2GBでしたが、検索してみると1GBのデータで同じ症状が出たためさくらのサポートに問い合わせた人の記事がありました。
それによるとさくらのファイルマネージャーでは、一定時間を超える処理を行った場合は処理を停止
する仕様になっているとの事。
この事から結局、大きなファイルのzipの解凍はできない、ということになります。
結局、小分けしてアップするしかないのか・・と半分諦めたのですが、phpを使用した解凍方法を見つけて試したところ、あっさり解凍できました!
今後も、サーバの引越し時などに使う事がありそうなのでメモしておきます。
サーバー上でzipファイルを解凍する方法は、unzipコマンド
さくらのレンタルサーバの「ファイルマネージャー」でzipファイルの解凍時にエラーが出る場合は、PHPでunzipを起動するという方法で解決できました。
ZIPファイルをサーバー上で展開するスクリプトを使う方法
流れとしては以下のようになります。
1.unzip.phpを作成する
2.さくらレンタルサーバにアップしてあるzipファイルと同じディレクトリにunzip.phpをアップ
3.ブラウザから、unzip.phpを呼び出す
unzip.phpを作成する
以下をコピペして必要箇所を修正します。
<?php // インストールに先立ってZIPファイルをサーバー上で展開するスクリプト。 // ZIPファイルとこのファイルを同じディレクトリにアップ。 // アップ先ディレクトリにそのまま展開されます。 // 展開される際にこのファイルと同じ名前のファイルが有る場合は予めこのファイル名を変えておく。 $zipfilename = 'public.zip'; // 展開するzipファイルを指定。 $zip_file = getcwd().'/'.$zipfilename; if(!is_file($zip_file)) exit("No zipped file: $zip_file on your server!"); function unzip($zip_file){ return shell_exec("unzip $zip_file"); } if($zip = unzip($zip_file)){ echo '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>ZIP解凍</title></head><body>'; echo "Zip解凍<br />\n"; echo "対象ファイル:$zipfilename<br />\n"; echo '<div style="overflow:auto; height:400px; border: #999 1px solid; margin:15px;">'; echo "<pre>$zip</pre></div>\n"; echo "$zipfilename: は正常に解凍されました。<br />\n"; echo '</body></html>'; } else{ echo("Failed to extract: $zip_file\n"); } ?>
修正箇所
上の方にあるこの「public.zip」という部分を、解凍したいzipファイル名に変更します。
$zipfilename = 'public.zip'; // 展開するzipファイルを指定
また、さくらのレンタルサーバの場合、中盤あたりの以下のunzipの部分をフルパスに書き換えます。
変更前:
function unzip($zip_file){ return shell_exec("unzip $zip_file"); }
変更後:
function unzip($zip_file){ return shell_exec("/usr/local/bin/unzip $zip_file"); }
※さくらのサポート情報:プログラムのコマンドパス
書き換え後、unzip.phpを保存します。
zipファイルと同じディレクトリにunzip.phpをアップ
さくらレンタルサーバにアップしてあるzipファイルと同じディレクトリにunzip.phpをアップします。
ブラウザからunzip.phpを呼び出す
あとは、Webブラウザからunzip.phpにアクセスすると、プログラムが実行されて、ファイルが解凍されます。
※URLはフォルダの位置とサーバーの仕様によって変わります。
ファイルが多い場合は数十秒、画面が真っ白のままですが、焦らず少し待つと、ブラウザが以下のような表示になります。
さくらのコントロールパネルから「ファイルマネージャー」にアクセスしてみます。
無事にpublic.zipが解凍され、フォルダが展開されていました。
unzip.phpとzipファイルを削除
展開されたフォルダの名前を変更するなら別ですが、間違えてunzip.phpに再アクセスすると、また展開されて、ファイルが上書きされてしまうので削除しておきます。
以上で終了です。
覚えておくと、サーバー移転の時も便利だと思いますが、逆にさくらのコントロールパネルの「ファイルマネージャー」でフォルダを圧縮しようとしたら、やっぱりエラーになってしまいした・・
解凍時にエラーが出るのと同じ理由でしょうね、ファイルが大きすぎるのだと思います。
でも、phpのプログラムでzipファイルがサーバー上で解凍できるなら、
逆のパターン、圧縮する方法も必ずあるはず、と期待して。
検索するとチラホラ見つかったので、近日トライしてまとめてみます。