Home > Tags > PHP

PHP

文字化けが発生しないか調べる時に入力する文字達

symfony × MySQL × Shift_JIS: 0×5c関連
symfonyで作成したテスト用アプリケーションで「ソ」一文字を登録。

PHPで名前を扱う場合、文字コード指定に注意が必要 – Affirmative Way
たつさき – Google 検索
髙(はしごたか), 﨑(たつさき)

symfonyでモバイル開発する際に参考になるだろうリンク

モバイル開発@symfony :: handsOut.jp がかなり良い感じ。以下コードを引用してみる。

apps/app_name/config/filters.yml

rendering: ~
web_debug: ~
security: ~
# generally, you will want to insert your own filters here
mobile:
  class: myMobileFilter
cache: ~
common: ~
flash: ~
execution:  

apps/app_name/config/autoload.yml

autoload:
  PEAR:
    name: PEAR
    files:
      Net_UserAgent_Mobile: /path/to/Net/UserAgent/Mobile.php

myMobileFilter.class.php (抜粋)

public function execute($filterChain) {
  // preFilter
  $request = $this­->getContext()­->getRequest();
  $response = $this­->getContext()­->getResponse();
  if ($this­->isFirstCall()) {
    $agent = @Net_UserAgent_Mobile::singleton();
    switch (true) {
      case $agent­->isDoCoMo():
        $carrier = 'docomo';
        $response­->setContentType('application/xhtml+xml; charset=Shift_JIS'); // 出力ヘッダを指定
        $response->addStylesheet('/path/to/docomo.css')// キャリア別のスタイルシートを指定
        break;
      case $agent­->isEzweb():
        $carrier = 'ezweb';
        $response->addStylesheet('/path/to/ezweb.css')// キャリア別のスタイルシートを指定
        // 中略
    }
    $request­->setAttribute('agent', $agent);
    $request­->setAttribute('carrier', $carrier);
    // sfPictogramMobilePlugin
    $pictogram = sfPictogramMobile::factory($carrier, 'utf­8');
    $request­->setAttribute('pictogram', $pictogram);
  }
 
  $filterChain-­>execute();
 
  // postFilter
  $content = $response­->getContent();
  $content = $request­->getAttribute('pictogram')­->replace($content);
  // 出力前に CSS をインライン展開
  if ($request­->getAttribute('carrier') == 'docomo') {
    $content = HTML_CSS_Mobile::getInstance()­->setBaseDir('/path/to/doc_root')­->apply($content);
  }
  $response­->setContent($content);
}

apps/app_name/templates/layout.php (抜粋)

<? include_partial('global/dtd'); ?>
<html xmlns="http://www.w3.org/1999 /xhtml" xml:lang="ja" lang="ja">
<head>

apps/app_name/templates/_dtd.php

<?php switch (sfContext::getInstance()­>getRequest()­>getAttribute('carrier')): ?>
<?php case 'docomo': ?><?php echo '<'; ?>?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE html PUBLIC "­//i­mode group (ja)//DTD XHTML i­XHTML(Locale/Ver.=ja/1.1) 1.0//EN" "i­xhtml_4ja_10.dtd">
<?php break; ?>
<?php case 'ezweb': ?>
<?php echo '<'; ?>?xml version="1.0" encoding="Shift_JIS" ?>
<!DOCTYPE html PUBLIC "­//OPENWAVE//DTD XHTML 1.0//EN" "http://www.openwave.com/DTD/xhtml­basic.dtd">
// 以下略

他にも helper を使って、mailto や input 要素の問題などを吸収する方法や、モバイルのセッションを、SessionStorage を使って解決する方法が書いてある。

以下のファイルを作成、編集
apps/app_name/lib/helper/MobileHelper.php
apps/app_name/lib/myMobileFrontController.class.php
apps/app_name/lib/myMobileSessionStorage.class.php
apps/app_name/config/factories.yml

memokami::楽天テクノロジーカンファレンス「PHPで作る携帯サイト」 :: handsOut.jp もすごくいい感じ。

symfony1.2でバッチ処理を作るにはどうすればいいの?

