[Silex]続・Silex初心者が遭遇する最初のエラー

Posted under Silex by uechoco on 土曜日 14 5月 2011 at 22 : 34 : 43

先日、[Silex]Silex初心者が遭遇する最初のエラーという記事を書きましたが、もう1つ、初心者が遭遇しそうなエラーに遭遇しましたので、書き残しておきます。

今度のエラーは、何もエラーが出ません。display_errors=Onでも、error_reportingがE_ALLでも、画面にもApacheのerror_logには現れません。真っ白い画面のままなんです。

ソースコードはこんな感じです。

php:
  1. <?php
  2. //ini_set('display_errors', 'On');
  3. //error_reporting(E_ALL);
  4.  
  5. require_once __DIR__.'/silex.phar';
  6. $app = new Silex\Application();
  7.  
  8. $app->get('/hello', function () use ($app) {
  9.     $name = $app['request']->get('name');
  10.     return "Hello $name";
  11. });

気づいたのは、どんなURLパスでも受け付けるようになっていること。いつもだったらルーティングのマッチングエラーになるはずですよね。ルーティングすら読み込まれてないのかな?とも思ったのですが、真っ白い画面が出るだけってことを思い出して気づきました。プログラムが実行されていないんだ

忘れていたのはこれでした。

php:
  1. $app->run();

フレームワークが実行されなければ、何も起こりませんよね。人騒がせでした。


[Silex]sliex.pharでPHP Warning: PHP Startup: apc.shm_size now uses M/G suffixes

Posted under Silex by uechoco on 金曜日 13 5月 2011 at 09 : 26 : 32

Silexのドキュメントを読み進めていくと、「silex.pharを実行すればsilexのバージョン確認やアップデートが可能」というフレーズを見つけたので早速試してみたところ、幾つかエラーが発生したので、その解決方法を記録しておきます。

Permission denied

Bash:
  1. $ ./silex.phar
  2. -bash: ./silex.phar: Permission denied

silex.pharを実行可能ファイルのように実行しようとすると起きました。
実行権限がありませんね。chmod で7xxにしましょう。(実は関係なかったんですが...↓)

No such file or directory

Bash:
  1. $ ./silex.phar
  2. ./silex.phar: line 1: ?php: No such file or directory
  3. ./silex.phar: line 3: =: command not found
  4. ./silex.phar: line 5: syntax error near unexpected token `'phar','
  5. ./silex.phar: line 5: `if (in_array('phar', stream_get_wrappers()) && class_exists('Phar', 0)) {'

実行権限を直しても、ファイルが見つからないというエラーです。
そういえば、pharはphpの独自形式なので直接シェルでは実行できないですね。
php ./silex.phar と打つ必要がありました。chmodいらなかった。

PHP Warning: PHP Startup: apc.shm_size now uses M/G suffixes

Bash:
  1. $ php ./silex.phar
  2. PHP Warning:  PHP Startup: apc.shm_size now uses M/G suffixes, please update your ini files in Unknown on line 0

表題のエラーです。環境はMac OS X 10.6 / php 5.3.4 / homebrew派です。
エラーにしっかりと書いてありますが、「現在apc.shm_sizeはM/Gの接尾辞を使います、iniファイルを更新してください」とのこと。
M/Gというのは、メガとギガの単位ですね。

/etc/php.iniを見てみると、たしかに単位が抜けていました。Silex関係なかったですね^^;

TEXT:
  1. [apc]
  2. extension="/usr/local/Cellar/apc/3.1.6/apc.so"
  3. apc.enabled=1
  4. apc.shm_segments=1
  5. apc.shm_size=64
  6. apc.ttl=7200
  7. apc.user_ttl=7200
  8. apc.num_files_hint=1024
  9. ;apc.mmap_file_mask=/tmp/apc.XXXXXX
  10. apc.enable_cli=1

apc.shm_sizeを64から64Mにして保存し、apacheに設定を反映させると、

Bash:
  1. $ php ./silex.phar
  2. Silex version ef49998 2011-05-11 18:49:27 +0200

ちゃんと出ました。

ちなみに4月中旬くらいに配布されていたsilex.pharにはこの機能はないようです。@brtriverさんのSilexを試してみた - ぷぎがぽぎという記事でSilexに興味を持ったので、Silexを使い始めましたが、@brtriverさんのgithubにあったお問い合わせフォームのサンプルコードに含まれていたsilex.pharをそのまま使い続けていたら、バージョン番号は出てきませんでした。最新版のsilex.pharに置き換えたらバージョン番号が出てきましたので、最近できた機能のようですね。


[Silex]Silex初心者が遭遇する最初のエラー

Posted under Silex by uechoco on 金曜日 13 5月 2011 at 00 : 50 : 56

Silexドキュメントの1〜2ページはIntroduction/Usageなのですが、たった数行のコードを入力しただけ(で動くはず)なのに、びくともしなくて右往左往してしまいました。display_errors=Onにしたら、こんな感じ。

Fatal error: Uncaught exception 'Symfony\Component\Routing\Matcher\Exception\NotFoundException' in phar:///path-to-webroot/silex-test/silex.phar/vendor/Symfony/Component/Routing/Matcher/UrlMatcher.php:41 Stack trace: #0 phar:///path-to-webroot/silex-test/silex.phar/src/Silex/RedirectableUrlMatcher.php(13): Symfony\Component\Routing\Matcher\UrlMatcher->match('/') #1 phar:///path-to-webroot/silex-test/silex.phar/src/Silex/Application.php(140): Silex\RedirectableUrlMatcher->match('/') #2 phar:///path-to-webroot/silex-test/silex.phar/vendor/Symfony/Component/EventDispatcher/EventDispatcher.php(84): Silex\Application->onCoreRequest(Object(Symfony\Component\HttpKernel\Event\GetResponseEvent)) #3 phar:///path-to-webroot/silex-test/silex.phar/vendor/Symfony/Component/EventDispatcher/EventDispatcher.php(16): Symfony\Component\EventDispatcher\EventDispatcher->triggerListener(Object(Silex\Application), 'onCoreRequest', Object(Symfony\Component\HttpKernel\Event\GetResponseEv in phar:///path-to-webroot/silex-test/silex.phar/src/Silex/Application.php on line 144

まぁ、よーく見ると、URLMatcher->match('/') のあとに Routing MatcherのNotFoundExceptionが走っているので、マッチするルーティングルールがないと。なるほどね。たしかにURL見たら / だし、そのURLのルーティングルールは書いてないね。 /hello/Fabien と書かないと動かないわけか。

Twitterでつぶやいたら、@brtriverさん@gilbiteさんから「あるあるw」と返ってきたので、勝手に「Silex初心者が遭遇する最初のエラー」と命名しますw

P.S. どのコードのことを言っているのか分かりにくかったので、ソースコード載せておきます。

php:
  1. <?php
  2. require_once __DIR__.'/silex.phar';
  3.  
  4. $app = new Silex\Application();
  5.  
  6. $app->get('/hello/{name}', function ($name) {
  7.     return "Hello $name";
  8. });
  9.  
  10. $app->run();


[PEAR]HTML_CSS_MobileでUndefined index

Posted under php by uechoco on 木曜日 10 2月 2011 at 12 : 08 : 41

PC/mobile両対応のサイトを作ることになったので、初めてPEAR::HTML_CSS_Mobileを使わせていただきました。すばらしいライブラリを作ってくださった@yudoufuさんに感謝です。

さて、使い方は、ドコモだったら出力バッファ文字列に対してapply()するという単純なものなのですが、こんなエラーが発生しました。

TEXT:
  1. Notice (8): Undefined index:  h1, h2, h3, h4, h5, h6 [CORE/vendors/PEAR-1.9.0/HTML/CSS.php, line 2023]

ちなみにエラー部分で解析しようとしていたCSSはこんな感じです。いわゆるリセット用CSSの一部です。

TEXT:
  1. h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}

