やったこと

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

アマゾン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();

以上!

【PHP】idiormでSQlite3のDBをVACUUMする方法!

簡単にDBを操作できるPHPライブラリ「idiorm」で、SQLite3のDBをバキュームする方法です。

以下のようなPHPコード実行すると、DBをバキュームすることができます。

  //idiorm読み込み!
  require_once dirname(__FILE__).'/lib/idiorm/idiorm.php';

  //DBファイル読み込み!
  $db_path = dirname(__FILE__).'/db/hogege.db'; 
  ORM::configure('sqlite:'.$db_path); 

  //vacuum実行!
  ORM::raw_execute('vacuum'); 

以上!

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ツイートくらいの勢いです。

ほとんど負荷がなくて、バックグラウンドで動かしていても全然平気です。

途中で接続が切れてしまった場合も、ちゃんとリトライで再接続をしてくれるお利口さんのようです。

以上!

【CakePHP3】マイグレーションのDB変更が反映されない!

先日CakePHP3の「Migration機能」で、あるテーブルに変更を加えたんです。

以下のような感じで「tweet_type」というカラムをテーブルに追加する変更をやりました。

class AddTweetTypeProducts extends AbstractMigration
{
    public function change()
    {
      $table = $this->table('tweets');
      $table->addColumn('tweet_type', 'integer', ['default' => 1, 'null' => false,])
            ->update();

      $table = $this->table('draft_tweets');
      $table->addColumn('tweet_type', 'integer', ['default' => 1, 'null' => false,])
            ->update();
    }
}

上記をマイグレーションコマンドで実行すると、たしかにテーブルに新しくカラムが追加されます。

でも「Table->find」でデータを取得すると「tweet_type」のない古い状態のレコードが取得されてしまうんです・・。

これはどうもCakePHPのキャッシュに、古いテーブルのスキーマ情報が保存されてしまっていることが原因っぽいです。

「tmp/cache/models/」のディレクトリがありますよね。ここにあるファイルを全部削除して空にしてみたところ、新しいスキーマが反映されてちゃんと「tweet_type」のカラムを操作できるようになりました。

DBに変更を加えたら「models」のキャッシュを削除しなくてはいけない、こんな決まりがあるとは知りませんでした。

CakePHPはなかなか甘くないですね・・。

以上です・・。

ツイッターカードの画像が表示されないときはしばらく待つこと!

自分のサイトに「ツイッターカード」をセットすると、サイトをツイートしたときに「画像付き」で表示させることができます。

自分のサイトのツイッターカードがうまく機能しているかどうかは、この「カードバリデーター」にURLを入れてチェックすることができます。

https://cards-dev.twitter.com/validator

ときどきちゃんとツイッターカード情報を設定したつもりなのに、このチェッカーで調べると、なぜか画像がグレーになって表示されていないときがあります・・。

そういうときは、小一時間ほど待ってみましょう。

特になにもしていないのに、しばらく経つとなぜか画像が表示されるようになります。

特になにもしていないのに、しばらく経つとツイッターカードが正常に利用できるようになります。

そう、なにもしていなくても、じっと待っていれば時間が解決してくれるのです・・。