SymfonyのセッションデータをMySQLに格納する

さくらインターネットから、「ファイル数多すぎるんで削除してください」という連絡が来たのでなんのこっちゃと調べたら、 この間の設定変更で指定したセッションファイル格納用ディレクトリが溢れているという話らしい。おおっと。 でもって、話をよくよく聞いてみるとセッションが使用不可になったのも共用ディレクトリである「/tmp」に保存できるファイル数が10万ファイルまでに制限されているからだそうな。当たり前か。 本当のことを言うと、そう大したユーザー数がいるとも思えないサービスなのに溢れすぎじゃないかと思うけど、 設定を見返すのは後回しにしてとりあえず現状を改善しないと行けない。 よくよく考えてみて、「/tmp」ディレクトリのパーミッション的に階層化も出来そうにないし、 こりゃセッションデータをMySQLに格納するしかないかなと言うことで以下の設定を。

参考:

symfonyでセッションにデータベースを使用する [dozo dokuwiki.php] Practical symfony | 22日目: デプロイ | symfony | Web PHP Framework

続きを読む

[PHP] さくらインターネットでセッションが使用できなくなっていた件

こちらの件に関連して。 [umbls] ログインできない不具合を修正しました。 – nplll 根本的な理由はさっぱり分からないのですが、なぜかさくらインターネットのサーバにてセッションが使用できなくなっていました。初めはプログラムのバグでログインできないんだと思って、自分が書いたコードやSymfonyの設定周りを洗っていたのですが、なんか何をどうやっても上手くいかない。それどころか、簡単なセッション処理のプログラムすら動かない。session_start()して、$_SESSIONを使って格納しただけなのに、保存されないのね。

コード例:

session_test.php:

session_test2.php:

<?php
session_start();

echo 'Welcome to page #2';

echo date('Y m d H:i:s', $_SESSION['time']);  // 1970 01 01 09:00:00と表示されてしまう
?>
散々嵌ったのだけど、もしかして、と思って次のことを試してみたら直りました。

解決策:

  • php.iniにてsession.save_pathを明示的に指定(例:/home/user/tmp) ← 以前はno valueだった
  • 指定したディレクトリに書き込み権限を与える
こんなのこっちで変更するわけがないので、サーバの設定が変わったのかな(一時ディレクトリのパーミションが変わったとか)と思うけど、その辺はよくわかんないし、いやまさかそんなことしないだろうと思うので、やっぱり僕が何か設定を変更してしまったのかなぁ。レンタルサーバだけにその辺の線引きが微妙で、しかも記憶に無いどころか痕跡すら見当たらなくて凄く気持ち悪いのだけど。 あー気持ち悪い。

続きを読む

【メモ】crontabのバックアップ

crontabを大幅に編集したくなったので、バックアップ取れないかなぁと検索して調べていたのだけど、行き当たった情報見たら何かもの凄く簡単な話だった。あらら。

crontabのバックアップ

crontab -l > ~/backup/crontab.20101126

crontabの復元

crontab ~/backup/crontab.20101126
要するにテキストファイルへ書き出してバックアップ、それを読み込んで復元。 「-l」と言うオプションは内容を表示するオプション。 本当に単純なシステムなのねぇ。cronって。それがいいんだけど。

参考:

cron 登録ジョブ crontab のバックアップ CRON < Wiki | さくらのレンタルサーバ非公式FAQ

続きを読む

FFmpegのAMRに関する挙動が変わってた(libamrからlibopencore-amrへ)

とあるプログラムでffmpegをコマンドラインで使って3gpファイルを作成するということをしているんですが、ある時期を境に上手く動かなくなってしまっていたんですね。次のコマンドでエラーが出る。

/usr/bin/ffmpeg -y -i original.mp3 -acodec libamr_nb -ac 1 -ar 8000 -ab 7.95k new.3gp

(中略)

Unknown encoder 'libamr_nb'
原因がわからずしばらく放置していたんですが、わかりました。 libamrってFFmpegで使えなくなったんですね。 情報はこちらから。
リビジョン11660時点 libamrがnonfreeになったそうで –enable-nonfreeを追加しなければコンパイルできません。 (中略) リビジョン19631頃 amr-wbとamr-nbが消えてopencore-amrを使用するようになりました。 「–enable-libamr-nb –enable-libamr-wb」の代わりに 「–enable-libopencore-amrnb」と「–enable-libopencore-amrwb」を使用しないといけません。
 
なるほどそうだったのか。 つまり不用意にFFmpegをバージョンアップした俺が悪いんじゃないか…がっかり。。

続きを読む

【メモ】さくらインターネットでSymfonyを使う

フレームワークを使わない管理から、俺俺フレームワークもどきに移行しかけていたのですが、そもそもフレームワークを設計する技量など無く便利な部分だけを抜き書きしただけ(autoload周りとか)だったので、これ以上カオスな状態にするのは止めようとフレームワーク導入を決定。導入するのは何にするかほんの少し考えたけど、CakePHPとZendFrameworkもよぎりましたが、CakePHPは複数プロジェクトを管理できないっぽかったし、ZendFrameworkは全然わかんないし、そもそもどれも解ってるとは言い難いので、仕事で使ってて少しはなじみがあるSymfonyを入れてみました(ただし、入れたのは1.4系。仕事で使ってるのは1.0系)。 インストールはここを参考にして、PEAR経由で。 さくらインターネットでsymfonyをインストール | ueblog