symfony1.2 では generate:task コマンドが用意されているのでそれを利用します。

  1. まず、ジェネレートコマンドでひな形を作る
  2. ジェネレートコマンドを実行すると、

    % ./symfony generate:task foo:sample

    fooSampleTask.class.php というファイルが作成される

    // lib/task/fooSampleTask.class.php
    <?php

    class fooSampleTask extends sfBaseTask
    {
      protected function configure()
      {
        // // add your own arguments here
        // $this->addArguments(array(
        //   new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
        // ));

        $this->addOptions(array(
          new sfCommandOption('application', null, sfCommandOption::PARAMETER_REQUIRED, 'The application name'),
          new sfCommandOption('env', null, sfCommandOption::PARAMETER_REQUIRED, 'The environment', 'dev'),
          new sfCommandOption('connection', null, sfCommandOption::PARAMETER_REQUIRED, 'The connection name', 'propel'),
          // add your own options here
        ));

        $this->namespace        = 'foo';
        $this->name             = 'sample';
        $this->briefDescription = '';
        $this->detailedDescription = <<<EOF
    The [foo:sample|INFO] task does things.
    Call it with:

      [php symfony foo:sample|INFO]
    EOF;
      }

      protected function execute($arguments = array(), $options = array())
      {
        // initialize the database connection
        $databaseManager = new sfDatabaseManager($this->configuration);
        $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();

        // add your code here
      }
    }

  3. execute 関数をカスタマイズする
  4. 『add your code here』の下に実際の処理を記述していきます。

    protected function execute($arguments = array(), $options = array())
      {
        // initialize the database connection
        $databaseManager = new sfDatabaseManager($this->configuration);
        $connection = $databaseManager->getDatabase($options['connection'] ? $options['connection'] : null)->getConnection();
       
        // DB アクセスも普通に使える
        $obj = BookPeer::retrieveByPK(3);
        var_dump($obj);
       
        // ログも便利
        $this->log('処理終了');
      }

  5. バッチ処理を実行する
  6. % ./symfony foo:sample

  7. 引数を使いたいとき
  8. protected function configure()
      {
        // // add your own arguments here
        $this->addArguments(array(
          new sfCommandArgument('my_arg', sfCommandArgument::REQUIRED, 'My argument'),
        ));

    configure 関数の先頭のコメントを外すと my_arg 引数が有効になり、execute 関数の引数 $arguments['my_arg'] で利用できるようになります。

    % ./symfony foo:sample aaa
    // print_r($arguments);
    Array
    (
        [task] => foo:sample
        [my_arg] => aaa
    )

  9. 他にも
  10. symfony/task/project とか
    symfony/task/generator とか

    symfony のライブラリー内のタスクにサンプルになりそうなファイルがあるので参考にしてください。

    参考
    第16章 - アプリケーションの運用ツール

symfony のデプロイ方法をためしてみる – jobeet23日目

本番アップはいつも FTP でやっているのですが、capistrano とかある程度ツールを使って自動化したいなと前から思っていました。今ちょうど symfony をやっているので symfony のデプロイ方法を試してみました。

  1. 本番環境チェック
  2. 実行すると、OK とか Warinig とか表示されるので必要に応じて対応します。APC のインストールとか。これは便利。

    wget http://trac.symfony-project.org/browser/branches/1.2/data/bin/check_configuration.php?format=raw check_configuration.php
    php check_configuration.php

  3. コアライブラリへのパスを本番に合わせる
  4. // config/ProjectConfiguration.class.php
    require_once dirname(__FILE__).'/../lib/vendor/symfony/lib/autoload/sfCoreAutoload.class.php';

  5. データベースを本番の設定に
  6. $ php symfony configure:database "mysql:host=localhost;dbname=prod_dbname" prod_user prod_pass

  7. シンボリックリンクなどがあれば固定化する
  8. $ php symfony plugin:publish-assets

  9. エラーページを設定する
  10. プロジェクトの転送
  11. 本番環境の情報を設定する

    # config/properties.ini
    [production]
      host=www.symfony-project.com
      port=22
      user=jobeet
      dir=/var/www/jobeet/
      type=rsync
      pass=

    転送したくないファイルがあれば設定する

    # config/rsync_exclude.txt
    .svn
    /web/uploads/*
    /cache/*
    /log/*
    /web/*_dev.php

    プレビュー

    $ php symfony project:deploy production

    実際に転送する。rsync が実行される

    $ php symfony project:deploy production --go

  12. 終了。あとこの方法だとサーバ上の不要になったファイルを削除してくれないのでそこは考える必要あり。

やっぱり rsync は楽ですね、どのファイルをアップするかとか考えなくてよくて、コマンド一発でデプロイが完了します。注意しないといけないのが設定ファイルを開発用のまま転送すると本番環境が動かなくなることです。この問題も本番反映用のシェルファイルを作れば解決しそうです。

参考
symfony | Web PHP Framework | The Jobeet Tutorial | Day 23: The Deployment
第16章 - アプリケーションの運用ツール
秋元@ずっと雪 » Windows+symfony1.1でproject:deployを動かすためのパッチ

phpフレームワークsymfonyをdreamhostへインストールする方法

dreamhost へ symfony をインストールしようと試みました。

  1. symfony をインストール
  2. symfony 本家から tar.gz のアーカイブを wget で取得して解凍します。

    % cd ~
    % mkdir -p symfony/vendor
    % cd symfony/vendor
    % wget http://www.symfony-project.org/get/symfony-1.2.2.tgz
    % tar zxvf symfony-1.2.2.tgz

  3. symfony のバージョンを確認(エラーが発生)
  4. % cd ~/symfony/
    % vendor/symfony-1.2.2/data/bin/symfony -V
    Parse error: syntax error, unexpected T_OBJECT_OPERATOR in

  5. エラーの原因を調査する
  6. dreamhost の wiki を検索すると、symfony についてのページがあるので参考にする。(dreamhost で困ったらとりあえず wiki で検索する。)
    原因はパスの設定のようなので対応

    % export PATH=/usr/local/php5/bin:${PATH}

    これで正常に動く

    % vendor/symfony-1.2.2/data/bin/symfony -V
    symfony version 1.2.2

複数バージョンの php の共存

# ll /path/to/httpd-2.2.6/module
libphp5.so
libphp5.so.with-pdo
libphp5.so.without-pdo

みたいにして、libphp5.so を手動で切り替えて apache 再起動すると pdo なしとありで切り替わる。

と思ったけどなんか切り替わらないこともある。。

symfony Call to undefined function mysql_escape_string

symfony1.1 で symfony propel-build-sql を実行すると以下のエラーが発生。

symfony Call to undefined function mysql_escape_string

php mysql を pdo なしでインストールすると直った。

symfony 1.1 + sfGuardPlugin で You must specify a “moduleName” エラー

sfGuardPlugin をインストールして、security.yml をオンにするとパースエラーが発生する。

Notice: Undefined offset: 1 in /Users/xxx/svn/symfony/vendor/pear/php/symfony/config/sfGeneratorConfigHandler.class.php on line 68
Notice: Undefined offset: 1 in /Users/xxx/svn/symfony/vendor/pear/php/symfony/config/sfGeneratorConfigHandler.class.php on line 69

[sfParseException]
You must specify a "moduleName".

#1561 - symfony - Trac
には対応したのでまた別のバグの問題。

仕方がないので symfony をデバッグすると原因を発見!!

# touch plugins/sfGuardPlugin/modules/sfGuardAuth/config/generator.yml

上記のように sfGuardAuth の config ディレクトリに空の generator.yml を作ると動くようになった。
本当は他の直し方がある気もするけど、とりあえず今はこれで解決。

こんな現象、日本・海外探しても何の情報もなかった。なぜおれだけ。。。

symfony 1.1 の my first symfony project でバグ

My first symfony projectの generator.yml を使って管理画面を生成しようとするところで以下のようなエラーが発生する。

Notice: Undefined offset: 1 in /Users/xxx/svn/symfony/vendor/pear/php/symfony/config/sfGeneratorConfigHandler.class.php on line 69

[sfParseException]
You must specify a "moduleName".

調べると symfony のバグだった。

#1561 (defect: AdminGenerator sfGeneratorConfigHandler.class.php can't find module name) - symfony - Trac

以下のように対応。

Index: vendor/pear/php/symfony/config/sfGeneratorConfigHandler.class.php
===================================================================
--- vendor/pear/php/symfony/config/sfGeneratorConfigHandler.class.php   (リビジョン 76)
+++ vendor/pear/php/symfony/config/sfGeneratorConfigHandler.class.php   (作業コピー)
@@ -65,7 +65,7 @@
     $generatorParam = (isset($config['param']) ? $config['param'] : array());
 
     // hack to find the module name (look for the last /modules/ in path)
-    preg_match('#.*/modules/([^/]+)/#', $configFiles[0], $match);
+    preg_match('#.*/modules/([^/]+)/#', $configFiles[1], $match);
     $generatorParam['moduleName'] = $match[1];

はじめての symfony

symfonyのインストール手順 : tech.kayac.com - KAYAC engineers' blogを見てはじめての symfony をセットアップ。

Subversion設定の標準化に合わせて、subversion の conf ファイルを修正。

php のコンパイルオプションは以下を参照。xsl と zlib が必要。
symfony - PukiWiki

※xsl がないと symfony propel:build-model などのコマンドが失敗する
※zlib がないと plugin をインストールする際に tgz が展開できない

ホーム > タグ > PHP

ぴくちゃー
ブログパーツ

ページの上部に戻る