2月 07

Symfony(1.4)でZendのライブラリを使う。


今日はsymfonyでzendのライブラリを使うお話。
zendってのは、pearと同じように色々便利なことができるモジュール群と考えてもよい。
例えば、phpでHTTPリクエストしたり、XMLを解析したり、など一般的なものからtwitterやAmazonのapiを扱うものまでかなり便利なものが多い。
種類こそpearより少ないが、使いやすさはpearよりもはるかに使いやすいと思われる。

まずは、zendのインストール。今回は「/usr/local/」配下にインストールする。

cd /usr/local
wget http://framework.zend.com/releases/ZendFramework-1.10.0/ZendFramework-1.10.0.tar.gz
tar -xvzf ZendFramework-1.10.0.tar.gz
mv ZendFramework-1.10.0 Zend

こんな感じ。最後のmvは名前をなんとなく「Zend」にしておきたいだけで、意味はない。
最新のZendはココでチェック。

次にphp.iniに以下を追記する。
これがないとうまく動かない。
(すでにinclude_pathが定義されている場合は「:/usr/local/Zend/library」を足してください。)

include_path=".:/usr/local/Zend/library"

んで、次にsymfonyのautoload.ymlに以下のように記述する。
autoload.ymlはデフォrフトでは設置されていないので、アプリケーションのconfigディレクトリの下に作成する。
(プロジェクトのコンフィグ配下でもよいと思われる。)

autoload:
  # zendframework
  zendframework_lib:
    name:           zendframework lib
    path:           /usr/local/Zend/library
    recursive:      on

これで

symfony cc

うって完了。
あとはソース上のすきなとこに

$twitter = new Zend_Service_Twitter('morinoyume', 'morinoyume');

見たいな感じで、zendのライブラリを呼べばOK!簡単♪
上記はzendのtwitter用のライブラリですね。

zendは扱いやすいので、みなさんも是非!

参考:ueblog

written by YSU \\ tags: ,

1月 30

今日はphpでtwitterに呟く方法を書く。
twitterはapiで呟けるが、phpにはpearに(Services/Twitter.php)という便利なモジュールがあるので、
今回はそれを使う。細かい使い方はココが詳しい。
まずは.pearの"Services/Twitter.php"が無いと話にならない。インストール。

  pear install --alldeps -f http://labs.transrain.net/files/Services_Twitter-0.4.0.tgz

以下は呟くときのサンプルソース。ID,Password,呟きたい内容を引数に渡せば勝手に呟いてくれる関数だ。
140文字を超えている場合は135文字に切って「...」をつけてくれる。
*phpインストール時に"--enable-mbstring"オプションがないと、140文字の部分が動かないかも。

  public static function tweet($id = null , $pass = null ,  $tweet )
  {
    //ServicesTwitterの読み込み。
    require_once "Services/Twitter.php";

    //140文字を超えていたら、135文字で切って...をつける。
    if(mb_strlen($tweet)> 140 )
    {
      $tweet = mb_substr( $tweet , 0 , 135 );
      $tweet .= "... ";
    }

    $st =& new Services_Twitter( $id , $pass );
    $st->setUpdate($tweet);
  }

あとは、呼び出し側で、

self::tweet("morinoyume" , "morinoyume" , "森の夢だよーん")

とでもやれば、morinoyumeアカウントに呟かれるだろう。
twitterのAPI簡単だね。もっと勉強していきます!

written by YSU \\ tags: , ,

1月 26

symfony1.0はバッチファイルを作って、symfonyをイニシャライズして、コマンドを実行するというものであった。
symfony1.2からはバッチ処理はsymfonyのタスクで行うことになっている。
1.0ユーザーの私は困惑したので、記事にしておく。

今回はターミナルに「Hello World」を表示する簡単なタスクを作ってみることにする。

まずは、ベースとなるタスクの作成。

symfony generate:task helloworld

すると、lib/task/helloworldTask.class.php
というファイルができるので、

$this->namespace        = 'batch';
$this->name             = 'helloworld';

と適当にnamespaceとnameをふっておく。

// add your code here
echo "Hello World!!";

そして、add youre code hereの部分に上記のように記述。
あとは、タスクで実行するだけ。

symfony batch:helloworld
>Hello World!!

symfonyコマンドでバッチ処理ができている。
なんか素敵♪

written by YSU \\ tags: ,

1月 20

今日はエラー系の投稿。
phpでバッチを作成していた際にコマンドラインの引数が渡らないというお話。
phpのコマンドライン引数についてはこちらを参照。

test.php

<?php
echo $argv[1];
?>

例えば、上記スクリプトの場合

