前提・実現したいこと
以下のエラーについてどのようにすれば解消できるでしょうか。
また、zipフォルダーを解凍できるように修正したいです。
よろしくお願いいたします。
-
仕様 -
現在、ボタンを押下したら
zipファイルがサーバ上で作成されてダウンロードさせる
システムを作っています。
zipファイルには適当なテキストファイルを作って突っ込んでいます。 -
環境 -
Wordpressにてphpコードを埋め込んで実行させています。
phpのモジュールとしてzipは有効状態です。(=ZipArchiveは使用可能) -
現象 -
$zip->close()
にて、「 発生している問題・エラーメッセージ」が発生しています。
また、その問題を無視してzipファイルをダウンロードすると
「圧縮フォルダー ....は無効です。」と出て解凍できません。
⇒ 契機不明でエラーは出なくなりました。
ただし、winSCPで直接保存されたzipファイルをダウンロードして
開くと解凍できますが、PHPのheaderを使ってフロントから
ダウンロードした場合は依然、「圧縮フォルダー ....は無効です。」と出て解凍できません。
発生している問題・エラーメッセージ
Warning: ZipArchive::close(): Failure to create temporary file: No such file or directory in /home/c1221591/public_html/testtesttest342.com/wp-content/plugins/insert-php-code-snippet/shortcode-handler.php(65) : eval()'d code on line 35
該当のソースコード
PHP
1<?php 2if(isset($_POST['add'])) { 3 $zip = new ZipArchive(); 4 // ZIPファイルをオープン 5 //パスやファイル名の設定 6 $zip_name = 'create_zip_'.date('Ymd').'.zip'; 7 $zip_tmp_path = dirname(__FILE__).'/tmp_zip/'; 8 9 $res = $zip->open($zip_tmp_path.$zip_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 10 11 // zipファイルのオープンに成功した場合 12 if ($res === true) { 13 // 圧縮するファイルを指定する 14 // 作成するファイル名の指定 15 $file_name = dirname(__FILE__).'/file.txt'; 16 17 // ファイルの存在確認 18 if( !file_exists($file_name) ){ 19 // ファイル作成 20 touch( $file_name ); 21 } 22 23 // ファイルのパーティションの変更 24 chmod( $file_name, 0777 ); 25 echo('Info - ファイル作成完了。 file name:['.$file_name.']'); 26 27 if(file_exists($file_name)) { 28 if ($zip->addFile($file_name, 'test.txt') != true) { 29 exit; 30 } 31 } 32 33 // ZIPファイルをクローズ 34 // !!!!!ここで警告がでてしまう!!!!! 35 if ($zip->close() != true) { 36 exit; 37 } 38 39 //ダウンロード 40 header('Content-Type: application/octet-stream'); 41 header('Content-Type: application/force-download;'); 42 header('Content-Length: '.filesize($zip_tmp_path.$zip_name)); 43 header('Content-Disposition: attachment; filename="'.$zip_name.'"'); 44 ob_end_clean(); 45 readfile($zip_tmp_path.$zip_name); 46 } 47 else { 48 echo "失敗したので終了"; 49 } 50} 51?>
コードを直して、エラーメッセージはどう変化しましたか?
起きている現象を質問文中に正確に記述してください。
失礼しました。質問文を修正いたしました。
コードは直しましたが、
35行目: if ($zip->close() != true) {
にて、初期と同様のワーニングが出ていて起きている現象も
変わりはございませんでした。
よろしくお願いいたします。
Windows上の php.exe -S localhost:8080 ではそこは再現しなかったので、
もしもレンタルサーバーなどで動かしているなら
webサーバープロセスから書き込みができないパーミッションになっていないか確認してください。
承知いたしました。ありがとうございます。
レンタルサーバで動かしておりますので、
確認いたします。
確認いたしましたが、パーミッションは
0777(8進数:rwxrwxrwx)で
webサーバープロセスからも書き込みできる権限設定でございました。
>webサーバープロセスから書き込みができなかったってことなので、
>書き込む先のディレクトリ、
>その親ディレクトリ、
>その親の親のディレクトリ、・・・、
>にwebサーバーがたどり着けるようパーミッションを確認することかな。
>SELinux使っていれば、書き込めるようにchconするとか。
上記確認しました。ご助言いただきまして、ありがとうございます。
パーミッションを最も上位のルートフォルダまで各階層たどりましたが
すべて0777を設定しており、権限については問題無さそうに見えました…。
VPSやAWSなどなら、SELinuxも確認を。getenforce
>VPSやAWSなどなら、SELinuxも確認を。getenforce
当方、以下のconoHaと呼ばれるVPSを使用しております。
https://www.conoha.jp/vps/
ConoHa VPSではSELinuxが使えないようです…
以下参考文献:
https://oki2a24.com/2018/06/27/should-not-enforce-selinux-in-conoha/
実際確認しますと、
ConohaのCentOSにて、SELinuxがdisabledとなっており
有効化が参考文献の通り、できませんでした…。
SELinux原因でもない、となると、念の為 ZipArchive::open()の返り値もvar_dump()してみてください、header()は全部一旦コメントアウトして。
ありがとうございます。
>ZipArchive::open()の返り値もvar_dump()してみてください、
>header()は全部一旦コメントアウトして。
bool(true) と出力されました。
open自体には成功しているように思われます。
//ーーーー 以下検証コード抜粋 ----
$res = $zip->open($zip_tmp_path.$zip_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
var_dump($res);
///////////////////////////////////////////
また、ついでに
$zip->addFile につきましても同様の確認を行いましたが、
bool(true)
と表示されていて、成功しているようでした…。
m6uさん、closeについてエラーが起こらないようになりました。
ありがとうございます。
サーバを再起動したりディレクトリを作り直したりしている間に
エラーが起こらないようになったので何が契機かは不明です…。
申し訳ありません。
ただし、WinSCPで直接サーバ上に保存されたzipファイルをダウンロード
すれば解凍できるのですが、headerを使ってフロントからダウンロード
した場合は解凍ができない現象が起こっています。
こちらは何かお心あたりございますでしょうか・・・。
何が契機でエラーが治ったのかが不明のため、情報足らずで申し訳
ございません。
憶測ですが、
出力されたzipファイルのパーミッションが、「rw-r--r--」となっており
権限がフルじゃないからかもなどあるので、何か進展あれば
更新させていただきます。
winSCPからダウンロードしたzipファイルのサイズ:
114 バイト (114 バイト)
質問文のコード実行でダウンロードしたファイルのサイズ:
134 KB (137,853 バイト)
となっており、ファイルサイズが異なるので、
そもそもheaderがおかしい可能性があるので、その観点から
調査してみます。
また進展がございましたら共有させていただきます・・・。
動作がおかしいと、zipファイルがただのテキストファイルになっててエラーメッセージが含まれる状態かもしれません。テキストエディタで確認してみてください。
ありがとうございます。
確認してみます。