あなたのコード、激遅ぷんぷん丸?今すぐできる7つのチェック項目 PHP編

php_logo

みなさん、こんにちは。

GeNERACEのピンキリエンジニアこと、ひろゆきです。

ここのところPHPを書いてるんですが、同じ処理を書くとしても、どの関数を使えば良いのか分からないことがありました。

たとえば、繰り返し処理を書くにしてもfor, foreach, whileと3種類もあります。

いったいどれを使えば良いの?(´・ω・`)

分からないなら調べれば良い。

ということで、弊社環境にて処理速度の検証してみました。

(この辺ってググってみても、ソースが古かったりしてたので、あえて調べました)

Continue reading

PHP初心者向けのコードの最適化

php_code_image

こんにちは。GeNERACEのみきあらいです。
今回はPHP初心者の方に向けて、コードの最適化について書かせて頂きました。初めにコードを書くにあたって意識したことをまとめ、その後に実際にどのようなコードを書いたのか、サンプルコードをご紹介します。

Continue reading

俺のコントローラのprotectedがpublicなわけがない

こんにちは。
最近、東北TECH道場(仙台道場)でAndroidの講師してます、GeNERACE CTOけんたろです。
今回は東北TECH道場で行なっている活動やハックについて書こうと思いましたが、弊社の仕事でCakePHP(v2.3.1)を使っていて気になったことについてメモします。

Continue reading

CakePHPでMongoDBを使う基本

こんにちは、ピンキリエンジニアのひろゆきです。

最近は久しぶりにPHPを書いており、MongoDBも始めてみたので、CakePHPとMongoDBについて少し書いてみたいと思います。

今回はちょこっと触った程度の、CakePHPからMongoDBを使用するための内容になります。

※CakePHPは1.xの時に少し使った、MongoDBはほぼ初心者な状態です

今回使用した環境は

・AmazonEC2のRedhat
・PHP 5.3.3
・Apache 2.2.15
・MongoDB 2.2.3
・CakePHP 2.3

になってます。

これでCakePHPからMongoDBを操作してみたいと思います。

まずはMongoDBをインストールします。

リポジトリの追加

sudo vi /etc/yum.repos.d/10gen.repo

リポジトリ設定

[10gen]
name=10gen Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64
gpgcheck=0
enabled=0

インストール

sudo yum install mongo-10gen-server.x86_64 mongo-10gen.x86_64 --enablerepo=10gen

起動

sudo /etc/init.d/mongod start

これでMongoDBの準備はOKです。

次はこれをCakePHPから操作します。

CakePHPではデフォルトでいくつかのDBを使用でき、簡単にWEBサイトを構築出来ますが、
MongoDBについてはichikawayさんが提供しているPluginを使用することで可能になります。

https://github.com/ichikaway/cakephp-mongodb
※githubから

cloneするかもしくは別の方法で

app/Plugin/MongoDB

に配置します。

次にdatabase.phpを変更してMongoDBへの接続を定義します。

public $default = array(
	'datasource' => 'Mongodb.MongodbSource',
	'host' => 'localhost',
	'database' => 'your_database_name',
	'port' => '27017',
	'encoding' => 'utf8',
);

では、実際に操作をしてみます。

データを登録する

$data = array();
$data['value1'] = 1;
$data['value2'] = array(1,2,3);
$data['value3'] = array('a' => 1, 'b' => 2, 'c' =>3);
$data['value4'] = array('a' => array(1,2,3), 'b' => array(4,5,6));
$this->Sample->save($data);

発行されたクエリ

db.samples.insert( {"value1":1,"value2":[1,2,3],"value3":{"a":1,"b":2,"c":3},"value4":{"a":[1,2,3],"b":[4,5,6]},"modified":"MongoDate(0.39200000 1363326797)","created":"MongoDate(0.39200000 1363326797)","_id":ObjectId ("5142b74d2dc6b69371000002")} , true)

登録された内容

{ "_id" : ObjectId("5142b74d2dc6b69371000002"),
  "value1" : 1, 
  "value2" : [ 1, 2, 3 ], 
  "value3" : { "a" : 1, "b" : 2, "c" : 3 }, 
  "value4" : { "a" : [ 1, 2, 3 ], "b" : [ 4, 5, 6 ] }, 
  "modified" : ISODate("2013-03-15T05:17:21.393Z"), 
  "created" : ISODate("2013-03-15T05:17:21.393Z") }

データを取得する

$this->Sample->find('all');

発行されたクエリ

db.samples.find( [], [] ).sort( [] ).limit( 0 ).skip( 0 )

取得した内容

array(1) { 
 [0]=> array(1) {
  ["Sample"]=> array(7) { 
   ["value1"]=> int(1) 
   ["value2"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   ["value3"]=> array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } 
   ["value4"]=> array(2) { ["a"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["b"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
   ["modified"]=> object(MongoDate)#38 (2) { ["sec"]=> int(1363325551) ["usec"]=> int(106000) } 
   ["created"]=> object(MongoDate)#39 (2) { ["sec"]=> int(1363325551) ["usec"]=> int(106000) } 
   ["id"]=> string(24) "5142b74d2dc6b69371000002"
  }
 }
}

データが作成されました。

今回はidを指定せず自動で生成しています。

データを更新する

$list = $this->Sample->find('all');
$data = $list[0]['Sample'];
$data['value1'] = 100;
$data['value5'] = 'Hello World';
$this->Sample->save($data);

発行されたクエリ

db.samples.update( {"_id":ObjectId ("5142b74d2dc6b69371000002")}, {"$set":{"value1":100,"value2":[1,2,3],"value3":{"a":1,"b":2,"c":3},"value4":{"a":[1,2,3],"b":[4,5,6]},"modified":"MongoDate(0.39200000 1363326797)","created":"MongoDate(0.39200000 1363326797)","value5":"Hello World"}}, {"multiple":false} )

変更後の内容

array(1) {
 [0]=> array(1) {
  ["Sample"]=> array(8) {
   ["created"]=> object(MongoDate)#38 (2) { ["sec"]=> int(1363326797) ["usec"]=> int(392000) } 
   ["modified"]=> object(MongoDate)#39 (2) { ["sec"]=> int(1363326797) ["usec"]=> int(392000) } 
   ["value1"]=> int(100) 
   ["value2"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } 
   ["value3"]=> array(3) { ["a"]=> int(1) ["b"]=> int(2) ["c"]=> int(3) } 
   ["value4"]=> array(2) { ["a"]=> array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) } ["b"]=> array(3) { [0]=> int(4) [1]=> int(5) [2]=> int(6) } } 
   ["value5"]=> string(11) "Hello World" 
   ["id"]=> string(24) "5142b74d2dc6b69371000002" } } }

CakePHPを使用しているので、同idがデータに存在する場合は更新にしてくれます。
新しく追加したカラム「value5」もちゃんと反映されています。

データを削除する

$list = $this->Sample->find('all');
$data = $list[0]['Sample'];
$this->Sample->delete($data['id']);

発行されたクエリ

db.samples.remove( {"_id":ObjectId ("5142b74d2dc6b69371000002")} )

指定されたidのデータが削除されました。

上記でCRUDについての操作が行えました。

Pluginのおかげで、これくらいであればサクッと簡単にできちゃいます。

まだまだ基本的な部分を触りながら確認している状況ですので、もう少し慣れたら詳しくメモも含めてログを残したいと思ってます。

MongoDBならではの操作方法についてとか書いておくと良いかなー、と。

以上、ありがとうございました!!

LinuxのシェルコマンドでFuelPHP開発環境を構築

こんにちは。金髪エンジニアのみきあらいです。今日でGeNERACEに入って2ヶ月めになります。
今回はLinuxのシェルコマンドを使ってFuelPHPの開発環境を構築する方法について書きます。

個人で開発環境を設定するのなら一人でコマンドを叩けばいいのですが、複数人で同じことをする場合、
各人がそれぞれコマンドを叩くのはあまり効率的とは言えません。
そこで、「これさえあれば一瞬で開発環境が作れる!」というシェルスクリプトを書きました。

☆下準備

  • GitのリポジトリにFuel PHPをフォークする。
  • DNSにサブドメインを設定する。
  • Apacheが入っているLinuxサーバーを準備する。
  • PHP5.3がApacheで起動していることを確認する。
  • サーバー用のssh鍵を作成する。(Git使用時に必要)
  • configファイル、xxx_setupを書いてサーバー上に置く。(注意:本物のconfigファイルではなく、あくまで別のconfigファイルを作成するためのものなので、拡張子を.confにしないこと!)

xxx_setupの中身

<VirtualHost *:80>
        ServerName 任意の名前(例:xxx)
        DocumentRoot 任意のドキュメントパス(例:/home/xxx/www/public)
        DirectoryIndex 任意のファイル(今回はindex.phpとindex.htmlを設置)
</VirtualHost>

ServerNameに記載した名前でブラウザから参照することができます。

☆今回やりたいこと

  • 作成したconfigファイル、xxx_setupの中身をコピー。
  • コピーしたファイルをもとに”各ユーザー名.conf”を作る。
  • コピー元ファイルでユーザーごとにあわせて置換したい部分を置換。(上記の例だとサーバー名やルートパス内の”xxx”を各ユーザー名に置換)
  • Gitに置いたFuelPHPをサーバーにgit cloneする。
  • Apacheを再起動する。

シェルスクリプトを書きます。
今回は”shelltest.sh”というシェルスクリプトを作成します。

vi shelltest.sh

“shelltest.sh”の編集を行います。
まず、シェルスクリプトを/bin/shで実行させます。

#!/bin/sh

echoの後ろに変数や文字列を指定します。今回はコメントを文字列として表示します。
すでに”ユーザー名.conf”がある場合も考慮し、スーパーユーザー権限で事前に削除します。-rfをつけてエラーなしで削除します。

echo "setting for httpd"
sudo rm -rf /etc/httpd/conf.d/${USER}.conf

事前に作成したxxx_setupを、”ユーザー名.conf”としてコピーします。

sudo cp -rf /etc/httpd/conf.d/xxx_setup /etc/httpd/conf.d/${USER}.conf

コピー元のxxx_setupの中には”xxx”という文字列があり、それを各ユーザー名に変えたいので、置換するためのコマンドを書きます。

sudo sed -i "s/xxx_setup/"${USER}"/g" /etc/httpd/conf.d/${USER}.conf

変数として${USER}と書くと、そのまま${USER}という文字列として置換されてしまうので、${USER}以外をダブルクオーテーションで囲みます。

次に、confで作成したDocumentRootにFuelPHPを配置します。今回は/home/ユーザー名/www以下にFuelPHPを置きます。
/home/ユーザー名/wwwが既にあることを想定して一度エラーなしで削除し、新たにディレクトリを作り直します。

echo "delete old folder"
rm -rf /home/${USER}/www
echo "settings"
mkdir /home/${USER}/www

/home/${USER}/wwwに移動し、Gitに置いたFuelPHPをサーバーにクローンします。
git@github.com:の後ろにはGithubの各人のユーザー名を書くので、変数として$1を引き渡します。

echo "clone git@github.com:"$1"/fuel.git "
cd /home/${USER}/www/
git clone git@github.com:$1/fuel.git

今回はクローンするだけとしましたが、中央リポジトリのリモートリポジトリを作成したい場合は以下のコマンドを書きます。
(例:fuel.gitのクローン元があるGithubのユーザー名=”UserXXX”、リモートリポジトリ名=”upstream”)

git remote add upstream git@github.com:UserXXX/fuel.git

例として”dev”というブランチを作成し、devブランチに切り替えてpullとpushを行います。

git checkout dev
git pull upstream dev
git push origin dev

最後に作成したconfファイルを反映させるためにApacheを再起動させます。
restartだとエラーが起きたときにApache自体が落ちてしまうので、それを避けるためにgracefulコマンドを使います。

echo "graceful httpd"
sudo /etc/rc.d/init.d/httpd graceful

“shelltest.sh”の編集モードを終了します。これで”shelltest.sh”の完成です。

☆”shelltest.sh”の実行!
早速作成した”shelltest.sh”を実行しましょう。引数$1としてLinuxに渡すGitHubの各人のユーザー名を実行時に入力します。

cd shelltest.shが格納されている場所
sh shelltest.sh GitHubの各人のユーザー名

これでシェルスクリプトを叩くだけで、FuelPHPの開発環境ができるようになります!
シェルスクリプト全体はこちらのgistを参照してください。

今回はここまでです。ご覧いただきましてありがとうございます。

参考記事一覧