[php]WordPressでsshを利用した自動更新を行う(for Ubuntu)

Posted under php by uechoco on 土曜日 31 12月 2011 at 21 : 22 : 11

WordPressにはFTPとFTPSを利用した自動更新をする仕組みがあるが、実はSSH経由での自動更新もサポートしているらしい。

FTP・SSH 定数 – wp-config.php の編集 – WordPress Codex 日本語版

マニュアルには、「pecl install ssh2」とやってphpのssh2ライブラリをインストールするように書いてあった。
私のWordPressの環境は、Ubuntu+nginx+php5-fpmという環境で、「sudo aptitude install libssh2-php」だけインストールして、php5-fpmをrestartしたら、WordPressの自動更新画面のオプションに「ssh2」が出現した。

なーんだ。標準でsshも対応してたのね。さっすがWordPress。

追伸(30分後):どう頑張っても自分の環境ではSSH接続ができなくて、困りました。結局、WordPressのフォルダを「sudo chwon www-data. blog/」としてnginxとphp5-fpmのユーザーの所有物にしてしまい、FS-METHOD=directとすることで、直接DLするモードを使いました。自分がサーバー管理者だったらこっちのほうが超速で自動更新できるからいいかもねw


[Symfony2]入出力の文字エンコードを変換してみよう Symfony Advent Calender JP 2011 – 6日目-

Posted under php,Symfony2 by uechoco on 火曜日 6 12月 2011 at 10 : 00 : 00

@uechocoです。Symfony Advent Calendar JP 2011の6日目の記事です。@fivestrさんからのバトンタッチです。

日本Symfonyユーザー会に所属するスタッフとして、勢いで申し込んでみたものの、
普段職場でSymfonyを使ってないのでネタ探しに苦労しました。

そういえば去年のSymfony Advent 2010 : ATNDでは[Symfony2]PEAR::Net_UserAgent_MobileをDIコンテナから呼び出すという記事を書きました。
今年も似たような領域で、ガラケー向けのWebサイト開発で使えるかもしれないテクニックとして、入出力される値やコンテンツの文字コードを変換する方法をご紹介します。

symfony 1.x系ではMojavi由来のフィルタチェインの機構がありましたので、
MobileEncodingFilterなどのクラスを作って、入出力の前後でエンコードの変換をかませるというのが一般的だったかと思います。

Syfmony2系ではフィルタチェインという概念はなくなってしまいました。
代わりに処理の所々にイベントが定義されていて、リスナーを登録しておくと自動的にディスパッチしてくれるようなイベントドリブン方式に変わりました。

今回はSymfony2のHttpKernel機構に標準で設定されているkernel.requestイベントとkernel.responseイベントのリスナークラスとしてMobileEncodingListenerを作り、入出力のエンコード処理を行なっています。今回はSymfonyに標準で同梱されているAcme\DemoBundleの中に作成する前提です。

MobileEncodingListenerクラスの作成

まずはイベントリスナークラスを作成します。Symfony本体のFrameworkBundleやHttpKernelコンポーネントのディレクトリ構造の慣習に従ってAcme\DemoBundleの下にEventListenerディレクトリを作成し、その下にイベントリスナークラスを作成します。以下のようなMobileEncodingListnerクラスを作成してください。まだ中身は実装しません。

php:
  1. <?php
  2.  
  3. namespace Acme\DemoBundle\EventListener;
  4.  
  5. /**
  6.  * Convert input encoding or output encoding.
  7.  * @author uechoco <uechoco at gmail.com>
  8.  *
  9.  */
  10. class MobileEncodingListener
  11. {
  12. }

kernel.responseイベント

まずは簡単なkernel.responseイベントに対するメソッドを記述します。クラスの使用宣言を追加して、MobileEncodingListenerクラスにonKernelResponse()メソッドを実装します。

php:
  1. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  2. use Symfony\Component\HttpKernel\HttpKernelInterface;

