PHP
PHPのセッションのガーベジコレクションがよくわからない
PHPマニュアルに以下のようにあるんだけど、
http://jp.php.net/manual/ja/session.configuration.php#ini.session.save-path
オプションの引数としてN(数値)を指定できます。 これはセッションファイルを分散して保存する際に ディレクトリ階層レベルを決定します。 例えば、’5;/tmp’とすると /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If という位置にセッションファイルを生成します。 Nを使用するには、これらすべてのディレクトリが 事前に作成されている必要があります。 そのためのシェルスクリプトがext/sessionに mod_files.shというファイル名であります。 また、0以上のNが指定されている場合には自動ガーベッジコレクション が機能しないことに注意してください。詳細は php.ini を見てください。 また、Nを指定する場合は、 session.save_pathを”quotes”で囲う必要があります。 なぜならセパレータ(;) は php.ini ではコメントとしても利用されているからです。
これがちょっとまえのマニュアルだと、
http://www.teu.ac.jp/chiit/~dsuzuki/phpdoc/ref.session.html
session.save_pathのパスの深さが2より大きい場合、ガーベッジコレクションは行われません。
となっているぽい。
debianのパッケージから入れたphpでは、デフォルトのセッション保存先は /var/lib/php5 になってる。
これが「パスの深さが2より大きい場合」にあたるのか、自分が試した限りではセッションが破棄されなかった。
< ?php
ini_set('session.gc_maxlifetime', 3);
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 1);
session_cache_expire(1);
session_start();
session_regenerate_id();
if (isset($_SESSION['user'])) {
$_SESSION['count'] += 1;
echo 'login', $_SESSION['count'];
} else {
$_SESSION['user'] = true;
echo 'logout';
}
?>
session test
/var/tmp とか [...]
ZendFrameworkでニコりまくる。mylist編
前回 ZendFrameworkでニコる。flv。
mylist の動画を全部落とす。
連続でアクセスしまくるとしばらく(15分ぐらい?)弾かれるみたいなので、1つのflvダウンロードするごとに sleep(30) で30秒待機してます。
< ?php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
// create adapter
$client = new Zend_Http_Client();
$client->setConfig(array(‘keepalive’ => true));
// Login
$client->setCookieJar()
->setUri(‘https://secure.nicovideo.jp/secure/login?site=niconico’)
->setParameterPost(array(
‘mail’ => ‘mailaddress’,
[...]
ZendFrameworkでニコる。flv。
今さら。
flv取りたかった。
色々ハマった。(array)Object とか null とかに。
まぁいいや。
< ?php
require 'Zend/Loader.php';
Zend_Loader::registerAutoload();
$video_id = 'sm3997296';
// Create Adapter
$client = new Zend_Http_Client();
$client->setConfig(array(‘keepalive’ => true));
// Login
$client->setCookieJar()
->setUri(‘https://secure.nicovideo.jp/secure/login?site=niconico’)
->setParameterPost(array(
‘mail’ => ‘mailaddress’,
[...]
つるぺた幼女でもわかる!ZendFrameworkの基礎知識 (zf-users.jp 取ったんだぜ)
幼女に反応してやった来たひとこんばんは。
さぁ、もうそろそろ飽きられつつある *-users.jp。
めざせ13ブクマ。
日本で、というか世界でもCakePHPとSymfonyが強そうだねとか思って、ZendFrameworkユーザーがあまり多くない。(と思う。)
コミュニティも特にないヨネって思ってたところに -users な流れがきたのでタイミング良かった。
http://zf-users.jp/
まだ何もない。うん。例のごとく勢いで取った。未定。
とりあえず、ZendFrameworkユーザー集まってみないかい?
IRCにくるんだ。
freenodeの #zftalk-ja だ。
作ったばかりで全然人いないけどね。じっくり待つ。
s.h.log: IRCを使おう Windows編
s.h.log: IRCを使おう Mac編
ZendFrameworkのindexにあるグローバルな奴らを考える
ZendFrameworkはindex.phpでフロントコントローラーを作って、そこからリクエスト内容を見てコントローラー・アクションを分けていくんですが、index.phpに色んな設定を書いていくとグローバル変数が何個もできます。
< ?php
// Zend_Session
Zend_Session::start();
$admin = new Zend_Session_Namespace('admin');
Zend_Registry::set('admin', $admin);
// Zend_Config
$config = new Zend_Config_Ini($dir . '/config/config.ini', 'production');
Zend_Registry::set('config', $config);
// Zend_Layout
Zend_Layout::startMvc(array('layoutPath' => $dir . ‘/layouts’));
// Zend_Db
$dbAdapter = Zend_Db::factory(Zend_Registry::get(‘config’)->database);
Zend_Registry::set(‘dbAdapter’, $dbAdapter);
/**
* Setup Controller
*/
$front = Zend_Controller_Front::getInstance();
$front->addModuleDirectory($dir . ‘/modules’);
$front->throwExceptions(true);
// run
$front->dispatch();
Zend_Registryでどこからでもアクセスできるようにはしてるけど、グローバル変数が残ってることにはかわりない。
起動ファイルのコードのスコープ – いしなお! (2007-06-06)
ここにも書いてある。なんか気持ち悪い。
で、bootstrap.phpを作ってindex.phpから読み込むことにする。
ディレクトリ構造はこんな感じ
index.phpはbootstrap.phpを読み込むだけにするので
< ?php
set_include_path( /* path */ );
require_once “../application/bootstrap.php”;
Bootstrap::init();
とかだけにしておく。
boostrapの中でクラスを作ってそこで設定を初期化する。
< ?php
/**
* Bootstrap Class
*/
class Bootstrap {
static public function [...]