タグ別アーカイブ: php

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をインストールしてからやったこと

apcのGCエラーが出たら

apacheのログファイルにこんなのが出てきたら

[apc-warning] GC cache entry

apcのメモリーサイズが小さすぎてGCに失敗しているらしいので、php.iniに

apc.shm_size=64

とか書けばオッケー。

何も指定していないとデフォルトで30MB確保されるようになってるんだけど、これは小さすぎるようなので、64MB辺りをミニマムに考えておいた方が良さそう。
追記:64じゃまだ小さそうなので96にした。

coreserverにchyrpを入れてみた

このサーバーでも試してみたんだけど、今のバージョンはPHP5.2以上じゃないと動かないっぽいので。。

インストールは簡単
  1. 最新のchyrpをダウンロードして展開
  2. /chyrp/install.php にアクセスするとアラートが出る
  3. アラートに従って .htaccess を作成
  4. includesディレクトリのパーミッションを書き込み可能にする
  5. もう一度 /chyrp/install.php にアクセスして、後はウィザードに従うだけ

以上。