php:
  1. /**
  2.      * Convert output encoding of response.
  3.      * @param FilterResponseEvent $event
  4.      */
  5.     public function onKernelResponse(FilterResponseEvent $event)
  6.     {
  7.         if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
  8.             return;
  9.         }
  10.  
  11.         $response = $event->getResponse();
  12.  
  13.         $response->setContent(mb_convert_encoding($response->getContent(), 'SJIS-win', 'UTF-8'));
  14.     }

中身の処理としては単純で、Resopnseオブジェクトを取得し、その中のコンテンツの文字コードを変換してまたセットしなおしているだけです。今回は説明の簡略化のために文字コードの部分を直書きしています。最初の行のマスターリクエスト以外なら何もしないという条件文がありますが、HttpKernelではリクエストの種別が2種類あり、マスターリクエストとサブリクエストと呼ばれています。そのマスターリクエストの時だけ処理したいので条件式を記述しています。FilterResponseEventクラスを受け取るというのはkernel.responseイベントとの仕様として決められています。

kernel.requestイベント

次にkernel.requestイベントに対するメソッドを記述します。先ほどと同様にクラスの使用宣言を追加して、MobileEncodingListenerクラスにonKernelRequest()メソッドを実装します。

php:
  1. use Symfony\Component\HttpKernel\Event\GetResponseEvent;

php:
  1. /**
  2.      * Convert input encoding of request.
  3.      * @param GetResponseEvent $event
  4.      */
  5.     public function onKernelRequest(GetResponseEvent $event)
  6.     {
  7.         if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType()) {
  8.             return;
  9.         }
  10.  
  11.         $request = $event->getRequest();
  12.  
  13.         // GET
  14.         $get = $request->query->all();
  15.         mb_convert_variables('UTF-8', 'SJIS-win', $get);
  16.         $request->query->replace($get);
  17.         // POST
  18.         $post = $request->request->all();
  19.         mb_convert_variables('UTF-8', 'SJIS-win', $post);
  20.         $request->request->replace($post);
  21.     }

こちらもマスターリクエストのみ処理する記述が最初にあります。次にRequestオブジェクトを取得し、今回は$_GETと$_POSTに相当する変数だけを文字コード変換しました。$_GETと$POSTはRequestオブジェクトの$queryと$requestというパブリック変数に代入されています。形式としてはParameterBagというクラスでラッピングされて代入されています。ParameterBagクラスのインターフェースとしてall()メソッドで全配列を取得し、replace()メソッドで全配列を総取替しています。

イベントリスナーとして登録する

最後に、先ほど作ったクラスとメソッドをイベントリスナーとして登録します。登録手順はDIコンテナにサービスとして登録するのと同じですが、特別なタグを定義することでイベントリスナーとして認識されるようになっています。src/Acme/DemoBundle/Resources/config/services.xmlを開き、以下のように追記してください。

XML:
  1. <!-- 省略 -->
  2.  
  3.     <parameters>
  4.         <parameter key="mobile_encoding_listener.class">Acme\DemoBundle\EventListener\MobileEncodingListener</parameter>
  5.     </parameters>
  6.  
  7.     <services>
  8.         <!-- 省略 -->
  9.         <service id="acme.demo.mobile_encoding_listener" class="%mobile_encoding_listener.class%">
  10.             <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" />
  11.             <tag name="kernel.event_listener" event="kernel.response" method="onKernelResponse" />
  12.         </service>
  13.     </services>
  14.  
  15.     <!-- 省略 -->

確認する

何事もなければデモ画面が正常に動作すると思います。プロファイラのEvent項を見てみると、リスナーが登録されていることが確認できます。

今回直書きだった文字コードの指定は、config.ymlなどの設定ファイルから取ってくるような仕様にしたり、UserAgentを判別して決定するような仕様にしたほうが汎用性が高いでしょう。

余談

今回の記事の参考にするために他のイベントリスナークラスを見ていましたが、イベントリスナークラスの実装は様々なパターンが存在しているようです。例えば1つのリスナークラスに2つ以上のイベントメソッドをもたせているものや、1クラス1イベントメソッドのもの、他の役割のあるクラスにイベントメソッドを持たせてリスナークラスを兼任させているものなどです。

SymfonyのHttpKernelにどのようなイベントがあるか知りたい方は、Symfonyの内部構造のドキュメントの一節にイベントについて書かれている部分がありますので、そちらを参照してください。

