アーカイブ

‘php’ カテゴリーのアーカイブ

Services_Twitter::sendOAuthRequest

2010 年 7 月 14 日 コメントはありません

Services_Twitter::sendOAuthRequestではHTTP_Request2_Exceptionをcatchしていますが、実際はHTTP_OAuth_Exceptionをcatchしなきゃいけない。

Services_Twitterはベーシック認証周りは大丈夫だと思いますが、OAuth周りはまともにテストされてないので、結構バグあります。

カテゴリー: php タグ: ,

あとで書くよ

2010 年 7 月 5 日 コメントはありません

services_twitterのprepareRequestメソッド

続きを読む…

カテゴリー: php タグ:

PEAR::Services_Twitterのリスト対応

2010 年 4 月 14 日 コメントはありません

パッチ
services_twitter.diff
13828 byte
[md5] cfbc090a25f68b8f0ea52a281aeccbe7
パッチ(テスト部分)
services_twitter_test.diff
119284 byte
[md5] e238637ffc8953b2e6bb5249b20e8c48
一括
Services_Twitter.tar.gz
59834 byte
[md5]145d9e35e4000e7700e228f1f59a4e6a
追加メソッド一覧

Methods                 Documentatation name        tests
----------------------- --------------------------- ---------------------------------------
trends/available                                    840-trends-available.phpt
trends/location                                     850-trends-location.phpt
lists/create            POST lists      (create)    153-lists-create-delete.phpt
lists/update            POST lists id  (update)     151-lists-update.phpt
lists/list              GET lists        (index)    150-lists-list.phpt
lists/show              GET list id      (show)     152-lists-show.phpt
lists/delete            DELETE list id (destroy)    153-lists-create-delete.phpt
lists/statuses          GET list statuses           160-lists-statuses.phpt
lists/memberships       GET list memberships        161-lists-memberships.phpt
lists/subscriptions     GET list subscriptions      162-lists-subscriptions.phpt

list_members/list       GET list members            181-list_members-list.phpt
list_members/create     POST list members           180-list_members-create-delete.phpt
list_members/delete     DELETE list members         180-list_members-create-delete.phpt
list_members/show       GET list members id         182-list_members-show.phpt

list_subscribers/list   GET list subscribers        191-list_subscribers-list.phpt
list_subscribers/create POST list subscribers       190-list_subscribers-create-delete.phpt
list_subscribers/delete DELETE list subscribers     190-list_subscribers-create-delete.phpt
list_subscribers/show   GET list subscribers id     192-list_subscribers-show.phpt


パッチは現段階での最新である295629に当ててください。

$ svn export -r 295629 http://svn.php.net/repository/pear/packages/Services_Twitter/trunk Services_Twitter
$ wget http://blog.cheki.net/services_twitter.diff
$ cd Services_Twitter
$ patch -p0 < ../services_twitter.diff
patching file Services/Twitter.php
patching file data/api.xml
patching file data/api.rng

テスト部へのパッチが必要な場合は別途

$ patch -p0 < ../services_twitter_test.diff
patching file tests/181-list_members-list.phpt
patching file tests/192-list_subscribers-show.phpt
patching file tests/tests-config.php.example
patching file tests/151-lists-update.phpt
patching file tests/data/list_subscribers/list.dat
patching file tests/data/list_subscribers/show.dat
patching file tests/data/list_subscribers/delete.dat
patching file tests/data/list_subscribers/create.dat
patching file tests/data/list_members/list.dat
patching file tests/data/list_members/show.dat
patching file tests/data/list_members/delete.dat
patching file tests/data/list_members/create.dat
patching file tests/data/lists/statuses.dat
patching file tests/data/lists/list.dat
patching file tests/data/lists/memberships.dat
patching file tests/data/lists/show.dat
patching file tests/data/lists/update.dat
patching file tests/data/lists/delete.dat
patching file tests/data/lists/create.dat
patching file tests/data/lists/subscriptions.dat
patching file tests/data/trends/location.dat
patching file tests/data/trends/available.dat
patching file tests/191-list_subscribers-list.phpt
patching file tests/153-lists-create-delete.phpt
patching file tests/162-lists-subscriptions.phpt
patching file tests/150-lists-list.phpt
patching file tests/160-lists-statuses.phpt
patching file tests/182-list_members-show.phpt
patching file tests/setup.php
patching file tests/161-lists-memberships.phpt
patching file tests/850-trends-location.phpt
patching file tests/152-lists-show.phpt
patching file tests/840-trends-available.phpt
patching file tests/190-list_subscribers-create-delete.phpt

テスト

