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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

Q&A

解決済

1回答

1727閲覧

PHPのヘッダーエラー(Cannot modify header information - headers already sent by)およびファイルの中断について

Naoki_Tsuchi

総合スコア15

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

MinGW

MinGW(ミン・ジー・ダブリュー)は GNUツールチェーンのWindows移植版です。 ランタイムライブラリと開発ツールで構成されています。

0グッド

0クリップ

投稿2017/06/02 03:07

編集2017/06/02 03:39

###前提・実現したいこと
①ソースコードの$download_urlで指定したURLのファイルを、このソースコードと同じディレクトリにダウンロードできるようにしたい。headerの
Cannot modify header information - headers already sent by
というエラーがあるということはheaderの前で出力が行われているということだと思うのですが、どこで出力されていて、どのように解決すれば良いか知りたい

②MINGW32(コマンドライン)で、下記のソースコードの実行中に、Ctrl+Cで実行ファイルを中断できるようにしたい。

①または②について、または両方分かる方は両方教えていただけると嬉しいです。
初心者ですので、環境など説明不足があれば指摘していただけると助かります。よろしくお願いします。

###発生している問題・エラーメッセージ
①コマンドライン上には以下のようなエラーが出ます。ソースコード、エラー内容のディレクトリ等を多少変更して貼り付けていますが、エラー内容に影響はないと思いますので、よろしくお願いします。

$ php FileGetter.php PHP Warning: filesize(): stat failed for http://www.domain/hoge.zip in ~\FileGetter.php on line 19 Warning: filesize(): stat failed for http://www.domain/hoge.zip in ~\FileGetter.php on line 19 PHP Warning: Cannot modify header information - headers already sent by (output started at ~\FileGetter.php:19) in ~\FileGetter.php on line 19 Warning: Cannot modify header information - headers already sent by (output star ted at ~\FileGetter.php on line 19) in ~\FileGetter.php on line 19 PHP Warning: Cannot modify header information - headers already sent by (output started at ~\FileGetter.php on line 19) in ~\FileGetter.php on line 22 Warning: Cannot modify header information - headers already sent by (output star ted at ~\FileGetter.php:19) in ~\FileGetter.php on line 22

②普段はCtrl+Cで中断できるのですが、このプログラムを走らせたときに限り、Ctrl+Cが効かなくなってしまいます。

###該当のソースコード

PHP

11. <?php 22. 33. /** 44. * 法人番号ファイルのクローラー(実行ファイル) 55. */ 66. 77. $download_url = "http://www.domain/hoge.zip"; 88. 99. // ファイルのパス 1010. $filepath = $download_url; 1111. 1212. // リネーム後のファイル名 1313. $filename = 'download.zip'; 1414. 1515. // ファイルタイプを指定 1616. header('Content-Type: application/force-download'); 1717. 1818. // ファイルサイズを取得し、ダウンロードの進捗を表示 1919. header('Content-Length: '.filesize($filepath)); 2020. 2121. // ファイルのダウンロード、リネームを指示 2222. header('Content-Disposition: filename="'.$filename.'"'); 2323. 2424. // ファイルを読み込みダウンロードを実行 2525. readfile($filepath);

###試したこと
失敗したらそのまま中断したかったので、10秒で実行を終えるようにファイルの頭に
ini_set("max_execution_time",10);
をつけましたが、これも効いていないようでした。

また、headerの前に出力をしてしまっていないかも確かめましたが、おそらくしていないかと思います。以下のサイトを参考にさせていただきました。
http://www.flatflag.nir87.com/force-download-833#i

###補足情報(言語/FW/ツール等のバージョンなど)
言語:PHP 5.6.30
ツール:mintty 2.7.3
OS:Windows7(32bit)

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

filesize()の引数に設定するファイルパスは、
サーバーのパスでないといけなかった気がします。

ご質問のソースはURLが設定されているので
サーバーのファイルパスに変更してみてはいかがでしょうか?

投稿2017/06/02 03:45

編集2017/06/02 04:03
s-washion

総合スコア204

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

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

