例)mp3ファイルだけを一括で削除
1 |
find . -name "*.mp3" | xargs rm |
ディレクトリが深くても再帰的に下ってくれます。
在宅プログラマーの備忘録として2005年に始めたブログです。
例)mp3ファイルだけを一括で削除
1 |
find . -name "*.mp3" | xargs rm |
ディレクトリが深くても再帰的に下ってくれます。
画像などの静的コンテンツのファイルに直接アクセスした場合は
ブラウザが自動的にキャッシュ制御を行ってくれますが、
PHPで静的コンテンツを返すような処理を行っている場合にキャッシュを利用するには
Last-Modifiedヘッダを使ってキャッシュを制御する必要があります。
まず、PHPでファイルをダウンロードさせる際に
filemtime関数でファイルの更新日時を取得してLast-Modifiedヘッダを追加します。
1 |
header('Last-Modified: filemtime('ファイルのパス')); |
さらにキャッシュを残すためのヘッダも追加します。
1 2 |
header('Pragma: cache'); header("Cache-Control: max-age=" . (60 * 60 * 24 * 30)); // 有効期間30日の例 |
そうすると、次に同じファイルをダウンロードしようとした際のリクエストヘッダの中に
1 |
HTTP_IF_MODIFIED_SINCE |
というヘッダが追加され、ファイルの更新日時が入っています。
ですので、このヘッダの有無を調べ、ファイルの更新日時と比較することで
ファイルを返すかキャッシュを返すかを判定します。
1 2 3 4 5 6 7 8 9 10 11 |
$filelastmodified = filemtime('ファイルのパス'); if(isset($_SERVER["HTTP_IF_MODIFIED_SINCE"])){ $headerlastmodified = $_SERVER["HTTP_IF_MODIFIED_SINCE"]; if(strtotime($headerlastmodified == strtotime($filelastmodified)){ // 更新日が一致したのでキャッシュを返す // (正しくはレスポンスコード304を返す) } else { // ファイルを返す } } |
レスポンスコード304を返す処理は下記の通りです。
1 2 3 |
header("HTTP/1.1 304 image not modified"); header('Pragma: cache'); header("Cache-Control: max-age=" . (60 * 60 * 24 * 30)); |
ちなみに、Etagというヘッダを使ってキャッシュを制御することもできますが
Etagはどちらかというと動的コンテンツのキャッシュで利用するためのものです。
静的コンテンツのキャッシュにもEtagを使ったサンプルが多くみられるのですが
Last-Modifiedヘッダだけで十分だと思います。
調べ方も様々なのでつい忘れてしまいますよね。
CentOSのバージョン
1 |
cat /etc/redhat-release |
Apacheのバージョン
1 |
httpd -v |
MySQLのバージョン
1 |
mysql --version |
PHPのバージョン
1 |
php -v |
長いタイトルですが、タイトル通りのことをやることになり、
スマートなやり方が思いつかず、結局ループを2回回す方法でやりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
var _form_data = new FormData(); var _q = location.search.replace('?', ''); var _qs = _q.split('&'); var _param_tmp1 = {}; // 同名パラメータが2つ以上あるかどうかをカウントするループ for(var i = 0; i < _qs.length; i++) { var _kv = _qs[i].split('='); if(_kv.length == 2) { if(_param_tmp1[_kv[0]]) { _param_tmp1[_kv[0]]++; } else { _param_tmp1[_kv[0]] = 1; } } } // カウントが2つ以上なら後ろに[]をつけるループ for(var i = 0; i < _qs.length; i++) { var _kv = qs[i].split('='); if(_kv.length == 2) { if(_param_tmp1[_kv[0]] == 1) { _form_data.append(_kv[0], _kv[1]); } else { _form_data.append(_kv[0] + '[]', _kv[1]); } } } |
以下のような条件でAjax通信を行うと、ブラウザは自動的に「プリフライト」と呼ばれる通信チェックを行います。
1 2 |
・クロスドメインである ・独自にリクエストヘッダを追加している |
プリフライトは通信メソッド「OPTIONS」でサーバーに通信を行い、
1 2 |
・クロスドメインのアクセスが許可されているか ・追加したリクエストヘッダが許可されているか |
をチェックします。
このチェックをパスしなかった場合はそこで処理は終了し、本来のGETやPOSTの通信が行われませんので
「あれ、POSTしたのになんでOPTIONSになってるんだ?」
と混乱してしまいますよね。
ちなみにサーバー側でクロスドメインを許可するには
レスポンスヘッダにAccess-Control-Allow-Originを設定し、許可するドメインを指定します。
PHPの場合ですべてのドメインを許可するなら
1 |
header('Access-Control-Allow-Origin: *'); |
のようになります。
また、独自のリクエストヘッダを許可するには
レスポンスヘッダにAccess-Control-Allow-Headersを設定し、許可するヘッダを指定します。
1 2 3 4 5 6 7 8 9 |
header('Access-Control-Allow-Headers: ' . 'Origin, ' . 'X-Requested-With, ' . 'Content-Type, ' . 'Accept, ' . '(独自のヘッダ1), ' . '(独自のヘッダ2), ' . '(独自のヘッダ3), ' ); |
こんな感じです。