2013年12月26日木曜日

CSSやJavaScriptの変更がブラウザ上で反映されない問題

Vagrantの共有フォルダにCSSなどの静的ファイルを配置していた場合、ファイルの変更がブラウザに反映されない。

これはVagrantのsendfileという機能がキャッシュを送信してしまうため発生する。

sendfileを無効化するには、Webサーバーの設定ファイルを変更しなければならない。

当方のApache設定ファイルは次の場所に格納されていた。
/etc/httpd/conf/httpd.conf

そして次の記述を追加
EnableSendfile off
上書き保存後にWebサーバーを再起動


以上

2013年12月6日金曜日

Webブラウザからローカル開発環境上のPHPにファイル書き込みを実行させる

ドットインストールでPHP入門を学習していて躓いたこと。



PHPから外部ファイルに書き込む練習で次のようなソースを作成した。

// ファイル書き込み
$testFile = "test.dat";
$contents = "Hello World! \n";
if (is_writable($testFile)) {
 // ファイルオープン
 if (!$fp = fopen($testFile, "a")) {
  echo "could not open!";
  exit;
 }
 // 書き込み
 if (fwrite($fp, $contents) === false) { // "===" 厳密な"=="
  echo "could nor write!";
  exit;
 }
 echo "success!";
 fclose($fp);

} else {
 echo "not writable!";
 exit;
}


Webブラウザからローカル開発環境にあるPHPを実行すると
not writable!


試しにコンソールからローカル開発環境にログインしてPHPを実行すると

と上手くいっている様子。


書き込み先の test.dat の中身を見てみると




書き込みできている。



Webブラウザからはダメでローカル開発環境内ではOKということは、ファイル配置先の権限設定に問題があるのかも。


ファイルやディレクトリの権限設定を見る方法を調べると、
ls -l
というコマンドを発見。


早速コマンドを打ってみる。

test.dat の権限を細かく見てみると
①[ - ]  ②[ r w - ]  ③[ r w - ]  ④[ r - - ]
という4パーツに分けられる。
①[ - ] 対象がファイル("-")かディレクトリ("d")か
②[ r w - ] オーナー権限
③[ r w - ] グループ権限
④[ r - - ]  その他ユーザー権限
今回はWebブラウザから、つまり外部からのアクセスなので④が関係していると思われる。


各権限を表す3桁の意味は次の通り。
r:readable 読み込み可能
w:writable 書き込み可能
x:executable(?) 実行可能
-:該当の権限を持たない
このことから test.dat には外部ユーザーから書き込み権限がないことが分かる。


ということで、書き込み先のファイル test.dat にwritable権限を追加してみる。

使用するコマンドは
chmod [変更後の権限状態] [変更対象のファイル名]
変更後の権限状態は②〜④の権限状態をそれぞれ2進数から8進数に直した値を設定する。
②:[ r w - ] → [ 1 1 0 ](2進数) → [ 6 ](8進数)
③:[ r w - ] → [ 1 1 0 ](2進数) → [ 6 ](8進数)
④:[ r w - ] → [ 1 1 0 ](2進数) → [ 6 ](8進数)
→ [変更後の権限状態]:666
権限変更が反映されたことを確認。


WebブラウザからPHPを実行してみると
success!

test.dat の中身を見てみると
書き込みが追加されている。


ということで今回はローカル開発環境の権限設定を学習した。




ついでに権限設定で疑問を抱いたこと。
writable 書き込み可能
という言葉を見ると、書き込み命令を出す側(今回はPHP)が他のファイルに対して書き込むことができるという印象を受けた。

しかし実際には、書き込み対象のファイル(今回は test.dat )に対して書き込むことができるという意味だ。

ならばむしろ「変更可能」という表現にした方が誤解がないように思える。