php test.php "Hello World!"

と入力すれば、「Hello World!」とターミナルに出力されるはずである。
しかし、

PHP Notice: Undefined variable: argv

となってしまい、argvそのものが定義されていないようだ・・・。
原因はphp.ini。

register_argc_argv = Off

となっていたら

register_argc_argv = On

としよう。これで解決。
以外と日本語のドキュメントがなかったので、残しておく。

written by YSU \\ tags:

1月 18

基本的に私はPHPで開発するときはSymfonyだが、今回Ethnaを入れてみた。
今回はそのEthnaについて思いのまま書いてみる。
基本的にはココを見れば一通りのドキュメントがそろっているので、
そちらを見たほうがよいだろう。

Ethnaとは

Ethna(えすな)とは、Greeが開発した和製のPHPフレームワークである。
日本でPHPフレームワークといったら、Cake , Symfony , Zendなんかがポピュラーだが、Ethnaはそれに続く立ち位置だと思う。
和製PHPフレームワークとしては、一番使われていると思われる。もちろんGREEもEthnaを使ってできている。

Ethnaをインストール

インストールはPearでサクッと入る。

pear channel-discover pear.ethna.jp
pear update-channels
pear install -a ethna/ethna

上記コマンドで打ったら

/usr/share/pear

以下にEthnaのソースが展開されたので、ここにphpのパスを通しておく必要がある。
php.iniに以下を追加。

include_path=".:/usr/share/pear"

ethnaが入っているか確認

ethna -v
Ethna 2.5.0 (using PHP 5.2.9)

Ethnaを使ってみて思った全体感

まず思ったことは、フレームワークはやりのMVCがしっかりしている。
公式ドキュメントを見ても分かるが、
コントローラーやアクションに余計なものは書かないように推奨されている。(アクションに200行以上書いちゃだめとか)
逆に言うと、MVCって何?的な人がEthnaを使えばMVCってのが何となく理解できるのではないだろうか。

Ethnaのテンプレートエンジン Smarty

Ethnaの特徴の一つは、テンプレートエンジンとしてsmartyを採用している。
また、バリデート時のエラーメッセージやformのデフォルト値、viewオブジェクトでセットした値が非常にアクセスしやすくなっている。
さらに、ユーザーが入力したform値に関してはデフォルトでエスケープ処理がされているという便利設計。
しかし、ヘッダー、フッターを都度かからなければならずsymfonyのlayout.phpみたいな便利な機能がない。
ヘッダー、フッターのインクルードファイルを作るほかないだろう。

Ethnaの文字コード

当初はEUC-JPがデフォルトだったが、最新版ではUTF-8がデフォルト。
やはりUTF-8がよい。

EthnaのDB接続

メインはPEAR::DBを継承したEthna_DB_PEARを使っている。
whileでresultセットを回して、1件、1件fetchする感じ。
直感的にSQLをかけるのは良い。
便利なことに、マスター用の接続、スレーブ用の接続(複数セットした場合は自動で振分け機能付き)など色々な接続を簡単に設定できる。

一応、O/Rマッパーも独自で実装されている。
ぱっと見は使いやすそうだが、やはりSymfonyのマッパー等にくらべると少々弱い感じがする・・・。
オブジェクトの配列を一気に取得して、がんがん回して、がんがんセットしていきたい。見た目、一つずつしか取得できない?
ただ、webのform値を一気にimport(set)できるのは便利そう!スクリプトが綺麗になる。

コレは便利formについて

チュートリアルをサクッと見ると、すごく便利に見えたのはformについて。
formのバリデートはそれ専用に書くところがあるし、エラーハンドリングやエラーメッセージもテンプレート側でsmartyを使ってアクセスしやすい。またエラー時にvalue値としてformの値をセットするが、デフォルトでエスケープされている。
また、バリーデート済みのform値はO/Rマッパーを使用してそのままオブジェクトにset->updateできる。

symfonyにも同様の機能があるが、こちらの方がテンプレートも自由にかける等少しライトに実装されており、つかいやすそう。

Ethnaのパフォーマンス

symfonyとethnaで「Hello World」を出力するアプリを作ってみて、各10回計測し、それの平均値をもとめてみた。

  • Ethna : 0.0724179
  • Symfony : 0.0970384

すくなくともsymfonyより早いので問題ないでしょう。symfonyが重すぎ・・・。
あとはDB接続周りに依存するでしょうね。

まとめ

とりあえず思ったことは、EthnaはライトなWebアプリケーションを作るのにはすごく向いているなと思う。
また、全体的に分かりやすいので習得コストもそれほどかからないだろう。
ただし、Symfonyなどと比べるとやはり機能が少ない(symfonyが多すぎ)。
もし、大規模なアプリケーションを開発するのであれば、EthnaではなくSymfonyなどを検討してみても良いと思う。

