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

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

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

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

Q&A

解決済

4回答

3879閲覧

PHPでcsvファイルを作成したファイルのファイルサイズが0になってしまいます。

k.t.est

総合スコア49

PHP

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

0グッド

1クリップ

投稿2017/08/11 09:37

編集2017/08/11 09:43

PHPでcsvファイルを作成したファイルのファイルサイズがPHP上で確認すると0になってしまいます。
なぜでしょうか?
実際に作成されたファイルを確認すると書き込みがされており、きちんとファイルサイズもゼロになっておりません。
0になってしまうと次の処理でエラーが出る為、きちんとしたファイルサイズになるようにしたい次第です。
ご教示お願いします。

PHP

1$count = 3; 2$arr = []; 3for ($i=0; $i<$count; $i++){ 4 $arr[] = [222, 111111111]; 5} 6 7$file_path = "a.csv"; 8if (touch($file_path)){ 9 $file = new SplFileObject ($file_path, "r+"); 10 foreach ($arr as $key => $val){ 11 $export_arr = ""; 12 foreach($val as $key2 => $val2 ){ 13 $export_arr[] = mb_convert_encoding($val2, 'SJIS-win', 'UTF-8'); 14 } 15 $file->fputcsv($export_arr); 16 } 17} 18var_dump(filesize($file_path));

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

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

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

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

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

s8_chu

2017/08/11 09:40

$addressesが未定義のようですが、どこで定義しているのでしょうか?
k.t.est

2017/08/11 09:42

失礼致しました。$addressesを$arrと読み替えて頂ければと存じます。
guest

回答4

0

ベストアンサー

clearstatcache関数を使用してキャッシュされている結果を消去してみてはいかがでしょうか。

PHP

1<?php 2$count = 3; 3$arr = []; 4for ($i = 0; $i < $count; $i++) { 5 $arr[] = [222, 111111111]; 6} 7$file_path = "a.csv"; 8if (touch($file_path)) { 9 $file = new SplFileObject ($file_path, "r+"); 10 foreach ($arr as $key => $val) { 11 $export_arr = [];//文字列ではなく配列として定義 12 foreach ($val as $key2 => $val2) { 13 $export_arr[] = mb_convert_encoding($val2, 'SJIS-win', 'UTF-8'); 14 } 15 $file->fputcsv($export_arr); 16 } 17} 18clearstatcache(); 19var_dump(filesize($file_path));

投稿2017/08/11 09:51

編集2017/08/11 09:55
s8_chu

総合スコア14731

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

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

k.t.est

2017/08/12 02:00 編集

有難う御座います。ベストアンサーとさせていただきました。
guest

0

私の手元の環境(※)では、以下のように修正すると意図通りに動作しました。
※ Mac OS Sierra 10.12, PHP 5.6

before

php

1var_dump(filesize($file_path));
after

php

1clearstatcache(); 2var_dump(filesize($file_path));

実行結果

int(42)

filesize が 0 を返す原因は以下です。
http://php.net/manual/ja/function.filesize.php

注意

注意: この関数の結果は キャッシュされます。詳細は、clearstatcache() を参照してください。

おそらく、touch($file_path)を実行した時点で
$file_pathが示すファイルの情報がキャッシュされていると思われます。

投稿2017/08/11 09:54

KiyoshiMotoki

総合スコア4791

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

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

k.t.est

2017/08/11 10:04

有難う御座います。今回は一番最初にご回答頂いた方をベストアンサーとさせていただきました。
guest

0

バッファにたまっている状態なのではないでしょうか
fflush()で明示的にファイルに書き出したらどうでしょうか

php

1// ファイルにはき出す 2$file->fflush(); 3// はき出されてからサイズ確認 4var_dump(filesize($file_path));

SplFileObject::fflush

投稿2017/08/11 09:52

Kmg

総合スコア22

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

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

k.t.est

2017/08/11 10:04

有難う御座います。今回は一番最初にご回答頂いた方をベストアンサーとさせていただきました。
guest

0

SplFileObjectはCloseするmethodがないのでファイルを開きっぱなしの状態になります。
開きっぱなしでロックされているので、外から見える情報としてはサイズ0になって然るべきではないでしょうか。
http://php.net/manual/vote-note.php?id=113149&page=class.splfileobject&vote=down

ファイルに書き込み後にサイズを知りたいのであれば、fopen() fclose() 等を使って明示的にファイルハンドラをクローズしてから計って見るしかないと思います。

投稿2017/08/11 09:48

kunai

総合スコア5405

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

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

k.t.est

2017/08/11 09:57

有難う御座います。Closeするメソッドがないので、勝手にCloseしてくれていると思っておりました。
mpyw

2017/08/11 10:08

うーんなんか間違った回答がBAになってるのがモヤモヤ… ファイルがロックされているかとファイルサイズがキャッシュされているかは完全に無関係です。
k.t.est

2017/08/11 10:39

確かにclearstatcache関数でキャッシュをクリアしたらきちんとファイルサイズが取れました。ちなみにfopenしてfcloseした場合にはキャッシュをクリアしなくてもファイルサイズが取れるのに、SplFileObjectだとダメなのでしょうか?この点をクリアに致したく存じます。
mpyw

2017/08/11 10:58 編集

>> ちなみにfopenしてfcloseした場合にはキャッシュをクリアしなくてもファイルサイズが取れるのに 取れないです。やり方間違えてませんか…? https://3v4l.org/n4lTX (ちなみにhhvmの場合はキャッシュ取ってないのかな…?)
k.t.est

2017/08/11 12:58

サーバー上で起動させて、実際にファイルサイズが取れてしまうのです。。。一方、SplFileObjectではキャッシュをクリアしなければ取れないのです。。。いずれにせよキャッシュのクリアというのが正攻法ということですよね?
mpyw

2017/08/11 15:31

まあ,その点では相違ないですね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問