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

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

ただいまの
回答率

90.61%

  • PHP

    19903questions

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

  • Linux

    3654questions

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

PHPでファイル書き込み後にメモリが解放されない(PHPの問題ではない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,322

popup

score 18

原因または解決策をご存知の方がいらっしゃいましたら教えて下さい。

topコマンドでメモリ使用量を追いながら以下のスクリプトを実行すると、
実行終了後もa.pdfのファイルサイズと同じ分だけメモリが解放されません。
ファイルサイズは150MBほどです。

<?php
$input_path = '/tmp/a.pdf';
$output = fopen('/tmp/b.pdf', 'wb');
fwrite($output, file_get_contents($input_path));
fclose($output);

その後以下を実行するとメモリ使用量は元に戻ります。

rm /tmp/b.pdf

よろしくお願いします。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

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

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+4

topコマンドでメモリ使用量を追いながら以下のスクリプトを実行すると、
実行終了後もa.pdfのファイルサイズと同じ分だけメモリが解放されません。
ファイルサイズは150MBほどです。

top の何を見ていますか? 恐らくそれはディスクキャッシュによるものです。

プログラムが終了してもカーネルが b.pdf をメモリにキャッシュしているため、見せかけのメモリ使用量は減りません。

Linux の free コマンドの -/+ buffers/cache の行を見れば、ディスクキャッシュを除いた実際の使用量が確認できます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/18 12:11

    ありがとうございます、大変勉強になりました。
    ディスクキャッシュの存在をしらず、
    memoryのfreeのところだけを見ていました。

    watch -n 1 free

    で継続的に観測したところ、free, buffers, cachedの合計は減少していませんでした。

    キャンセル

+1

/tmp がメモリの上にramdiskのような形で作られているのでそれでその分のメモリが消費されているということでしょうか。
出力するファイル名を /home/user1/1.pdf とかに変更してみてはどうでしょう?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/18 12:20

    ありがとうございます。

    /tmp以外のディレクトリに出力した場合には、このような現象はおきませんでした。
    /tmpは他と違って”揮発性”をもったディレクトリなんですね。

    キャンセル

0

よくわからないんですが、
file_get_contentsは一旦変数に保存するそうで、それが保持されているっぽいですね。

fwrite($output, file_get_contents($input_path));



$pdf = file_get_contents($input_path);
fwrite($output, $pdf);
unset($pdf);

としたら、リークしないんじゃないでしょうか? 予想ですが…

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/16 17:58

    回答ありがとうございます。
    継続して調べていたところ、

    cp /tmp/a.pdf /tmp/b.pdf

    でもメモリは解放されないままでした。
    そこで、os側の機能だと思い調べたところこのようなドキュメントを見つけました。
    http://www.ibiblio.org/pub/Linux/docs/fsstnd/old/fsstnd-1.2.txt
    3.11 が/tmpディレクトリに関する章で、
    > /tmp may be on a RAM disk. /var/tmp should never be located on a RAM
    device.
    だそうです。

    キャンセル

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

  • ただいまの回答率 90.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • PHP

    19903questions

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

  • Linux

    3654questions

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