rjunakc

2017/06/02 03:48

ちなみに質問者さんに補足すると、filesizeでエラーが発生しているため、そのエラーがはき出されていることにたいして「headers already sent」と出ています。
Naoki_Tsuchi

2017/06/02 04:36 編集

>s-washionさん ご回答いただきありがとうございます。 ご指摘いただいたとおりfilesize()の引数にサーバーのパスを渡したところ、エラーは起きなくなりました。ありがとうございます。 続けて問題が起こったのですが、 正確には http://www.houjin-bangou.nta.go.jp/download/zenken/index.html?event=download&selDlFileNo=3748 にアクセスするとファイルがダウンロードできるので、このファイルをダウンロードするために、 $filepath =" http://www.houjin-bangou.nta.go.jp/download/zenken/index.html?event=download&selDlFileNo=3748"; としたかったのですが、ご指摘のようにファイルパスをサーバのファイルパスに変更し $filepath = "http://www.houjin-bangou.nta.go.jp/download/zenken/"; とするとエラーは無くなるのですが、本来ほしかったはずの index.html?event=download&selDlFileNo=3748 の情報の部分が無くなってしまうのですが、この部分を付け加えてどうダウンロードすればよいでしょうか…? 長くなってしまい申し訳ございませんが、お力を貸していただければ幸いです。
Naoki_Tsuchi

2017/06/02 04:35

>rjunakcさん 補足していただきありがとうございます。 エラーの内容、よく分かりました! ありがとうございます!
Naoki_Tsuchi

2017/06/02 04:49

>s-washion すみません、先ほどエラーが起きなかったと書いていましたが、どうやら起こっていたようです。 先ほどの自分のコメントは無視していただいて、 http://www.houjin-bangou.nta.go.jp/download/zenken/index.html?event=download&selDlFileNo=3748 の情報がほしいとき、上記のソースコードでサーバーのファイルパスを設定するというのは $filepath = "http://www.houjin-bangou.nta.go.jp/download/zenken/"; とするということでよろしかったでしょうか?
s-washion

2017/06/02 05:30 編集

すいません。説明が不足してましたね。 サーバーのファイルパスというのは、Linuxのパスです。 例えば、download.zipが、/var/www/downloadディレクトリにおいてある場合 $filepath = "/var/www/download/download.zip";になります。 ふと思ったのですが、download.zipファイルは質問者さんのサーバー上にないのでしょうか?
Naoki_Tsuchi

2017/06/02 05:35

>s-washionさん パスについて、承知しました。 こちらこそ説明が不足してしまい申し訳ございません。 法人番号のデータが外部のサイトで公開されているので、そのデータを外部のサイトから自分のパソコンにdownload.zipという名前で保存したいという前提でした。 そうするとこのプログラムは、「自分のサーバーにあるファイルをダウンロードさせる」プログラムになるのでしょうか?詳しくないものでお恥ずかしいです。
s-washion

2017/06/02 06:07 編集

> Naoki_Tsuchiさん >「自分のサーバーにあるファイルをダウンロードさせる」プログラム その通りです。 なるほど、外部サイトのファイルをローカルにダウンロードさせるプログラムを作成したいということですね。 でしたら、file_get_contents、file_put_contentsでできると思います。 参考にしてみてください。 ```PHP <?php $url = "http://www.houjin-bangou.nta.go.jp/download/zenken/index.html?event=download&selDlFileNo=3748"; $file = file_get_contents($url); file_put_contents('./download.zip', $file); ```
Naoki_Tsuchi

2017/06/02 06:14

>s-washionさん 仰ったやり方で出来ました、ありがとうございます! 大きな勘違いをしていましたが、最後まで丁寧に教えてくださり心よりお礼申し上げます。本当にありがとうございました!
s-washion

2017/06/02 06:18

解決されたようでよかったです! ちなみに、file_get_contentsはサイズの大きなファイルは ダウンロードできませんので、ご注意ください。
Naoki_Tsuchi

2017/06/02 06:25

承知しました。今回の件では大丈夫そうです、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問