「php」タグアーカイブ

CentOS 5.5(64bit) + Apache 2.2 + PHP 5.1でメモリー約1.7GBの壁

バッチ処理的なものを書いてたらぶち当たったのでメモ。

32bit環境だったらわかるんだけど、64bit環境でも部分的に32bitな部分が残ってるんだかなんだか、メモリーが約1.7GBしか確保できなくてエラーが出た。

大量にメモリーを使わないように書きなおして回避できたけど、なんだかちょっと納得行かない感じ。まぁそもそもそんなにメモリー使う実装はどうなのよ?というのもあるけど。。

CentOS5.5上のPHP 5.1.6 + APC 3.0.19で関数の二重定義が出来ちゃう?

動いてるプログラムを別環境に持って行ったら「Cannot redeclare」が出た。元環境の方では特にエラーは出てなかったんだけど、元環境の方もAPCを外してみたら同じエラーが出るようになった。

現象としては func.php に hoge() の定義があったとして、index.php から func.php を複数回 include() してもエラーにならない。

とりあえず function_exists() で二重定義しないようにしたけどさ。。

PHPで乱数を生成するrand()を調べた

http://www.php.net/manual/ja/function.srand.php を見ると、

注意: PHP 4.2.0 以降、 srand() または mt_srand() によりランダム数生成器にシードを与える必要はありません。 これは、この処理が自動的に行われるためです。

と、あったので、どんなもんかと検索してみたところ http://d.hatena.ne.jp/yoya/20080807 に行き着いた。

で、実際どうなってるんだ?と思いソースを調べてみた。

/ext/standard/rand.c の65行目に

php_srand(GENERATE_SEED() TSRMLS_CC);

があって、これが /ext/standard/php_rand.h の 52行目の

#define GENERATE_SEED() ((long) (time(0) * getpid() * 1000000 * php_combined_lcg(TSRMLS_C)))

で、php_combined_lcgは /ext/standard/lcg.c にあって、そこからlcg_seed()に行き着いたんだけど、

if (gettimeofday(&tv, NULL) == 0) {
LCG(s1) = tv.tv_sec ^ (~tv.tv_usec);
} else {
LCG(s1) = 1;
}

以下の部分でなぜランダムになるのか良くわからず。。

Amazon EC2のMicro InstanceにAmazon Linuxをインストールしてからやったこと

まずは全体的なところから

  • root宛てのメールを自分に転送
    vi /etc/aliases で root: {$メールアドレス} にしてから newaliases
  • タイムゾーンを日本標準時にする
    cp /usr/share/zoneinfo/Japan /etc/localtime で、一回ログオフしてつなぎなおせばOK。
    (あと crond の再起動が必要)
  • システム文字コードの変更
    vi /etc/sysconfig/i18n で、LANG=”ja_JP.UTF-8″ にすればOK。
  • iptablesの設定

続きを読む Amazon EC2のMicro InstanceにAmazon Linuxをインストールしてからやったこと