ロードバランサー(ELB)の設定が悪くてツイッターログインが失敗!
先日私のサイトでwebサーバーを二台に冗長する作業を実施したところ、ユーザーの「ツイッターログイン」が失敗する不具合が起きるようになってしまいました・・。
私のサイトはアマゾンのAWSサーバーを使っているんですけども、どうもAWSの「ロードバランサー(ELB)」の設定が悪いせいで、ログインが失敗してしまうようです。
ロードバランサーには「スティッキーセッション」という機能があるのですが、おそらくこの設定がオフになっているのがいけないんだと思われます。
(※スティッキーセッションとは、ユーザーのセッション情報をクッキーに記憶させておき、ロードバランサーがそのクッキー情報を見ることで、アクセスを前回と同じサーバーに振り分けてくれるという、お利口な機能です)
ツイッターをはじめとした、ソーシャルログイン機能を使いたいんだったら、スティッキーセッションは有効にしないといけません。
スティッキーセッションを有効にするには、AWSのEC2設定画面の以下の赤丸の箇所を入力するとできます(ちなみにロードバランサーの種類は「Application Load Balancer」というやつを使っています)
この設定をしたところ、ちゃんとツイッターログインが成功するようになりました。ロードバランサーがセッションを判別して、認証のためのアクセスを振り分けてくれるようになったのです。
めでたしめでたし・・
【cakePHP3】paginaterの「limit」値を後から変更する!
cakePHP3のページネーション処理は「pagenater」を使うと簡単に実装できます。
https://book.cakephp.org/3.0/ja/controllers/components/pagination.html
公式ページを見ると、ページに表示するコンテンツの行数(litmi)は、以下のように初期設定することができます。
class ArticlesController extends AppController { public $paginate = [ 'limit' => 25, ]; }
limit値は、以下のように途中から変更することもできます。
class ArticlesController extends AppController { public function initialize() $this->paginate['limit'] = 10; } }
以上です。
アマゾンAWSで「php-devel」をインストールする!
アマゾンのEC2サーバーで「phpize」のコマンドを使おうとしたら、以下のようなエラーが出て怒られてしまいました。
#phpize Can't find PHP headers in /usr/include/php/5.6/php The php-devel package is required for use of this command.
どうも「php-devel」というパッケージがないとだめだと怒っているようです。
なので「php-devel」をインストールすることに。
#yum -y install php-devel --> Finished Dependency Resolution Error: httpd24-tools conflicts with httpd-tools-2.2.31-1.8.amzn1.x86_64 Error: php56-cli conflicts with php-cli-5.3.29-1.8.amzn1.x86_64 Error: httpd24 conflicts with httpd-2.2.31-1.8.amzn1.x86_64 Error: php56-common conflicts with php-common-5.3.29-1.8.amzn1.x86_64 Error: php56 conflicts with php-5.3.29-1.8.amzn1.x86_64 You could try using --skip-broken to work around the problem You could try running: rpm -Va --nofiles --nodigest
しかしyumでインストールしようとしても上記のようにエラーが出てどうしてもできません。これは大変なことです。
いろいろググって調べてみたら「yum install php56-devel」を使いなさいという外人のお言葉が。
amazon web services - not able to install php-devel in aws centos ec2 instance for php version 5.6.22 - Stack Overflow
言うとおりに「php56-devel」を入れてみたら、ちゃんと入りました。
#yum install php56-devel Installed: php56-devel.x86_64 0:5.6.28-1.130.amzn1 Dependency Installed: autoconf.noarch 0:2.69-11.9.amzn1 automake.noarch 0:1.13.4-3.15.amzn1 m4.x86_64 0:1.4.16-9.10.amzn1 pcre-devel.x86_64 0:8.21-7.7.amzn1 perl-Test-Harness.noarch 0:3.28-3.6.amzn1 perl-Thread-Queue.noarch 0:3.02-2.5.amzn1 php56-jsonc-devel.x86_64 0:1.3.6-1.19.amzn1 Dependency Updated: php56.x86_64 0:5.6.28-1.130.amzn1 php56-cli.x86_64 0:5.6.28-1.130.amzn1 php56-common.x86_64 0:5.6.28-1.130.amzn1 php56-intl.x86_64 0:5.6.28-1.130.amzn1 php56-mbstring.x86_64 0:5.6.28-1.130.amzn1 php56-mysqlnd.x86_64 0:5.6.28-1.130.amzn1 php56-pdo.x86_64 0:5.6.28-1.130.amzn1 php56-process.x86_64 0:5.6.28-1.130.amzn1 php56-xml.x86_64 0:5.6.28-1.130.amzn1 Complete!
親切な人のおかげでちゃんと「phpize」コマンドが使えるようになりました、よかったよかった。
【PHP】idiormでデータを全クリアしたい場合!
DBを操作できるPHPライブラリ「idiorm」で、テーブルのデータを全削除して真っ白にするための方法です。
以下のように「delete_many()」を使うとテーブルを真っ白に削除することができます。
//tweetsテーブルを空にする $records = ORM::for_table('tweets')->delete_many(); //usersテーブルを空にする $records = ORM::for_table('users')->delete_many();
以下のように「delete()」で馬鹿正直に削除するとものすごい時間がかかってしまうので、ご注意ください。
//tweetsテーブルを空にする $records = ORM::for_table('tweets')->find_many(); foreach ($records as $record) { $record->delete(); } //usersテーブルを空にする $records = ORM::for_table('users')->find_many(); foreach ($records as $record) { $record->delete(); }
以上です!
【PHP】idiormで「以上」や「以下」の条件式を使って検索!
簡単にDBを操作できるPHPライブラリ「idiorm」で、whereの条件式を使って「~以上」や「~以下」の値のレコードを検索する方法です。
以下のようなPHPコード実行すると、各条件でレコードを検索できます。
//idiorm読み込み! require_once dirname(__FILE__).'/lib/idiorm/idiorm.php'; //DBファイル読み込み! $db_path = dirname(__FILE__).'/db/hogege.db'; ORM::configure('sqlite:'.$db_path); //DBはSQLiteを使用 //ageが10よりも小さいデータを取得 $records = ORM::for_table('tweets')->where_lt('age', 10)->find_many(); //ageが10よりも大きいデータを取得 $records = ORM::for_table('tweets')->where_gt('age', 10)->find_many(); //ageが10以下のデータを取得 $records = ORM::for_table('tweets')->where_lte('age', 10)->find_many(); //ageが10以上のデータを取得 $records = ORM::for_table('tweets')->where_gte('age', 10)->find_many();
以上!
Phirehoseを使ってTwitter Streaming APIでツイートを取得してみた!
「Phirehose」というPHPライブラリを使って「Twitter Streaming API」のリアルタイムのツイートを取得してみました。
以下その手順です。
■「Phirehose」をインストール!
以下のGithubの「Phirehose」のページからファイルをダウンロードして、zipを解凍してください。
https://github.com/fennb/phirehose
解凍すると「lib」のディレクトリがあるので、それをお目当てのwebサーバーにまるごと移動します。
■「Phirehose」でツイート取得!
以下のようなPHPコードで「Twitter Streaming API」の「statuses/sample」のリクエストを使って、リアルタイムのツイートを取得します。
このコードはPhirehoseのexampleディレクトリにある「sample.php」のサンプルコードを真似して作ったものです。
<?php require_once('./lib/Phirehose.php'); require_once('./lib/OauthPhirehose.php'); class SampleConsumer extends OauthPhirehose { public function enqueueStatus($status) { $data = json_decode($status, true); if (is_array($data) && isset($data['user']['screen_name'])) { print $data['user']['screen_name'] . ': ' . urldecode($data['text']) . "\n"; } } } define("TWITTER_CONSUMER_KEY", "hogegegegegege"); define("TWITTER_CONSUMER_SECRET", "fugagagagaga"); define("OAUTH_TOKEN", "testestestestes"); define("OAUTH_SECRET", "123456789123456798"); // Start streaming $sc = new SampleConsumer(OAUTH_TOKEN, OAUTH_SECRET, Phirehose::METHOD_SAMPLE); $sc->setLang('ja'); $sc->consume(); ?>
このコードを叩くとプロセスが走り出し、延々とツイートを標準出力で吐き出し続けます。
体感としては、だいたい秒速10~20ツイートくらいの勢いです。
ほとんど負荷がなくて、バックグラウンドで動かしていても全然平気です。
途中で接続が切れてしまった場合も、ちゃんとリトライで再接続をしてくれるお利口さんのようです。
以上!