[Help] Travisでのテスト失敗が再現しない

66 views
Skip to first unread message

koriym

unread,
Aug 8, 2012, 9:37:46 PM8/8/12
to bear-p...@googlegroups.com

こんにちは。郡山です。

現在travisでテスト失敗が出ていますが、gitから取り出すところから初めても
ローカルで再現しません。
http://travis-ci.org/#!/koriym/BEAR.Sunday

エラーは「ページリソースオブジェクト」をApcに保存しようとしたときに「シリアライズができない」ことで例外がでてるようです。
プロパティにクロージャやPDOオブジェクトなどシリアライズ不可のものがあるとこの状態になりますが、該当のものはありません。
ちょっと困ってしまいました。現在テストが動いている方がいましたら、再現するか確認してもらえたら大変助かります。
宜しくお願いします。

1) sandbox\tests\Resource\Page\Blog\PostsTest::resource

336Exception: Ray\Aop\Bind::serialize() must return a string or NULL

337

338/home/vagrant/builds/koriym/BEAR.Sunday/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php:58

339/home/vagrant/builds/koriym/BEAR.Sunday/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php:0

340/home/vagrant/builds/koriym/BEAR.Sunday/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php:89

341/home/vagrant/builds/koriym/BEAR.Sunday/vendor/guzzle/guzzle/src/Guzzle/Common/Cache/DoctrineCacheAdapter.php:53

342/home/vagrant/builds/koriym/BEAR.Sunday/vendor/BEAR/Resource/src/BEAR/Resource/Resource.php:131

343/home/vagrant/builds/koriym/BEAR.Sunday/vendor/BEAR/Resource/src/BEAR/Resource/Resource.php:158

344/home/vagrant/builds/koriym/BEAR.Sunday/apps/sandbox/tests/Resource/Page/Blog/PostsTest.php:48

345/home/vagrant/.phpenv/versions/5.4.5/bin/phpunit:46

346

3472) sandbox\PageIndexTest::resource

348Exception: SplObjectStorage���� ::serialize() must return a string or NULL

349

350/home/vagrant/builds/koriym/BEAR.Sunday/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php:58

351/home/vagrant/builds/koriym/BEAR.Sunday/vendor/doctrine/common/lib/Doctrine/Common/Cache/ApcCache.php:0

352/home/vagrant/builds/koriym/BEAR.Sunday/vendor/doctrine/common/lib/Doctrine/Common/Cache/CacheProvider.php:89

353/home/vagrant/builds/koriym/BEAR.Sunday/vendor/guzzle/guzzle/src/Guzzle/Common/Cache/DoctrineCacheAdapter.php:53

354/home/vagrant/builds/koriym/BEAR.Sunday/vendor/BEAR/Resource/src/BEAR/Resource/Resource.php:131

355/home/vagrant/builds/koriym/BEAR.Sunday/vendor/BEAR/Resource/src/BEAR/Resource/Resource.php:158

356/home/vagrant/builds/koriym/BEAR.Sunday/apps/sandbox/tests/Resource/Page/IndexTest.php:28

357/home/vagrant/.phpenv/versions/5.4.5/bin/phpunit:46


岩崎晃司

unread,
Aug 8, 2012, 11:00:01 PM8/8/12
to bear-p...@googlegroups.com
郡山さん

岩崎です。

通常利用している環境(Ubutu/Mac php5.4.4)では再現しませんでしたが、
travisの環境に似せて作った環境(phpenv+php-build+pyrus php5.4.5)では
現象が再現されました。

少し追ってみて改めて報告します。


2012年8月9日 10:37 koriym <akihito....@gmail.com>:

> --
> このメールは Google グループのグループ「The BEAR Project for PHP」の登録者に送られています。
> このグループに投稿するには、bear-p...@googlegroups.com にメールを送信してください。
> このグループから退会するには、bear-project...@googlegroups.com にメールを送信してください。
> このディスカッションをウェブ上で閲覧するには、https://groups.google.com/d/msg/bear-project/-/6Oja9IVbVq8J
> にアクセスしてください。
> その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。
>
>

Akihito Koriyama

unread,
Aug 8, 2012, 11:09:46 PM8/8/12
to bear-p...@googlegroups.com
岩崎さん

ありがとうございます。
EC2でつくったUbuntu(php5.4.4)では再現しました。

岩崎さんのphp5.4.5、僕のphp5.4.4で出るし、OSXだと5.4.4も5.4.5もでない。
どうもPHPのバージョンとかではないようですね。

apc_storeで問題が発生してるのは確認できました。

気になってるのはこれで


Exception: Ray\Aop\Bind::serialize() must return a string or NULL

BindはArrayObjectを継承したクラスですが、serialize()は未実装で今まで問題なく???。
まずこの辺りを調べてみます....


2012年8月9日 12:00 岩崎晃司 <iwa...@cresc.com>:
その他のオプションについては、https://groups.google.com/groups/opt_out にアクセスしてください。





--
--
Akihito Koriyama <akihito....@gmail.com>



Akihito Koriyama

unread,
Aug 9, 2012, 5:46:15 AM8/9/12
to bear-p...@googlegroups.com
この問題、一応原因はつきとめ解決しました。

PHPのバージョンが同じで、OSXとUbuntuで動作が違うように思え原因がなかなか分かりませんでした。

apc_storeでシリアライズ不可のプロパティがあると"\Exception"例外(というなんとも適当な)例外が出ますが、このエラーメッセージで問題だというオブジェクトのどのプロパティかが明瞭でありません。

SplObjectStrageやRay\Aop\BindのserializeメソッドはNULLかストリングを返さないといけないというメッセージ(Ray\Aop\Bind::serialize() must return a string or NULL)が出るのですが、これはそのメソッドの実装に問題があることでなく、そのオブジェクトのどこかにPDOなどのシリアライズ不可のオブジェクトを含み例外が出るのでstringが返ってない...ということのようでした。
(エラーメッセージが間接的になっているのに注意)

しかし、オブジェクトはつくられたばかりで保存されるところで例外が出ます。PDOオブジェクトはAOPのランタイムインジェクターで注入されるのでこれもすっきりしません。単体でのテストでは問題なく、連続でしたときだけ問題が出るのでキャッシュ / APCストレージを疑いますが、これらを毎回クリアしたりアプリケーションキャッシュを切っても問題は発生します。

該当のオブジェクトを表示しようとしてもSundayのオブジェクトはvar_dump表示には大きすぎてなかなか内容をつかめず、色々な事がなかなかすっきりしません。

問題発生箇所はResourceObject のプロパティを継承した改修が原因ということがわかりました。ロパティだけを持ったResource\ValueオブジェクトをAbstractObjectが継承するよにしたことが問題でした。

https://github.com/koriym/BEAR.Resource/commit/e109aa85de6bf4fae1870e1095cb239c04f94433

なぜプロパティを継承しただけで、シリアライズ不可でエラーになりそれもOSによる差があるのか、詳細つかめてませんが対処的に戻す事で対応しました。

以上現時点での報告を。

試してもらった岩崎さん、ありがとうございました。
感謝です。

2012年8月9日 12:09 Akihito Koriyama <akihito....@gmail.com>:
Reply all
Reply to author
Forward
0 new messages