リスを倒す 『初めてのPHP,MySQL,JavaScript&CSS』

『初めてのPHP,MySQL,JavaScript&CSS』勉強奮闘記

7-4. php実践④ファイルの操作 続

ファイルの操作の続きです。

1-1.fopen関数のモードパラメータ


前回勉強したfopen関数について、いくつかモードパラメータがあります。おさらいですが、fopen関数はファイルを開くときの呼び出し時に呼び出し方法を指定できる関数です。
以下の赤字の箇所にモードパラメータを指定することで、読み取り時にどういう動作をしてほしいかを決めることができます。
$変数=fopen("ファイル名またはURL",'r');

◎モードパラメータ

モード 動作 ファイルポインタの場所
'r' ファイルを最初から読み取る ファイルの先頭
'r+' ファイルを最初から読み取り、書き込みを可能にする ファイルの先頭
'w' ファイルの最初から書き込みを行い、ファイルを切り詰める(空にする) ファイルの先頭、ファイルサイズはゼロ
'w+' ファイルの最初から書き込みを行い、ファイルを切り詰め(空にする)、読み取りを可能にする ファイルの先頭、ファイルサイズはゼロ
'a' ファイルの終端に付加する ファイルの終端
'a+' ファイルの終端に付加し、読み取りを可能にする ファイルの終端

保存したファイルにデータを追加したい場合、先ほど示したモードパラメータの'a'もしくは'a+'を使います。

1-2.同時的アクセスに備えたファイルのロック


webプログラムが多数のユーザーに同時に呼び出されるのはよくあることなのですが、複数の人がいっせいにファイルの書き込みを行おうとするとファイルは破損する可能性があります。
また誰かがファイルに書き込みを行っているときに別の人が読み取りを行うと、問題は発生していなくても正常に読み取りができていない可能性も起きます。
それを防ぐためにファイルをロックする『flock関数』を使用します。
$変数=flock($ファイルを参照する変数,ロック方法);

ロック方法は4つあり、以下にまとめました。
◎ロック方法

ロック方法 概要
LOCK_SH 共有ロック(他のユーザーにファイルの読み取りは許可、書き込みはNG)
LOCK_EX 排他的ロック(ファイルの読み取り、書き込みNG)
LOCK_UN ロック解除
LOCK_NB ロック中にflock()でブロックさせない

そしてコードを書いてみます。

<?php
$fp = fopen('text.txt', 'r');

if (flock($fp, LOCK_EX)){
print('ファイルロックに成功しました
');

flock($fp, LOCK_UN);
}else{
print('ファイルロックに失敗しました
');
}

$flag = fclose($fp);

if ($flag){
print('無事クローズしました');
}else{
print('クローズに失敗しました');
}
?>

結果はこう。
f:id:taro-blog2323:20160822224019p:plain

1-3.ファイルのアップロード


ファイルをフォームからアップロードするには、『mutipart/form-date』というエンコードタイプを選ぶだけで、あとはブラウザが処理してくれます。

リスに書いてあるコードを打ち込んだだけだけど、、、

<?php
echo <<<_END <a class="keyword" href="http://d.hatena.ne.jp/keyword/PHP">PHP</a> Form Upload

Select File:

_END;

if ($_FILES)
{
$name = $_FILES['filename']['name'];
move_uploaded_file($_FILES['filename']['tmp_name'], $name);
echo "Uploaded image '$name'
";
}

echo "";
?>

f:id:taro-blog2323:20160822225010p:plain
うひょーなんかよく見るファイルアップロードが出てきた!
ちょっとこれ咀嚼できてないですねこれわたし、ただただ興奮している。。
このコードを紐解いていこう。。。

これは明日更新しまする。

いじょー