やったこと

webサービスを作るときに考えたことを垂れ流します

【CakePHP3】ページネーション処理にキャッシュを効かせる!

CakePHP3の「ページネーション処理(Paginate機能)」の結果をキャッシュとして保存する方法です。

以下のように「検索クエリ」作成時に検索結果をキャッシュ保存する旨を書き込んでおきます。

//クエリを作成
$query = $this->Tweets->find()
              ->where(['post_id' => $post_id])
              ->order(['post_index' => 'asc'])
              ->cache("testestes", "long"); //キャッシュ保存する!

//ページネーション情報を作成
$tweets = $this->paginate($query);


これで「testestes」というキー名で、検索結果がキャッシュされます。

動作としては、もし「testestes」というキャッシュがすでに存在すればそのキャッシュの内容をロードして、「testestes」が存在しなければ新たにそのキャッシュを作成します。

このキャッシュ処理の注意点は、ここでキャッシュとして保存される内容は、もし「$paginate = ['limit' => 10]」みたいに設定していたとしたら、そのページで表示される10件分の結果しか保存されないということです。なので「1ページ目」だけではなく、ちゃんと「2ページ目」「3ページ目」の内容も別キャッシュとして保存しないといけないということです(まあ当たり前のことですね・・)。

ちなみに「long」と書いてあるのは、私が作ったオリジナルキャッシュの設定名のことです。これを省略すると通常の「default」の設定でキャッシュが保存されます。

自分専用のキャッシュ設定をする方法は、以前私が書いた「【CakPHP3】クリアしてもキャッシュが消えない! - やったこと」の記事をご参照ください。

以上です!

Facebookページで個人名を表示させない(非公開)にする!

Facebookには「個人ページ」と「Facebookページ」という二種類のページがあります。


・「個人ページ」とは、あなた個人がお友達などと交流するためのページです。
・「Facebookページ」とは、企業などが宣伝・告知用とかに作るページです。


Facebookページ」にあなたの個人名が載ってしまうとまずいですよね?(だっていかがわしいサイトを運営してることがバレてしまいますもんね・・)

ということで以下、「Facebookページ」に、管理人であるあなたの名前を載せない(非公開にする)ための方法です。

***

基本的に「Facebookページ」は、初期設定で管理人の名前が載らないようになっています。
なので特に設定をいじらなければ名前がバレることはありません。安心してください。

管理人の名前が間違って「公開設定」になってしまっていないかどうかは、以下の設定欄で確認できます。

f:id:absg:20161011170902p:plain


1.ページ右上あたりの「設定」と書いてあるバーをクリックします。
2.左のメニューの★印の「注目」と書いてある箇所をクリックします。
3.ここの「ページオーナー」の項目に、名前が記載されていなければ、あなたのプロフィールは公開されない設定になっています。

これであなたの人生は安泰です、安心してください。

【CakePHP3】エレメントのキャッシュが削除できない!

CakePHP3(ver3.1)で、エレメントの表示内容をキャッシュ(ファイルキャッシュ形式です)したのですが、うまく削除できません・・。

例えば以下のように、エレメントの呼び出し時にキャッシュ保存をするとします(キーは「test_post270」)

<?php echo $this->element('comment', ['id'=>$id, 'text'=>$text],
           ['cache' => ['config' => 'long', 'key' => 'test_post270']]
);?>

そして以下のようにキャッシュを削除しようとしてもファイルが削除されません。

Cache::delete("test_post270", "long");

なぜかというと、エレメントで保存したキャッシュは、キー名の頭に勝手に「element_」という文字列がくっつくからです。

なので以下のように「element_」を頭につけてキーを指定しないと、キャッシュは消えないというわけです。

Cache::delete("element_test_post270", "long");

この動作ってなんかおかしくないですかね・・?

実はエレメントキャッシュを削除するための特別な命令があって、私が知らないだけなんでしょうか・・?

なんかすごい不便です・・。

【CakePHP3】リファラー(アクセス元URL)を取得する!

CakePHP3では以下の方法でアクセス元のURLを取得できます(めっちゃかんたんですね)

//アクセス元URL取得
$url = $this->referer();

//リダイレクトする場合はこう
$this->redirect($url);

以上!

【javascript】途中でvar変数宣言すると値がundefinedになってしまう!

javascriptを書いていてつまづいてしまいました・・。

以下のような処理を書いたんです。

グローバル変数twitter_id」が存在しないときに、ローカル変数として同じ名前で変数を用意するという処理です(なんだか臭いコードですねこれは・・)

  if(typeof twitter_id === undefined){
    var twitter_id = 0;
  }

このコードは必ずifの中を通ってしまいます。

なぜならjavascriptではコード中に「var宣言」があると、その「var」はコード先頭にあると見なして、処理の頭で早々に変数を用意してしまう動作をするそうです(値にはundefinedがセットされる)

この動作は「変数の巻き上げ(ホイスティング)」と呼ばれているそうです。

結局グローバル変数twitter_id」があろうとなかろうと、先頭で「undefined」で塗りつぶされた「twitter_id」が用意されてしまい、ifの中を通ってしまう運命にあるということですね。

こんな動作知らなかったよ・・。

【CakPHP3】クリアしてもキャッシュが消えない!

CakPHP3のキャッシュ機能の話です。

「app.php」に以下のような感じの設定をして、キャッシュをwriteコマンドで保存してみたんです(キャッシュファイルは「/tmp/cache/hogege/」に保存されます)

    'Cache' => [
        'test' => [
            'className' => 'File',
            'duration' => '+10 seconds',
            'path' => CACHE.'hogege'.DS,
        ],
//キャッシュ保存!
Cache::write('test_key_hoge', 'テスト文章だよ!', 'test');


そしてキャッシュを削除しようとして「Cache::clear(true);」とか「Cache::gc('test')」とかを実行してみたんですけど、なかなかうまく削除できません・・。

しばらく調べてみたところ、「Cache::clear」とか「Cache::gc」とかは、「FileEngine」(memcacheとか)を使っているときに使うコマンドのようです。

私は上記の設定の通り「File」キャッシュを使っているので、「Cache::delete」の方を使わないといけなかったんですね・・。

以下のコマンドでうまくキャッシュを削除できました。

Cache::delete('test_key_hoge', 'test');


「Cache::delete」だと「期限切れのキャッシュだけ削除する」みたいな器用なことができなくて、いろいろ不便ですね・・。

やっぱ背伸びして「FileEngine」を使った方がいいのかしら・・。

もっと詳しい情報を知りたい人公式ページをご参照あれ。
http://book.cakephp.org/3.0/en/core-libraries/caching.html

以上!

【CakePHP3】PCかモバイルか判定する方法!

CakePHP3でユーザーがPCかモバイルかを判定する方法です。

お好きなコントローラー内で以下のようにして判定できます。

超簡単ですね・・。

if($this->request->is('mobile')){
  $this->viewBuilder()->layout('モバイル用レイアウト');
}else{
  $this->viewBuilder()->layout('PC用レイアウト');
}

以上!