Pages

2012年4月3日火曜日

SIDとクッキーがどちらも定義されている

とあるサーバー
Apache 2.2.20
PHP 5.2.17
session.use_trans_sid=0

なんですけど、定数SIDとクッキーが両方定義されているみたいです。
具体的にいいますと、

echo SID
> "PHPSESSID=abcd1234wxyz9876"
echo $_COOKIE['PHOSESSID']
> "abcd1234wxyz987"

てな具合です。

とりあえず、use_trans_sidは設定せずに、携帯等クッキーが設定されていない場合に備えて、SIDの中身が定義されていればURLの後ろにセッションIDを付けるということをしていたので、このケースではPCでも何でもセッションID付きのURLになってしまう。

状況はよく分かりませんが、気持ち悪いのでクッキーが設定されていなくて、かつ、SIDが設定されている場合は・・・という条件分岐を追加しました。

2012年4月1日日曜日

MPMoviePlayerViewController _serverConnectionDiedNotification


MPMoviePlayerViewControllerからのリクエストをサーバで受ける場合に注意が必要であるという件は前回の記事で書きました。

これは、直接関係しているかどうかはわかりませんし、未確定情報ですが、一回の再生で何度もリクエストを送るということで、それぞれに時間のかかる処理を入れてしまうと再生が遅くなるのは当然ですが、ときおり下記のようなエラーが発生する場合があります。

_serverConnectionDiedNotification. Info -- notification=Error Domain=AVFoundationErrorDomain Code=-11819 "Cannot Complete Action" UserInfo=0xde25730 {NSLocalizedRecoverySuggestion=Try again later., NSLocalizedDescription=Cannot Complete Action}, AVPlayer = <MPQueuePlayer: 0xdef2540>, currentTime = 0.00
 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'
*** First throw call stack:
(0x372b688f 0x357bc259 0x367170dd 0x3670dedb 0x3670ec37 0x3450cc59 0x3450eee7 0x372892ad 0x3720c4a5 0x3720c36d 0x32119439 0x33990e7d 0xa9a55 0xa94f0)

これは、実験的にサーバ処理の中にスリープを入れ、スリープをある程度長くすると発生したという結果からの私の推測です。エラーの内容も接続が切れたので処理を完了できなかったというように読めます。

ご参考までに。


MPMoviePlayerViewControllerでプログラムが出力する動画を再生する

MPMoviewPlayerViewControllerでサーバ上の動画を再生する際には注意が必要です。

静的なファイルを直接URLで指定するような場合には特に何も気にする必要はありませんが、JavaやPHPのようにサーバ上のプログラムから動画データを出力するような場合には普通に出力させてもちゃんと再生されません。

というのも、どうやら、MPMoviePlayerViewControllerは指定されたURLに対してバイトレンジを指定してリクエストを送っているようです。
Range: bytes=0-5011
のように。

ここからは推測も入っていますが…

最初のリクエストで
Range: bytes=0-1
を送って、レスポンスヘッダに
Accept-Rages: bytes
が含まれているかをチェックして、バイトレンジのアクセスが許可されていなければ即再生を止めプレイヤーを終了してしまいます。

ですから、プログラムから動画を出力する場合には、リクエストレンジを取得して適切なレスポンスを返す必要があります。確認した限りでは結構頻繁にリクエスト送っています。同時に複数のセッションを張っている可能性もあります。

PHPなら、$_SERVER['HTTP_RANGE']でとれます。