written by YSU \\ tags: ,

11月 29

前回の記事でapacheのphp.iniのパスを変更したところ、今度はphpMyAdminにログインできなくなった。

ログインしてもなんども同じログイン画面にリダイレクトされてくる。
しかも、エラーログ等にまったく出てないので意味がわからない。
php.iniの読み込みを外すとログインできるので、ID・PASSなどのmysqlの設定ではなさそうだ。

んで、アクセスログをよく見ると毎回セッションIDが違うことに気づく・・・
なるほど、セッションが繋がれていないのね。
php.iniのセッションを見直す。

session.save_path = "/var/lib/php/session"

phpはrootユーザーでインストールして、apacheのユーザーはrootユーザーでもないし、グループも違うのでここには書き込めないはず。
権限を変更。

chmod 777 /var/lib/php/session

無事セッションが繋がり解決しました。
セッションを保存するパスを変更するのもありだと思います。
phpMyAdminだけの問題ではないですね。

あーエラーばっか・・・・

written by YSU \\ tags: , ,

11月 29

コマンドラインからphpを実行したときのphp.iniのパス

Configuration File (php.ini) Path => /etc
Loaded Configuration File => /etc/php.ini

apacheからphpを実行したときのphp.iniのパス。

Configuration File (php.ini) Path => /usr/local/bin/php/lib
Loaded Configuration File => (none)

となっているので、いくらphp.iniを修正しても読み込まれない現象が起きていた。
apacheのphp.iniのパスを変えたかったがどうにも変えられない。

しかたないので今日もシンボリックリンクで逃げる。

ln -s /etc/php.ini /usr/local/bin/php/lib/.

無事解決。
apacheの再起動も忘れずに。

written by YSU \\ tags: ,

11月 29

phpを再コンパイルしてたら以下のエラーがでた。

/usr/bin/ld: cannot find -lltdl

追加したオプションでなにかひっかかったのか?
ググッてみたら以下でよいとのこと

yum install libtool-ltdl libtool-ltdl-devel

解決に結構時間がかかったので、残しておく。

written by YSU \\ tags: ,

11月 29

propel.iniでmysqlを使用することを記述し

symfony propel-build-schema

って打ったら

[propel-schema-reverse]there was an error building XML from metadata:could not find driver

と出てきた。
かなり悩んだ。困っている人もいると思うので解決方法を残しておく。

まず、ここでいうdriverというのはPDO(PHP Data Objects)のこと。
phpでmysqlに接続しにいくdriverってことですね。windowsのodbcみたいなものかー
なので、phpにpdoとpdo_mysqlっていうライブラリが無いと動かない。

peclで簡単にインストールできる。
まずpdo

pecl install pdo

そして、pdo_mysql

pecl install pdo_mysql

この2つのインストールがエラーで落ちることもあるが、ググッってがんばる。
たいていyumでインストールすれば治る系ばかり。

インストールしたらphp.iniに

extension=pdo.so
extension=pdo_mysql.so

の2行を足す。
かならず、↑の順番で書かないといけない。
(私は、順番がだめということに気づかず2時間以上も悩んだ・・・)

さて、ここまで来たらいけるかとおもいきや、

Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

ソケットがないだと!?pdo_mysqlのソケットの指定が「/var/lib/mysql/mysql.sock」になっている。
なんとかこのソケットの向き先を本来の向き先に変えたいのだが方法が見つからない・・・
仕方なくシンボリックリンクで逃げることに。

ln -s /tmp/mysql.sock /var/lib/mysql/mysql.sock

ようやく実行

symfony propel-build-schema

いけました。これでやっと開発できる。

written by YSU \\ tags: ,

5月 30

僕はインフラがとっても苦手。
そんな僕がサーバーをいじるとエラーの嵐である。
今日は、phpmyadminをインストールしていたら、

「mcrypt 拡張をロードできません。PHP の設定を確認してください。」

というエラーが・・・。
しらべてみると

yum install php-mcrypt

こんな簡単らしい・・・・

けど、できない。
そのほかにもrpmでいれるだの、php.iniを編集するだのいろいろ試すが一向に直らない。
僕の場合はphpのコンパイルからやり直さないとだめだったみたい。

--with-mcrypt --disable-posix-threads

よくわからんが、上記の2オプションつけたらうまくいきました。
インストールはやけに時間かかったけど、
再コンパイルはさっくりいけるんですね。

written by YSU \\ tags: , ,