2017年9月12日火曜日

php + pdo + sqliteでattach databaseできない

pythonとphpを同時にいじるとphpで行末の ; (セミコロン)を入れ忘れるなぁとは思っていたのですが、結構ハマりますね(笑)


ログデータはramdisk上のtmpで蓄積し、深夜にtmpから保存用にデータ移動させています。その関係上前日のデータを扱うにはコネクションを切り替えるか、データアクセスで同時に2つのデータベースを開く必要があるのですが、sqlite3はほんとによくできていてちゃんと一つのコネクションで同時にデータベースを開くことができました。
pythonで出来ていたのでphpでもできるかな?と苦戦しつつ原因不明のエラーが返されます。
また抽出条件のためにバインド変数で条件付けを行おうとしたところpdoのバインドはなんていうか結構回りくどい。
pythonは実装側で出来る限り汎用的に振舞って処理する傾向が強いので苦しみませんでしたが、php側の実装は処理を限定させるためにとにかく回りくどいです。
どちらの傾向も一長一短があるのですが、pythonの場合は、運用時に問題が発生したときにブラックボックス化された処理を回避するのに苦労しそう。

そんなお堅いphp + pdoですが、どうもデータ記述言語処理系の実装が片手落ちしてそうな予感はありました。
で、いろいろと検索していくとどうもattach databaseできないっぽい記述がチラホラ。
pythonでは行けるんだからイケてもよさそうなんですけどね。


トドメはPHPのバグ報告が上がっていて、その後の対応が全くとられていないっぽい雰囲気でした。まぁ発言先が場違いなような気もするし、単純にSQLite側の対応待ちなのかもしれないし。



使えそうにないものであることが分かった以上回避策を講じる必要があります。
が、なんでしょうね、そもそもそんな重要要件ではないんですが…(笑)

仕切り直して、今回行いたいのは物理的に分離されている2つのデータベースを結合して一つの表として扱いたい。

回避策としては、
1案 pythonでできるのでデータ抽出を外部コマンドで処理して取得する。
2案 php内で2回データベースを開いて処理する。

こんなところでしょうかね?それぞれの特性は
1案では、処理データのボリュームを考えると、今のところ最大2日分の処理データなので外部コマンドで処理してもよさそう。
2案では末端操作として考えると、php内で処理した方が最悪1レコード単位でデータが回せるので、処理の実装を変えればデータボリュームが大きくなっても対処できる。
とはいえ、データボリュームが大きくなれば処理時間もかかり、結果的に破綻しそう(笑)

結果的に2案のphp + pdoで2回コネクションを張る方向にもっていきました。
しかも2回selectして、それぞれのfetchAll()の結果をarray_merge()するという手抜き。

そして2日分のデータを詰め込んだグラフがこちら。
昨日まではログ収集は10分間隔だったのでそれ前提で、描画していたのですが、横軸の扱いを分単位で扱うようにしたのでログ収集が漏れても余計に随時記録しても、違和感がなくなるようになりました。これを見ると作った本人にしかわからんグラフですが、作った本人はどれがどのセンサーの値かはっきりわかります(笑)

データエラーが多かった原因はどうもmotionを動かしていたせいでI/Oのビット読み込みで失敗していたようです。わかるとなるほどなとは思うのですが、やはりリアルタイム処理を行うにはそれなりの環境にしないとダメそうというのは経験できました。
で、データエラーの0表示が目障りだったのでエラー値も保存するようにしてついでにデータパッチも行いました。(結果的にエラーになったら前回値を引き継ぐようにした)
エラー部分は描画しないようにしたので点線になっています。

温度、湿度、気圧と3軸データを表示するとか気持ちよくできるのはやはりハンドメイドならでは(笑)

0 件のコメント:

コメントを投稿