2010年12月22日のブックマーク (5件)

  • php の foreach で参照渡しをするには - Enjoi Blog

    主に IT 技術を整理するためにメモ的に書き溜めています。少しだけフリーソフトもあるよ。コメントを残すには、 facebook を使ってください。 php の foreach は基値渡しで、受け取った値を変更しても当然元の配列データは変更されない。 でも実際は参照渡しもできることを知ったので一応メモ。 以下は普通の値渡しの例。 $enjoi = array("normal", "crazy"); foreach( $enjoi as $e ) { if( $e == "crazy" ) { $e = "normal"; } } var_dump($enjoi); array(2) { [0]=> string(6) "normal" [1]=> string(6) "crazy" } でも関数の参照渡しみたいに & をつけてやると、参照渡しを使って foreach で配列を処理できる。

    proxy0721
    proxy0721 2010/12/22
  • PHP: パフォーマンスの考慮点 - Manual

    パフォーマンスの考慮点 可能性があるルートを単純に収集すると、パフォーマンスにごくわずかな影響があると既に前述しました。 しかし、これは PHP 5.3 と PHP 5.2 を比較する場合です。 可能性があるルートを記録すると、PHP 5.2 のように全く記録しないものに比べてより遅いとはいえ、 PHP 5.3 のランタイムへの他の変更点により、この特有のパフォーマンス低下が一層際立つことが防止されています。 パフォーマンスが影響を受ける主な分野は2つあります。 1つ目は、減少したメモリ使用量で、 2つ目はガベージコレクション機構がそのメモリ・クリーンアップを実行する際の実行遅延です。 それら両方の問題を見てみましょう。 減少したメモリ使用量 まず第一に、ガベージコレクション機構を実装する理由は、 必要条件が満たされたらすぐに、循環参照された変数を整理してメモリ使用量を減らすことにあるので

    PHP: パフォーマンスの考慮点 - Manual
    proxy0721
    proxy0721 2010/12/22
  • PakuReserve( パクレゼルヴ ) R&D Laboratory » PHPのガーベジコレクタについて

    PHP 5.2までのガーベジコレクタは参照カウント方式です。 循環参照が発生すると、その参照に含まれるオブジェクトが回収できませんので、デーモンなど長時間実行するようなスクリプトを作る場合は循環参照を起こさないように注意する必要があります。 尚、PHP 5.3からは循環参照コレクタが使え、デフォルトで有効になっています。 実際にPHP 5.1.6と5.3.0を比較し、実際にどのような動きになるか以下のコードで試してみました。 < ?php ini_set('memory_limit', -1); // gc_disable(); class A { } $loop_count = 1000000; for($i = 1; $i <= $loop_count; $i++) { $a = new A; $a->self = $a; // 循環参照 if (($i % round($loop

    proxy0721
    proxy0721 2010/12/22
  • PHPの循環参照ではまった - KAYAC Engineers' Blog

    symfony+propelで数千回ループするバッチを走らせたところメモリリークしてどうしても途中で処理が終了してしまう。 調べた所、phpのガベコレのシステムで変数を循環参照させてしまうと、変数の参照カウンタが0にならずにメモリを開放してくれないのが原因だった。 propelで one-to-many のリレーションをしているテーブルを扱う場合、 $one_object->addManyObject($many_object); といったメソッドがあるのだがこのメソッドに循環参照するコードが含まれていてメモリリークしていた。数千回ループ回すバッチとかで使用する時は要注意。 public function addManyObject(ManyObject $l) { $this->collManyObjects[] = $l; $l->setOneObject($this); // ここで

    PHPの循環参照ではまった - KAYAC Engineers' Blog
    proxy0721
    proxy0721 2010/12/22
  • PHP:循環参照に対する動作の違い: Script雑感

    長い間スクリプト使い続けてきて今更ながら覚え書きをしようと一念発起。 まー。節操もなく色々手を出しています。これからも。 JavaScript / PHP が主なところかな? ・ 循環参照を持つ変数に何らかの処理を加えた時の動作の相違 ・ 循環参照を見つける簡易関数(php5) 自前環境で、循環参照に対する幾つかの関数の動作を試行。 ちなみに、php v5.3 では循環参照をガーベッジ・コレクターが検出し、循環参照に使用されているメモリーを解放することができるとのこと。 ■ 循環参照の例 A)配列で値渡し(※) $a = array(); $a[0] = $a; B)配列で参照渡し $a = array(); $a[0] = &$a; C)クラスインスタンスで値渡し $a = new stdClass; $a->p = $a; D)クラスインスタンスで参照渡し $a = new stdCl

    proxy0721
    proxy0721 2010/12/22