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

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

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

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

Q&A

解決済

1回答

404閲覧

fopen a で開いた時のポインタ移動時間

colling

総合スコア798

PHP

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

0グッド

0クリップ

投稿2018/10/22 10:47

編集2018/10/22 10:49

PHPの fopen に関する疑問です。

先日、自サイトにアクセスログを設置してみようと思い立ちfopenにてログファイルを開きfputして閉じるだけの簡単なプログラムを組みました。下記↓

php

1date_default_timezone_set('Asia/Tokyo'); 2$log = date( "Y-m-d H:i:s" ). "\t"; 3$log .= $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] . "\t"; 4$log .= $_SERVER['HTTP_USER_AGENT'] . "\t"; 5$log .= $_SERVER['HTTP_REFERER'] . "\t"; 6$log .= @gethostbyaddr($_SERVER['REMOTE_ADDR']) . "\n"; 7$fp = @fopen(“ファイルまでのパス/log.txt", "a") or die("Log Error"); 8flock($fp, LOCK_EX); 9fputs($fp, $log); 10fclose($fp); 11?>

ログを撮りたいファイルにinclude_onceして使うイメージです。

ふと、このあたりちゃんと勉強せずに使っていたなぁと思い、webであちこち調べましたが、ファイルを開いてポインタを移動するだけなのでメモリの圧迫はないだの無視できるだのの記述はあるのですが、ポインタの移動時間について触れている記述が見つかりません。

Q1. ファイルをfopen a で開いて、1行書き込んで、クローズという簡単な作業なのですが、ファイルの中身の行数が増え数十万行とかになってきた場合、オープンの時間や、ポインタを最終行に移動する時間は増えるものなのでしょうか?

Q2. 簡単な処理なので、データベースを使うまでもないという考えなのですが、データが増大した場合データ保存部分はDBに投げしてしまった方が、処理時間がかからないのでしょうか?
(個人的にはDBの接続手続きの方が時間がかかりそうなイメージを持っています。)

試したこと

1万行ぐらいまで試してみましたが、ログ書き込みよりもページのHTML描画やjavascriptの処理の方が時間がかかっている感じでしたので、上記スクリプトをincludeするだけのページも作成してみましたが、一瞬で終わってしまいます。

ご存知の方がいらっしゃいましたら、アドバイスお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Q1:
ファイルポインタをファイルの特定位置に位置づける時間はその移動距離にはほぼ無関係です。
小さいファイルだと、先頭に位置づけるのと末尾に位置づけるのは同じ時間だし、大きなファイルでもディスクを1-3回くらい余分にアクセスするくらいです。実用上は同じと考えて良いでしょう。

Q2:
書き込む時間の話だけであれば、単なるファイルの方が速いです。

投稿2018/10/22 14:10

otn

総合スコア84505

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

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

colling

2018/10/22 14:32 編集

otnさんご回答ありがとうございます。 妙にスッキリいたしました。 ファイルポインタの移動時間は気にならないということは、大きなログを見るときも終端からfseekしながら最新の100行ぐらいを取り出すような実装にすれば、全行読み込むより大幅に時間短縮できるという理解で良いでしょうか?
otn

2018/10/22 14:49

そうですね。 先頭から100行であれば、先頭から\nを数えながら読めば良いのですが、 末尾から100行は、逆向きには読めないので、平均的な行長を想定して、およその位置に位置づけて、そこから末尾に向かって順番に読んでいくしかないので、およそ100行ということになります。
colling

2018/10/22 15:18

わかりました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問