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だった
  • 指定したディレクトリに書き込み権限を与える
こんなのこっちで変更するわけがないので、サーバの設定が変わったのかな(一時ディレクトリのパーミションが変わったとか)と思うけど、その辺はよくわかんないし、いやまさかそんなことしないだろうと思うので、やっぱり僕が何か設定を変更してしまったのかなぁ。レンタルサーバだけにその辺の線引きが微妙で、しかも記憶に無いどころか痕跡すら見当たらなくて凄く気持ち悪いのだけど。 あー気持ち悪い。

続きを読む

【tips】 PEAR::Cache_Liteのディレクトリ構造を深くする

レンタルサーバではmemcachedなどを使用することが出来ないので、何らかのファイルキャッシュを使うことが多いと思うんですが、いくつかのサービスではPEAR::Cache_Liteを導入しています。 Cache_Lite 規模が大きくなるとI/Oがネックになるので、ファイルキャッシュはいずれ問題になってくるのですが、小規模なサービスであればこれで十分。 で、導入自体は極めて簡単なんですけど、気になったのはディレクトリ。UNIX系サーバでは1ディレクトリにおけるファイル数は10,000くらいなので、サービスを継続しているといずれキャッシュが作れなくなってしまう。でもCache_Liteの設定(インスタンス生成時にオプションを配列で渡す)ではディレクトリを渡すだけ。今は大丈夫だけど念のためディレクトリを構造化したいな… と思ったら、ちゃんとその設定がありました。 マニュアルは細かく読まないとダメだね。

続きを読む

PDO::FETCH_CLASSとgetter/setterのマジックメソッド

「食わず嫌い」とはアレなものでして、長いことPDOでfetchといえばFETCH_ASSOCと思ってたんですが、なんだよ、FETCH_CLASS超便利じゃん、と言うことに気付いたのでいくつか試行錯誤してみるなど。 まぁ便利さ言うならちゃんとO/Rマッパー使えこの野郎という話ですけど、設定が面倒なときもあってついあれなので…FETCH_CLASSとマジックメソッド使ってみたかった的なアレでひとつ。

続きを読む

未定義の特殊文字の実体参照が含まれるXMLファイルを無理矢理パースする

RSSを始めとするXMLで使用できるる特殊文字の実体参照は、以下の5つだけです。 (何の定義も与えられていない場合)

  • &lt; → <
  • &gt; → >
  • &amp; → &
  • &apos; → '
  • &quot; → "
これ以外の特殊文字の実体参照(例えば&times → &timesや、∞ → &infin;)が含まれている場合、パース時にパースエラーとなって読み込めないことがあります。ブラウザで表示しようとしてもそこで途切れてしまったり、返り値がfalseになったり(例えばSimpleXML)。動作としてはそれで正しいのですが、
  1. RSSを配信しているのが自分ではない
  2. 何らかの処理のために無理矢理読み込んでパースしたい
と言うときがあります。 本来であれば、パース処理の方に手を加えるべきなのでしょうが、面倒なので次のような過程を踏んでみました。

続きを読む

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

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

続きを読む

【メモ】 PEAR::Authを使ったサービスを検討中。

自信が無くてユーザー登録を使ったシステムの構築には二の足を踏んでいたのだけど、PEAR::Authを使えば比較的楽に構築できそうなので少し勉強して、作成中。作ろうかと思って結局止めたサービス(結果的にはPEAR::Authの試験実装になった)では、「新規登録→仮登録・メール送信→本登録」の流れや、ログイン・ログアウトのシステムまで構築できたので特に問題ないと思われ。 作ろうとしているサービスがあまりに小粒で、フレームワークを入れるほどではないと個人的には思っているのだけど、かといってなんもないのも微妙なので、フレームワークの中かのごく一部だけをかじったようなもの(つまりオレオレフレームワーク)をでっち上げてコーディング中(諦めてCakePHPでも入れなさいよという話ではある)。 試験実装の続きと言うことで、仕様が右往左往しており、いつになったら公開できるか全然未定で、そう言う意味で昨今のスピーディな開発の流れから完全に乖離したやるせない状況なのだけど(もしかしたら既存サービスのブラッシュアップになるかも)、まぁ趣味であって業務じゃないから良いかなという方向で。

続きを読む