続きを読む

【メモ】Subversionでcleanup出来なくなったときの対処

# 正しいかどうかわかりませんので、復旧準備してから試してください
Subversionでファイルを追加する際にパーミッションの関係でaddに失敗した。パーミッション等確認してから再度updateしたら次のエラー。
$ svn up www/hoge.php
svn: 作業コピー 'www' はロックされています
svn: ロックを解除するには 'svn cleanup' を実行してください (さらに詳しく知りたいときは 'svn help cleanup' と打ってください)
仕方がないのでcleanup。
svn cleaup www
今度は次のエラー。
$ svn cleanup www
svn: 現在のディレクトリ: 'www'
svn: コマンド 'modify-wcprop' を 'www' 内で処理しているときにエラーが発生しました
svn: 'hoge.php' はバージョン管理下におかれていません
むう。 調べてもなかなか解決に至らず。かすかな情報を元に次のファイルを削除してみる。
www/.svn/log
もう一度、cleanup。
svn cleaup www
お、成功。 updateもOK。 こんなんでいいのか… logファイルって削除してもいいのかな?問題無い場合は生成されないみたいだから、エラーが起きたって言うフラグだと思うんだけど。。 今後何か起こらないことを祈る。チェックアウトするのはなかなか大変なんで。

続きを読む

【メモ】ストレージサーバを導入したら負荷が劇的に改善した件

Webサーバが非常にビジーなのは何でなんだぜ?と言えば、リクエスト過多でメモリを食いつぶしてるのが原因だろうというのは見当が付いていたので、リクエストを減らすかメモリを増やすかで、そのリクエストを減らす案の1つとして「ストレージサーバを用意し、HTTP経由でファイルを取得する」という方向で実施してみたらばこれが見事にビンゴ。多分、ただWebサーバをスケールアウトしてもこんなに上手くいかない(サイトの構成上、の話だけど)。 ストレージサーバはHDDが少し多めな他は大体通常のレベル。Apacheの代わりにthttpdを採用しているけれども、sslやkeep-aliveを考慮するとApacheでも別に良かったかも知れない。まぁ今のところ上手くいってるので試すのは得策とは言えないけど、機会があれば試してみたい。

続きを読む

【メモ】ファイル変更/削除時のパーミッションまとめ

恥ずかしながら、いや本当に恥ずかしながら、ファイルを変更するときのパーミッションにいて混乱してしまったので少しまとめておく。 OSはCentOS 5.2。 まず重要なことはこれ。

ファイルを変更、削除するのに必要なのはそのファイル自体のパーミッションではなく、そのファイルを格納しているディレクトリのパーミッション
…。 (そうだったのか…) ディレクトリのパーミッション毎に可能な操作は以下の通り。
  • [r] そのディレクトリの一覧の参照が可能
  • [w] そのディレクトリ内のファイルの削除、名前変更が可能。新規作成が可能
  • [x] そのディレクトリにアクセス可能
ディレクトリの所有者と処理(例えば削除)を実行するユーザとを勘案すると、パーミッションと出来ることの例は次のような感じになる。

続きを読む

【メモ】memcacedのバックアップとしてTokyoTyrantを使う

現在あるシステムで、memcachedのバックアップとしてTokyoTyrantを利用しています。 以下は、主要な部分だけを抜粋したコードです。

$key = 'hello';
//Pecl::memcached
$value = MyMemcached::get($key);
if($value === false):
//memcacheから取得できないときはTokyoTyrantからの取得を試みる
MyTokyoTyrant::initialize();
if(MyTokyoTyrant::getEnabled() === true):
$value = MyTokyoTyrant::get($key);
$hasTTCache = (!$value) ? false : true;
else:
$hasTTCache = false;
endif;
//TokyoTyrantからも取得できないときはMySQL
if($hasTTCache === false):
$value = self::getByIdWithConnection($key);
MyTokyoTyrant::set($key, $value, 0);
endif;
MyMemcached::set($key, $value);
endif;
システムの前提として、
  1. 設備が非常に貧弱である
    • キャッシュサーバはなく、APサーバと同居したプロセスが用途別に1プロセスずつあるのみ
  2. memcachedを利用するプログラムの構成が適切ではない
    • PHPのクライアント「Pecl::Memcache」がmgetに対応していない影響で、1データごとにgetを繰り返す構成になっている。順次「Pecl::Memcached」のgetMultiに置き換え中
という問題点があります。 どちらも現在根本的な修正に向けて作業中ですが、今日始めて明日実装というわけにはいかない(特にサーバの増強)ので、なんとか「誤魔化」さないといけません。というわけで試行錯誤の末、TokyoTyrantを併用する形になっています。

続きを読む