2014年10月1日水曜日

PHPmemo_day8

PHPの基本に関するメモ。参考にしているのはPHPによるWebアプリケーションスーパーサンプル第2版の第8章(ファイル)の前半です。

  • die関数はexitと同じでスクリプトを終了するという意味がある。以下のコードはfopenに失敗した場合(ファイルが存在しない場合など)にdieが呼ばれる。
  • $file = fopen($target, "a") or die("ファイルオープンに失敗しました");
    flock($file, LOCK_EX); // ファイルの排他的ロック
    fputs($file, "abc</br>"); // 改行をつけてabcとファイルに書き込む
    flock($file, LOCK_UN); // unlock、ファイルの排他的ロックを解除する
    fclose($file);
  • 共有ロックはLOCK_SH、ロック中に他のflock()でロックさせたくなければLOCK_NBをflock関数の引数で指定する。
  • fopenはaで追記、wは上書きという意味になる。rは読み込み専用。xというオプションもある。+をつけることで読み書きの両方ができるようになる。
  • tmpfile()関数を用いると、一時ファイルを作成できる。ここにデータを書き込むなどすればよい。fclose()で一時ファイルを閉じると、ファイルは自動的に削除される。
  • file_put_contents関数を使うと、fopenでファイルを開かなくても指定したファイルに書き込みができる。fcloseなども不要になる。
  • ファイルの読み込み時はファイルが存在しないとエラーになるので、@をつけてエラーメッセージを非表示にする手法が用いられる。
  • // 読み込み(r)なので、@をつけないとエラーメッセージを抑制できない
    $file = @fopen($target, "r") or die("ファイルオープンに失敗しました");
    flock($file, LOCK_EX); // ファイルの排他的ロック
    while( feof($file) ){
     echo fgets($file, 1000)."</br>"; // 1行ずつ表示。1000と指定すると999バイトまで読み込める。
    }
    flock($file, LOCK_UN);
    flose($file);
  • fgetsに代わり、fgetcとすると1バイトずつ読み込むことになる。freadは指定したバイト数だけ読み込んでいく。
  • ファイル全体をまとめて読み込む場合には、fread関数とファイルサイズを調べるfilesize関数を組み合わせる方法がある。その他、file_get_contents関数、file関数がある。file_get_contents関数はファイルの中身を1つの文字列として取得する。file関数はファイルの内容を配列で入れる(改行なんかで1つの要素ごとに区切っているっぽい)。
  • ファイルの存在確認にはfile_exists関数(返り値はboolean)が使える。
  • rewindはファイルポインタを先頭にセットするための関数である。
  • fileatime関数はファイルの最終アクセス時刻を調べるための関数である。最終更新時刻はfilemtime関数で調べる。
  • ファイルの許可属性はfileperms関数で調べられる。ただし、出力結果はlinuxのパーミッションのように0~7の3桁の数字でもないので注意が要る。
  • 拡張子のチェックはpathinfo関数の返り値のインデックスextensionを使うとよい。pathinfoはパス名に関する情報を得るための関数である。インデックスbasenameにはファイル名(拡張子付)が含まれている。
  • ファイルの読み込みができるかについてはis_readable関数を、書き込み可能かどうかはis_writable関数を使う。実行可能かどうかについてはis_executable関数を使う。
  • copy(from, to)でファイルコピーができる。ファイルのコピー先は強制的に上書きされる。
  • rename(from, to)でファイル名の書き換えができる。変更先にファイルが既に存在しているとエラーになるので、そのような場合にエラーメッセージを抑制したい場合は@rename(from, to)とする。
  • unlink($file)で$fileを削除できる。削除対象がないとエラーになるので、file_existsで一度調べてから削除することもある。あるいは@unlink($file)のようにすることもある。

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計