$ php tests/AllTests.php
PHPUnit 3.4.11 by Sebastian Bergmann.

..................................................

Time: 4 seconds, Memory: 9.75Mb

OK (50 tests, 0 assertions)

tests-config.phpセット後。

$ php tests/AllTests.php
PHPUnit 3.4.11 by Sebastian Bergmann.

..........S....F.......S.....S..........S.....F.S.

Time: 48 seconds, Memory: 10.00Mb

There were 2 failures:

1) /home/cockok/projects/Services_Twitter/tests/460-account-update_profile_image.phpt
--- Expected
+++ Actual
@@ @@
-bool(true)
+bool(false)

/home/cockok/projects/Services_Twitter/tests/AllTests.php:56
/home/cockok/projects/Services_Twitter/tests/AllTests.php:72

2) /home/cockok/projects/Services_Twitter/tests/470-account-update_profile_background_image.phpt
--- Expected
+++ Actual
@@ @@
-bool(true)
+あなたが設定した背景用の画像に問題があるようです。おそらく大きすぎです。 (code: 403, call: http://api.twitter.com/1/account/update_profile_background_image.json)

/home/cockok/projects/Services_Twitter/tests/AllTests.php:56
/home/cockok/projects/Services_Twitter/tests/AllTests.php:72

FAILURES!
Tests: 50, Assertions: 0, Failures: 2, Skipped: 5.

画像周りでエラーでてるけどもともと出てるようなので知りません。

カテゴリー: php タグ:

Services_Twitter

2010 年 2 月 4 日 コメント 1 件

PHPでtwitterを利用する場合にはServices_Twitterが便利です。
このServices_Twitterですが、公式のPEAR公式と野良(?)版が存在します。

  1. PEAR公式 Services_Twitter

  2. 悠希@arielaさん版 Services_Twitter
    最新版はCodeRepos /lang/php/Services_Twitter – CodeRepos::Share – Trac

  3. openpear版 Services_Twitter – Openpear

openpear版はさっき見つけたけど、ちょっと使う気になれないので選択肢としてはPEAR公式か悠希さん版。
環境がCentOS5系、PHP5.1系だったので、悠希さん版を検討したのですが、CodeReposに入れられてるもののほとんど更新されておらず、APIが増えてる現状を考えると作業量的に厳しいということでPEAR公式を利用することに。
Services_Twitter-0.1.0 betaがリリースされたので日本のと比較してみた – 肉とご飯と甘いもの @ sotarok
この頃と状況は結構変わっていて、json必須ではない(でも速度の関係でpeclのjsonを利用)、HTTP_Request2でsocket通信とかになっています。
結構珍しい造りになっていて、api群はdata/api.xmlで管理されています。
pearコマンドを利用せずに利用する人は注意が必要。

カテゴリー: php タグ: ,

peclのjsonはnumber型をintに桁落ちする

2010 年 1 月 27 日 コメントはありません

いろいろな制約の関係でCentOS5系のPHP5.1.6でjsonの処理を行わなければならず、Jsphonだとパフォーマンス的に厳しいのでpeclのjsonを利用することになりました。

利用していたところ、mumber型がint型に桁落ちする現象に遭遇。


$ php -r "var_dump(json_decode('{\"id\":8271518654}'));"
object(stdClass)#1 (1) {
  ["id"]=>
  int(2147483647)
}

調べてみたところ、PHP5.2.1の時代にバグレポートされてその後fixされたが、peclにはバックポートされてないようでした。

PHP Bugs: #41567: json_encode double conversion is inconsistent with PHP
バグレポートを参考に修正し、phpizeしてみましたが変わらず。

PHP5.2で取り込まれてるわけですが、そこでphpizeすればいけるんじゃ?ということで5.2.3のソースをダウンロードしphpize後make成功したのでインストールしてみましたが件の件は修正されていませんでした。

結局、PHP5.2.4で修正されていることを確認したのでここに軟着陸。


$ cd /usr/local/src
$ wget http://museum.php.net/php5/php-5.2.4.tar.gz
$ tar zxf php-5.2.4.tar.gz
$ cd php-5.2.4/ext/json
$ phpize
$ ./configure
$ make
$ sudo make install
$ php -i | grep json
$ php -r "var_dump(json_decode('{\"id\":8271518654}'));"
object(stdClass)#1 (1) {
  ["id"]=>
  float(8271518654)
}

make通ったのはPHP5.2.9まで、PHP5.2.5~PHP5.2.9はjson_encodeで問題が見つかった為結局PHP5.2.4のを利用することに。
もうちょい時間があったらしっかり検証したいとこですが。

カテゴリー: php タグ: ,

