🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
PHP

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

Q&A

2回答

4954閲覧

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

testUser12341

総合スコア0

PHP

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

0グッド

0クリップ

投稿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

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?>

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

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

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

回答2

0

$zip_tmp_pathはどこから作られましたか?

こういう手のエラーはダウンロード処理を行うとエラーの有無がわからなくなるので、exit関数などで途中までで処理を切って、どこまでちゃんと動くか見たほうがいいかも。

投稿2021/03/18 06:16

FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

testUser12341

2021/03/18 07:21

ご回答ありがとうございます。 申し訳ありません。 タイポでございました。 ただし、タイポを直してかつexit関数でclose()までの メソッドで例外が発生しないか確認しましたが、close()するところで 警告が出ているようです。 こちら、一旦コードを再掲するためにも再質問させていただこうと思います。 失礼しました。
testUser12341

2021/03/18 08:10

申し訳ございません。 再掲した質問にて、 質問は編集できますので、こちらの質問は削除リクエストを送り、元の質問で回答を募ってください。 とご指摘を受けましたので、 こちらにて再度質問させていただくことにいたしました。 申し訳ございませんが、よろしくお願いいたします。
guest

0

tmp_zip ディレクトリが作られていないから、とか?

$zip_tmp_dir$zip_tmp_pathがあるけど、
$zip_tmp_pathが未定義なまま参照されている。

header()関数を使うのに、
エラー報告で単純にecho文を使っちゃうと良くないね。


if ($zip->close() != true) { でエラーになるのは、
webサーバープロセスから書き込みができなかったってことなので、
書き込む先のディレクトリ、
その親ディレクトリ、
その親の親のディレクトリ、・・・、
にwebサーバーがたどり着けるようパーミッションを確認することかな。
SELinux使っていれば、書き込めるようにchconするとか。

投稿2021/03/18 06:07

編集2021/03/18 08:55
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

testUser12341

2021/03/18 07:21

ご回答ありがとうございます。 申し訳ありません。 タイポでございました。 header()関数を使う場合echo文を使ってはいけないのですね。 勉強になります。ありがとうございます。 こちら、一旦コードを再掲するためにも再質問させていただこうと思います。 失礼しました。
testUser12341

2021/03/18 08:10

申し訳ございません。 再掲した質問にて、 質問は編集できますので、こちらの質問は削除リクエストを送り、元の質問で回答を募ってください。 とご指摘を受けましたので、 こちらにて再度質問させていただくことにいたしました。 申し訳ございませんが、よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2021/03/18 08:22

で? 直したコードをもう一度評価してほしいってことですか? 指摘事項を受けて直して、まだ解決していないのですか? ソースコードを直せば、エラーメッセージなど発生する現象も変わるはずですので、 情報は正確にお願いします。
testUser12341

2021/03/18 08:54

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問