最後に

7日目はMongoDB JPにも所属している@madapajaさんです。よろしくお願いします。


[php]homebrewでintlライブラリが有効なphpをコンパイルする

Posted under php by uechoco on 日曜日 4 12月 2011 at 14 : 42 : 24

Symfony2などを使用する場合、php 5.3のintlという国際化用拡張モジュールがインストールされていないと警告が出たり一部の機能が使用することができません。

私のMacBook Airに標準で入っているphpは5.3.6ですが、intlライブラリは含まれていません。

そこで、今回はMac OSX 10.7 Lionのhomebrewでintlライブラリが有効なphpをコンパイルし、加えてSymfony2のcheck.phpと呼ばれる環境チェックスクリプトで警告が出ないようにしてみます。私のphpは標準のものに対してライブラリを加えているため、皆さんよりも追加でインストールする項目が少ないかもしれません。

intlオプションが有効なphp formula

phpは標準でインストールされているため、homebrewのformulaは有りません。そこで、非公式に作られているformulaを使用します。
ココらへんの手順はいくつかの記事を参考にしました。

Bash:
  1. brew install https://github.com/adamv/homebrew-alt/raw/master/duplicates/php.rb --with-mysql --with-intl

このとき、使用可能なオプションはoptionsコマンドで見ることができます。

TEXT:
  1. brew options https://github.com/adamv/homebrew-alt/raw/master/duplicates/php.rb
  2. php
  3. --with-mysql
  4.     Include MySQL support
  5. --with-mariadb
  6.     Include MariaDB support
  7. --with-pgsql
  8.     Include PostgreSQL support
  9. --with-mssql
  10.     Include MSSQL-DB support
  11. --with-fpm
  12.     Enable building of the fpm SAPI executable (implies --without-apache)
  13. --without-apache
  14.     Build without shared Apache 2.0 Handler module
  15. --with-intl
  16.     Include internationalization support
  17. --without-readline
  18.     Build without readline support
  19. --with-gmp
  20.     Include GMP support

依存関係のあるlibxml2, mcrypt, icu4cなどもコンパイルされたあと、php本体もコンパイルされます。少し時間がかかるので、気長に待ちましょう.。

apacheの設定

phpのコンパイルが終了すると、以下のようなメッセージが出てきます。

TEXT:
  1. For 10.5 and Apache:
  2.     Apache needs to run in 32-bit mode. You can either force Apache to start
  3.     in 32-bit mode or you can thin the Apache executable.
  4.  
  5. To enable PHP in Apache add the following to httpd.conf and restart Apache:
  6.     LoadModule php5_module    /usr/local/Cellar/php/5.3.8/libexec/apache2/libphp5.so
  7.  
  8. The php.ini file can be found in:
  9.     /usr/local/etc/php.ini
  10.  
  11. 'Fix' the default PEAR permissions and config:
  12.     chmod -R ug+w /usr/local/Cellar/php/5.3.8/lib/php
  13.     pear config-set php_ini /usr/local/etc/php.ini