最初は複数指定が読み取れないのかと思ったのですが、そんなことも出来なければライブラリとして残念すぎるので、悩みつつ、とりあえずカンマが詰まりすぎていたのでスペースを入れました

TEXT:
  1. h1, h2, h3, h4, h5, h6{font-size:100%;font-weight:normal;}

・・・エラーがなくなりました。CSSの構文として間違っていたのでしょうか?とりあえず、まぁ、よしとするか。ちなみに、関連すると思われるバグチケットも発見しました

Bug #16544 :: HTML_CSS undefined index on malformed input

試した環境はphp5.1.6、PEAR 1.9.0、HTML_CSS 1.5.4(のはず)、HTML_CSS_Mobile 1.8.0です。


[CakePHP]read-onlyなモデルを作る

Posted under CakePHP by uechoco on 水曜日 2 2月 2011 at 16 : 26 : 33

アプリを作っていると、複数のDBを使い分けたり、master-slave構成だったりすることは良くありますよね。そういったDB構成の場合、心配なのはread-onlyなテーブルに間違って更新をかけてしまわないかということです。

そこで、とっても簡易ですが、更新してしまわないようにする予防策をしておきます。read-onlyなモデルは、下記AppReadOnlyModelを継承するだけで安心できます(更新系処理のコールバック関数って以下の関数くらいでいいんですよね?)。CakePHP 1.3.7で試しています。

php:
  1. class AppReadOnlyModel extends AppModel
  2. {
  3.     function _read_only_error()
  4.     {
  5.         trigger_error(sprintf('Cannot execute write query to <b>%s:%s</b>.', $this->useDbConfig, $this->name), E_USER_WARNING);
  6.     }
  7.    
  8.     /**
  9.      * save (WRITE系クエリを無効化する)
  10.      *
  11.      * @access public
  12.      */
  13.     final function save()
  14.     {
  15.         $this->_read_only_error();
  16.         return false;
  17.     }
  18.    
  19.     /**
  20.      * saveAll (WRITE系クエリを無効化する)
  21.      *
  22.      * @access public
  23.      */
  24.     final function saveAll()
  25.     {
  26.         $this->_read_only_error();
  27.         return false;
  28.     }
  29.    
  30.     /**
  31.      * saveField (WRITE系クエリを無効化する)
  32.      *
  33.      * @access public
  34.      */
  35.     final function saveField()
  36.     {
  37.         $this->_read_only_error();
  38.         return false;
  39.     }
  40.    
  41.     /**
  42.      * updateAll (WRITE系クエリを無効化する)
  43.      *
  44.      * @access public
  45.      */
  46.     final function updateAll()
  47.     {
  48.         $this->_read_only_error();
  49.         return false;
  50.     }
  51.    
  52.     /**
  53.      * delete (WRITE系クエリを無効化する)
  54.      *
  55.      * @access public
  56.      */
  57.     final function delete()
  58.     {
  59.         $this->_read_only_error();
  60.         return false;
  61.     }
  62.    
  63.     /**
  64.      * deleteAll (WRITE系クエリを無効化する)
  65.      *
  66.      * @access public
  67.      */
  68.     final function deleteAll()
  69.     {
  70.         $this->_read_only_error();
  71.         return false;
  72.     }
  73. }

php4系ならばfinalキーワードを外してください。


« 前ページへ次ページへ »

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