• ベストアンサー

phpで扱えるファイルサイズ

お世話になります。 以下の環境で2GBを越えるファイルを対象にfile_exists()やis_file()関数を使うと正常に判定してくれません(ファイルが存在していてもFalseが返る)。コンパイルのオプションやPHPのバージョンアップで解消できるでしょうか?また、他に影響がありそうな関数がありましたら示して頂けると助かります。 <環境> FedoraCore4 (kernel 2.6) php 5.0.4

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • Rayderl
  • ベストアンサー率83% (40/48)
回答No.1

2GBを越えるとファイルサイズを正常に扱えない問題が出るそうですが、同じ原因ではないかと思います。コンパイルオプションで内部で利用する関数をstatではなくstat64にするよう変更してみてはいかがでしょうか。 ■PHPで大容量のファイルを操作する方法 http://www.phppro.jp/news/75

1percent
質問者

お礼

回答ありがとうございます。 これまで2GB以上のファイルを扱ったことがなくこのような問題があったことを知らずデバッグに苦労しました。参考にさせていただきます。

関連するQ&A

  • CekePHPでfile_exists関数を使う

    CakePHP Ver1.3.6で開発をしています。 アクションの中で、画像の存在判定にfile_exists関数を使ったのですが、 2バイトのファイル名のファイルの場合、存在するファイルがfalseになって しまいます。 対象のファイルが存在するときに、 if (file_exists('img/漢字.jpg')) echo 'あります'; else echo 'ありません'; if (file_exists('img/filename.jpg')) echo 'あります'; else echo 'ありません'; このとき、前者は’ありません’、後者は’あります’と表示されます。 app/webrootフォルダにtest.phpを作り、その中で同じ判定をすると、 両方とも’あります’と表示されます。 なぜアクションの中に記述したときのみ、2バイトファイル名を正しく 判定できないのでしょうか?

    • ベストアンサー
    • PHP
  • is_fileでファイルが存在していてもfalse

    is_file関数を使って、多数のファイルの有無のチェックを行おうとしています。 ところが、実際に存在していてもfalseを返してきます。 同一サーバ内、別サーバー内も試してみましたが、結果は同じでした。 当然ですが、URLの間違いなどはありません。 まったく原因が思いつきません。 よろしくお願いします。 動作環境:windowsxp,php4.3.8

    • ベストアンサー
    • PHP
  • file_exists関数について

    file_exists関数を使っていますが、 指定した場所にファイルは存在するにもかかわらず、 Falseが戻ってきてしまいます。 WinXp PHP5 の環境で、ローカルにて行っています。 ファイルはc:commoninit.ini というファイルです。 同パスにinit.iniをおいているのですが。 なにか条件があるのでしょうか。 ご教授願います。

    • 締切済み
    • PHP
  • 別のサーバにあるファイルの存在確認

    PHPで、別のサーバーにあるファイルが存在するかしないか確認できる方法、もしくはファンクションなどありますでしょうか? is_file, file_exists を試しましたが、無理でした。 宜しくお願いします。

    • ベストアンサー
    • PHP
  • php初心者です。宜しくお願い致します。

    php初心者です。宜しくお願い致します。 動作環境はwindowsXPです。 windows上に配置された日本語のファイル名を持つファイルをphpから処理したいと思っています。 たとえば、 if (!file_exists(mb_convert_encoding($path_file,"SJIS","auto"))) {・・・というようにまずファイル存在チェックを行うなど。 上記例では$path_fileはUTF-8で格納しているため、windowsに合わせSJISにエンコーディングしています。 $path_fileにはフルパスを指定し、大抵の日本語ファイルは読み込めるのですが、いわゆる5C問題に該当する、「表紙.pdf」「予定.txt」など、特定文字を含む日本語ファイル名が読めません。上記file_existsを行うと、存在するのに「存在しない」と判定されてしまいます。 不思議なのは、scandirして指定フォルダ内全てのファイル名を一括取得し配列へSJISで格納した後、そのまま配列の値をもってfile_existsしてみると、上記特定文字を含む日本語ファイル名だけ「存在しない」と判定されてしまいます。 ちなみにscandirした結果をUTF8に変換しブラウザに表示させてみると「表紙.pdf」「予定.txt」と正しく表示され、「表\紙.pdf」「侮・.pdf」等のように化けないです。 php.iniの「magic_quotes_gpc」はOffとなっています。 file_existsだけでなく、fopen、readfileなど含め、正しく処理できるようにするためにはどうすればよいのでしょうか、ご教授いただけると幸いです。

    • 締切済み
    • PHP
  • 【PHP】書き込みできません

    PHP5.3の環境でファイル書き込みのロジックがうまくいかずに困っています。 環境は下記の通りです。 Apache 2.2.2 PHP 5.3.3 コードは下記の通りです。 >>CODE $file_path = "/home/xxxxx/logs/test.txt"; echo file_exists($file_path); echo "file_path1=".$file_path; if ( file_exists($file_path) ) { echo "file_path2=".$file_path; // ファイルポインタ取得 if ( ($fp = fopen($file_path, 'a')) !== FALSE ) { // ログは追記 echo "file_path3=".$file_path; // ファイルポインタに書き込み fwrite($fp, $date."\n"); fwrite($fp, $body); fwrite($fp, "----------------------------------------------------\n"); // ファイルポインタクローズ fclose($fp); $flg = true; } } <<CODE 権限は下記の通りです。 logs 777 test.txt 777 現象は下記の通りです。 echo文のfile_path1は表示されます。 echo文のfile_path2及びfile_path3は表示されません。 $file_path="/home/logs/test.txt";に変更すると、 echo文のfile_path1及びfile_path2が表示されます。 echo文のfile_path3は表示されません。 ファイルが存在することはlsで確認したので間違いありません。 権限も777にしているので、何がおかしいのか困り果ててしまい、初めて投稿させて頂きました。 PHPやApacheの設定ファイル等も問題あるのでしょうか。 どうぞご指摘お願いいたします。

  • PHPのファイルロックについて

    関数flock();について調べてたのですが、 結局、イマイチ使い所がわかりませんでした。 とりあえずCGIを手本として以下のロックを作ってみたのですが、 もし、flockを使うとしたらどのように使うのかアドバイスして欲しいと思っています。 ↓参考プログラム(echo部は進行を表示するためのもの) <?php define ("LOCK_FILE","./lock/lock.txt"); Lock(); Unlock(); //ロック function Lock(){ if(file_exists(LOCK_FILE)){ if(date(U) - filemtime(LOCK_FILE) > 30){ unlink(LOCK_FILE); echo("古いロック削除<br>"); } } $retry = 5; while(file_exists(LOCK_FILE)){ if($retry <= 0){ echo ("error<br>"); exit; } $retry--; sleep(1); } $lockfile = fopen(LOCK_FILE,"w"); fclose($lockfile); echo("ロック完了<br>"); } //アンロック function UnLock(){ unlink(LOCK_FILE); echo("ロック解除<br>"); } ?>

    • 締切済み
    • PHP
  • PHP で動的ファイル出力

    PHP 猛勉強中です、またお世話になりますm( __ __ )m ドキュメントルート外に置いたイメージファイルを HP からリンクして表示できるように readfile 関数を使った PHP ファイルを作成しようと思っています。 readfile.php に対して URL クエリーでhttp://hoge/readfile.php?name=hage&ext=jpg のような感じで呼び出したいと思っています。 ※ name はファイル名、 ext は拡張子です。 [readfile.php] <?php $_name = ""; $_ext = ""; if(isset($_GET["name"]) === true && isset($_GET["ext"]) === true){ // null byte 対策 $_name = delete_nullbyte($_GET["name"]); $_ext = delete_nullbyte($_GET["ext"]); // ディレクトリトラバーサル対策 $_name = str_replace(".", "", @htmlspecialchars($_name, ENT_QUOTES, "UTF-8")); $_ext = str_replace(".", "", @htmlspecialchars($_ext, ENT_QUOTES, "UTF-8")); }else{ exit(); } $_file_path = "/home/xxx/img/" . $_name . "." . $_ext; // ファイル存在確認 if(file_exists($_file_path) === false){ exit(); } // MimeType 取得 $_ext_type = substr($_file_path, -3); $_mime_type = ""; if(strcasecmp($_ext_type, "jpg") === 0){ $_mime_type = "image/jpeg"; _out_file($_file_path, $_mime_type); }else{ exit(); } ///////////////////////////////////////////////// // ファイル出力 function _out_file($file_path, $mime_type) { // ファイル名取得 $_fname = @basename($file_path); // ファイルストリーム取得 header('Content-Type: ' . $mime_type); header("Content-Disposition: inline; filename='" . $_fname . "'"); readfile($file_path); } ///////////////////////////////////////////////// // null byte 除去メソッド function delete_nullbyte($str) { if(is_array($str) === true){ return ""; } return str_replace("\0", "", $str); } ?> 色々作業を進めるうちに「null byte 攻撃」や「ディレクトリトラバーサル攻撃」などの言葉が耳に入ってきてセキュリティ的に不安を感じています。 自分なりに調べて上記のようなコーディングをしましたが、果たして問題が無いのか、それとももっとたくさん考えなくてはならないのか、先輩方の意見が聞きたく質問させていただきました。 よろしくお願いしますm( __ __ )m

    • ベストアンサー
    • PHP
  • phpを使いファイル内を検索

    phpでファイル内を検索したいです。 以下のようにphpを書きましたが、やりたいことは1行目から5行目までの中でphpという言葉を検索し6行目から10行目までの中でsnsという文字を検索といったように、行数で分けて検索する言葉も分けたいです。 どのように書いて良いかなどのヒントなどいただけないでしょうか。 $file = dirname(__FILE__) . '/list.txt'; $word = 'php'; if(is_file($file)){ $array = @file( $file, FILE_IGNORE_NEW_LINES); if(in_array($word,$array)){ print_r($word); } } ?>

    • 締切済み
    • PHP
  • ファイルの取得について

    お世話になっております。 ただ今JSPにてファイルの存在チェックを行うものを作成しております。 localhost上では new File("test.txt").exists(); で”true”なのですが、 warファイルを作成後、SunOneに配備すると”false”になってしまいます。 test.txtは同じフォルダー上にあります。 String file_path = application.getRealPath("test.txt"); File test = new File(file_path); out.print(test.exists()); としても”false”になってしまいます。 どのように記述すれば”true”になるのでしょうか? お手数ですが、ご教授願います。

    • ベストアンサー
    • Java

専門家に質問してみよう