例えば、Webサーバーがapache であれば「LoadModule php5_module /usr/local/Cellar/php/5.3.8/libexec/apache2/libphp5.so」を/etc/apache2/httpd.confに追加しまししょう。(元々入っているのphp5_moduleの行があるので、そちらは先頭に「#」をつけてコメントアウトしておきましょう。)

また新しいphpのiniファイルは「/usr/local/etc/php.ini」にありますので標準の場所と異なるのを気をつけましょう。

PEARライブラリののパーミッションも直しておくと便利です。「chmod -R ug+w /usr/local/Cellar/php/5.3.8/lib/php」というコマンドはすぐに通るかも知れませんが、「pear config-set php_ini /usr/local/etc/php.ini」のときに「/User/hogehoge/.pearrc」が作れないといったエラーがあった場合は、touchコマンドなどで事前に作成してあげて、パーミッションを777にでもしておいてください。

この時点で「php --version」としても、まだ元々のphpコマンドの方を参照しているでしょう。「which php」とすると「/usr/bin/php」を参照しているためです。コマンドラインが読み込まれた段階でbrew側のコマンド群を優先的に読みこむようにしましょう。ここではシェルがbashの想定で設定ファイルを書きます。

Bash:
  1. vi ~/.bash_profile

としてこの1行を追加しましょう。

TEXT:
  1. export PATH="$(brew --prefix)/bin:$PATH"

最後に、bashの設定を反映させます。

Bash:
  1. source ~/.bash_profile

この時点でphp --versionすると、新しいほうのphpが参照されているでしょう。

TEXT:
  1. PHP 5.3.8 (cli) (built: Dec  4 2011 13:40:01)
  2. Copyright (c) 1997-2011 The PHP Group
  3. Zend Engine v2.3.0, Copyright (c) 1998-2011 Zend Technologies

timezoneの設定

新しいphp.iniが作成されたので、最低限の設定としてtimezoneの設定をしておかないと、いずれ警告が出てしまいます。

Bash:
  1. vi /usr/local/etc/php.ini

diff形式でいうと、以下のように変更してください。

TEXT:
  1. -;date.timezone =
  2. +date.timezone = "Asia/Tokyo"

APCのインストール

この時点でintl込のphpが動くのですが、最後にSymfony2用にAPCライブラリもコンパイルして用意しましょう。

Bash:
  1. brew install apc

と打つだけです。

インストール後、以下のようなメッセージが表示されます。

TEXT:
  1. To finish installing APC:
  2.  * Add the following lines to php.ini:
  3.     [apc]
  4.     extension="/usr/local/Cellar/apc/3.1.9/apc.so"
  5.     apc.enabled=1
  6.     apc.shm_segments=1
  7.     apc.shm_size=64M
  8.     apc.ttl=7200
  9.     apc.user_ttl=7200
  10.     apc.num_files_hint=1024
  11.     apc.mmap_file_mask=/tmp/apc.XXXXXX
  12.     apc.enable_cli=1
  13.  * Restart your webserver
  14.  * Copy "/usr/local/Cellar/apc/3.1.9/apc.php" to any site to see APC's usage.

書いてあるとおりに、「/usr/local/etc/php.ini」にapcの設定を追加し、webサーバーを再起動します。最後のスクリプトのコピーは、APCの便利スクリプトなので、今はいりません。

Symfony2のapp/check.phpを見る

Symfony2のapp/check.phpを使って、環境が整っているかチェックしてみましょう。(その前にSymfony2の本体をDLしておいてください。)

Symfony2のルートディレクトリに移動し、以下のコマンドでapp/check.phpを実行します。

Bash:
  1. php app/check.php

TEXT:
  1. ********************************
  2. *                              *
  3. *  Symfony requirements check  *
  4. *                              *
  5. ********************************
  6.  
  7. php.ini used by PHP: /usr/local/etc/php.ini
  8.  
  9. ** WARNING **
  10. *  The PHP CLI can use a different php.ini file
  11. *  than the one used with your web server.
  12. *  If this is the case, please ALSO launch this
  13. *  utility from your web server.
  14. ** WARNING **
  15.  
  16. ** Mandatory requirements **
  17.  
  18.   OK        Checking that PHP version is at least 5.3.2 (5.3.8 installed)
  19.   OK        Checking that the "date.timezone" setting is set
  20.   OK        Checking that app/cache/ directory is writable
  21.   OK        Checking that the app/logs/ directory is writable
  22.   OK        Checking that the json_encode() is available
  23.   OK        Checking that the SQLite3 or PDO_SQLite extension is available
  24.   OK        Checking that the session_start() is available
  25.   OK        Checking that the ctype_alpha() is available
  26.   OK        Checking that the token_get_all() is available
  27.   OK        Checking that the APC version is at least 3.0.17
  28.  
  29. ** Optional checks **
  30.  
  31.   OK        Checking that the PHP-XML module is installed
  32.   OK        Checking that the token_get_all() function is available
  33.   OK        Checking that the mb_strlen() function is available
  34.   OK        Checking that the iconv() function is available
  35.   OK        Checking that the utf8_decode() is available
  36.   OK        Checking that the posix_isatty() is available
  37.   OK        Checking that the intl extension is available
  38.   OK        Checking that the intl ICU version is at least 4+
  39.   OK        Checking that a PHP accelerator is installed
  40.   OK        Checking that php.ini has short_open_tag set to off
  41.   OK        Checking that php.ini has magic_quotes_gpc set to off
  42.   OK        Checking that php.ini has register_globals set to off
  43.   OK        Checking that php.ini has session.auto_start set to off
  44.  
  45. ** Optional checks (Doctrine) **
  46.  
  47.   OK        Checking that PDO is installed
  48.   OK        Checking that PDO has some drivers installed: mysql, sqlite, sqlite2

基本的な警告はなくなりました。これでSymfony2を楽しむ環境が整いましたね!


[php]TDDBC Tokyo 1.7 for phpに参加してきた

Posted under php by uechoco on 月曜日 22 8月 2011 at 00 : 27 : 28

TDDBC Tokyo 1.7 for phpに参加してきました。会場は株式会社タイレルシステムズさんです。会場提供ありがとうございます。うさぎのぬいぐるみが可愛いですw→株式会社タイレルシステムズの情報だよ! | ロケタッチ

TDDBC会話には全くかかわりがなく、そもそもTDDもテストも未経験だったわけなのですが(テスト自体の意味は分かっている)、今回はSymfonyユーザー会繋がりの西川さんが主催し、西川さんの元同僚のにしごうりさんが共催し、TDDBC本家の@t_wadaさんが講演に来て、といったところで、行くしか無いと思っていました。Symfonyユーザー会の活動を通じてテストの重要性をひしひしと感じていたのでいい機会でした。

TDDの短期集中訓練(BootCamp)という位置付けて、TDDとは、TDDの本質などを聞き、ペアプログラミングの実践を行いました。複数の組が同じ課題をペアプログラミングするというのはこういう場でしか味わえない試みなのですが、ペアプロ後に何人か代表で実装手順を発表したのですが、みんなアプローチの仕方や実装の考え方が違っていて面白いなっと思いました。

ペアプロをしてみた感想としては、単純なtypoはすぐに見つけてもらえる、お互いに確認しあって進めていくので書いたコードに自信が出るなどを感じました。他の人が言っていた感想として、自分の中にあったもやもやとした設計を口を通して相手に伝えることで明確になっていくというのもありました。

TDDBCとしては言語を縛った勉強会は初めての試みだそうで、いろいろやり方を模索中らしいのですが、個人的には使い慣れたphp言語だけで話が完結しているので、テスト初心者でもphpというだけで参加しやすかったです。他の言語の人とかがいたらそれはそれで面白いかとは思ったのですが、参加しづらかっただろうなとは思います(個人的に)。

実際にTDDを体験してみて、じゃぁもう明日から業務で使えるかといったらそうではないです。入門と実践は違います。ですが@t_wadaさんの講演の最後に、応用編として現実と戦うためのリファクタリング方法を学べる書籍を紹介してもらえました。まだまだ会社にはすぐに導入できないだろうとは思っていますが、個人レベルで試行錯誤してTDDやテスト手法、CI環境などの整備方法を学んで、ノウハウがたまってきたら会社に還元して既存あるいは新規案件にテストドリブンを導入していけたらと思っています。

次はもっとコンテキストをしぼって、CakePHPやSymfony2でのTDDなどが話し合える場があるとニッチに盛り上がりそうですね!


[Symfony2]ブログチュートリアル カスタマイズ編 はじめました

Posted under Symfony2 by uechoco on 月曜日 13 6月 2011 at 13 : 38 : 11


昨日より、Symfony2 ブログチュートリアルのカスタマイズ編の執筆を開始しました

ブログチュートリアルで作ったものにちょっとした修正を加えて、もうちょっとSymfony2の機能を知ってもらおうというセクションです。

現時点で2つのカスタマイズトピックを掲載しています。これから少しずつ執筆していきます。みなさんからのフィードバックをお待ちしています。


次ページへ »

Copyright © 2012 うえちょこ@ぼろぐ. WP Theme created by Web Top.