質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

受付中

【PHP】ZipArchive::closeが警告を出して、ダウンロードしたファイルが解凍できない

testUser12341
testUser12341

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

2回答

-1評価

0クリップ

794閲覧

投稿2021/03/18 05:25

編集2021/03/18 11:17

前提・実現したいこと

以下のエラーについてどのようにすれば解消できるでしょうか。
また、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

<?php if(isset($_POST['add'])) { $zip = new ZipArchive(); // ZIPファイルをオープン //パスやファイル名の設定 $zip_name = 'create_zip_'.date('Ymd').'.zip'; $zip_tmp_path = dirname(__FILE__).'/tmp_zip/'; $res = $zip->open($zip_tmp_path.$zip_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); // zipファイルのオープンに成功した場合 if ($res === true) { // 圧縮するファイルを指定する // 作成するファイル名の指定 $file_name = dirname(__FILE__).'/file.txt'; // ファイルの存在確認 if( !file_exists($file_name) ){ // ファイル作成 touch( $file_name ); } // ファイルのパーティションの変更 chmod( $file_name, 0777 ); echo('Info - ファイル作成完了。 file name:['.$file_name.']'); if(file_exists($file_name)) { if ($zip->addFile($file_name, 'test.txt') != true) { exit; } } // ZIPファイルをクローズ // !!!!!ここで警告がでてしまう!!!!! if ($zip->close() != true) { exit; } //ダウンロード header('Content-Type: application/octet-stream'); header('Content-Type: application/force-download;'); header('Content-Length: '.filesize($zip_tmp_path.$zip_name)); header('Content-Disposition: attachment; filename="'.$zip_name.'"'); ob_end_clean(); readfile($zip_tmp_path.$zip_name); } else { echo "失敗したので終了"; } } ?>

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

退会済みユーザー

退会済みユーザー

2021/03/18 08:23

コードを直して、エラーメッセージはどう変化しましたか? 起きている現象を質問文中に正確に記述してください。
testUser12341

2021/03/18 08:36

失礼しました。質問文を修正いたしました。 コードは直しましたが、 35行目: if ($zip->close() != true) { にて、初期と同様のワーニングが出ていて起きている現象も 変わりはございませんでした。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/03/18 08:53

Windows上の php.exe -S localhost:8080 ではそこは再現しなかったので、 もしもレンタルサーバーなどで動かしているなら webサーバープロセスから書き込みができないパーミッションになっていないか確認してください。
testUser12341

2021/03/18 08:55 編集

承知いたしました。ありがとうございます。 レンタルサーバで動かしておりますので、 確認いたします。
testUser12341

2021/03/18 10:01

確認いたしましたが、パーミッションは 0777(8進数:rwxrwxrwx)で webサーバープロセスからも書き込みできる権限設定でございました。
testUser12341

2021/03/18 10:11

>webサーバープロセスから書き込みができなかったってことなので、 >書き込む先のディレクトリ、 >その親ディレクトリ、 >その親の親のディレクトリ、・・・、 >にwebサーバーがたどり着けるようパーミッションを確認することかな。 >SELinux使っていれば、書き込めるようにchconするとか。 上記確認しました。ご助言いただきまして、ありがとうございます。 パーミッションを最も上位のルートフォルダまで各階層たどりましたが すべて0777を設定しており、権限については問題無さそうに見えました…。
退会済みユーザー

退会済みユーザー

2021/03/18 10:12

VPSやAWSなどなら、SELinuxも確認を。getenforce
退会済みユーザー

退会済みユーザー

2021/03/18 10:45

SELinux原因でもない、となると、念の為 ZipArchive::open()の返り値もvar_dump()してみてください、header()は全部一旦コメントアウトして。
testUser12341

2021/03/18 10:55 編集

ありがとうございます。 >ZipArchive::open()の返り値もvar_dump()してみてください、 >header()は全部一旦コメントアウトして。 bool(true) と出力されました。 open自体には成功しているように思われます。 //ーーーー 以下検証コード抜粋 ---- $res = $zip->open($zip_tmp_path.$zip_name, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); var_dump($res); ///////////////////////////////////////////
testUser12341

2021/03/18 11:00

また、ついでに $zip->addFile につきましても同様の確認を行いましたが、 bool(true) と表示されていて、成功しているようでした…。
testUser12341

2021/03/18 11:15

m6uさん、closeについてエラーが起こらないようになりました。 ありがとうございます。 サーバを再起動したりディレクトリを作り直したりしている間に エラーが起こらないようになったので何が契機かは不明です…。 申し訳ありません。 ただし、WinSCPで直接サーバ上に保存されたzipファイルをダウンロード すれば解凍できるのですが、headerを使ってフロントからダウンロード した場合は解凍ができない現象が起こっています。 こちらは何かお心あたりございますでしょうか・・・。 何が契機でエラーが治ったのかが不明のため、情報足らずで申し訳 ございません。 憶測ですが、 出力されたzipファイルのパーミッションが、「rw-r--r--」となっており 権限がフルじゃないからかもなどあるので、何か進展あれば 更新させていただきます。
testUser12341

2021/03/18 11:21

winSCPからダウンロードしたzipファイルのサイズ:  114 バイト (114 バイト) 質問文のコード実行でダウンロードしたファイルのサイズ:  134 KB (137,853 バイト) となっており、ファイルサイズが異なるので、 そもそもheaderがおかしい可能性があるので、その観点から 調査してみます。 また進展がございましたら共有させていただきます・・・。
退会済みユーザー

退会済みユーザー

2021/03/19 00:27

動作がおかしいと、zipファイルがただのテキストファイルになっててエラーメッセージが含まれる状態かもしれません。テキストエディタで確認してみてください。
testUser12341

2021/03/19 15:56

ありがとうございます。 確認してみます。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。