PHPと日本語

2007 年 5 月 11 日 コメントはありません

PHPで日本語を利用する際のphp.iniの設定やはまりごとなど。

■導入時

○必須オプション
–enable-mbstring
マルチバイト文字列関数(mb_〜)を利用できるようになります。
これがないと話になりません。

○推奨オプション
–enable-zend-multibyte
このオプションはスクリプトをShift_JISで記述する場合問題となる2バイト目が0×5C等に成りうることによる問題を回避できます。

echo "Oh!能";

本家で取得できるWindowsバイナリはこちらのオプションを利用していませんので気をつけてください。

■mbstringで設定できるエンコード名
利用できるなら(ほぼできると思いますが)SJIS-win、eucJP-winを利用しましょう。
DoCoMo絵文字、①も相互変換、利用できるようになります。

$str = '①';
$str = mb_convert_encoding($str, 'SJIS-win', 'UTF-8');
$str = mb_convert_encoding($str, 'UTF-8', 'SJIS-win');
echo $str; // ①

■php.iniの設定
○mbstring.language
mbstring.internal_encodingを設定する上で必須なので設定しましょう。

○mbstring.internal_encoding
よく内部エンコーディングといわれますが、あくまで、マルチバイト文字列関数を利用する場合のデフォルトエンコーディングです。
スクリプトファイルと同じエンコーディングを指定すれば、mb_strlen等の関数を利用する場合引数を省略できます。

○mbstring.http_output
HTTP出力文字エンコーディングのデフォルト値です。
単体では意味がありません。
「output_handler = mb_output_handler」も同時に指定することで初めて、出力の際にmbstring.internal_encoding
からmbstring.http_outputへエンコーディングの変換を行います。
利用する場合はdefault_charsetも設定しておくとよいでしょう。

output_handler       = mb_output_handler
default_charset      = Shift_JIS
mbstring.internal_encoding    = UTF-8
mbstring.http_output = SJIS

○mbstring.http_input
HTTP入力文字エンコーディングのデフォルト値です。
単体では意味がありません。
「mbstring.encoding_translation = On」も同時に指定することで初めて、入力をmbstring.http_inputからmbstring.internal_encodingへエンコーディングの変換を行います。

○mbstring.detect_order
文字コード検出のデフォルト値です。
利用するエンコーディングを指定するだけしておいたほうがいいです。

結論として、「mbstring.language」、「mbstring.internal_encoding」、「mbstring.detect_order」だけ設定し他はデフォルトでいいのではないでしょうか。
自分の場合こんな感じになってます。

mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.encoding_translation = Off
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.detect_order = UTF-8,SJIS-win,eucJP-win
mbstring.substitute_character = none

携帯オンリー

default_charset = Shift_JIS
mbstring.language = Japanese
mbstring.internal_encoding = SJIS-win
mbstring.encoding_translation = Off
mbstring.http_input = pass
mbstring.http_output = pass
mbstring.detect_order = SJIS-win,UTF-8
mbstring.substitute_character = none

■利用時の注意
○mb_regex_encoding
スクリプト内においてinternal_encodingを変更時、mb_internal_encording()を利用した場合はマルチバイト正規表現を利用する場合は別途mb_regex_encoding()を呼ぶ必要がある。

echo ini_get('mbstring.internal_encoding'); // UTF-8
mb_internal_encoding('SJIS-win');

echo mb_regex_encoding(); // UTF-8
echo mb_internal_encoding(); // SJIS-win
echo ini_get('mbstring.internal_encoding'); // UTF-8
ini_set('mbstring.internal_encoding', 'SJIS-win');

echo mb_regex_encoding(); // SJIS
echo mb_internal_encoding(); // SJIS-win

マルチバイト文字列関数以外はinternal_encodingの値を参照なんてもちろんしないことに注意。
○htmlspecialchars
mbstringのエンコーディングと違うのでSJIS-winを指定できないことに注意。

//echo htmlspecialchars('<>\'"', ENT_QUOTES, 'SJIS-win');
echo htmlspecialchars('<>\'"', ENT_QUOTES, 'SJIS');

○preg系
uオプションを利用すればUTF-8で利用できます。

preg_match('/テスト/u', 'テスト');

○mysql_real_escape_string
mysql_client_encoding()のエンコーディングに依存。
mysql_client_encodingで取得できる値は変更できないため、たとえば、mysqlのエンコーディングをcp932で利用しPHP4デフォルトのクライアントを利用している場合、文字コードが見つからず(警告がでる)latain1がセットされるため5c文字をしっかりエスケープしようとし想定外の結果となる。

カテゴリー: php タグ: