function 内の include

test1.php

function foo() {
    global $color;
    $fruit = 'SUIKA';

    include 'test2.php';
    echo "A $color $fruit\n";
}

for ($i=0; $i<100; $i++) {
    foo();
    echo memory_get_usage() . "\n\n";
}

test2.php

$color = 'green';
$fruit = 'apple';

test1.php を実行したとき、メモリが増加する。

メモリ増加の原因は、ダブルクォーテーション内の変数展開であった。関数内のincludeはメモリを増やさない事がわかった。

CoreServer で PHP CGIモード(セーフモード:オフ)

セーフモードの回避策で、

AddHandler application/x-httpd-phpcgi .php

とするのだが、CGI版のPHPを動かすということである。
しかし、CGIのPHPでも問題がある。

HTTPのレスポンスヘッダーが常に Content-Type: text/html としてしまう。

CGIのPHPでFireFoxを使って管理画面が崩れてしまうのは、このせいである。
この回避策として、load-styles.phpのみをモジュール版に戻すという手段もあるが、他の手段としてphp.ini を各ディレクトリに設置するということをする。記述は下記の通り。

cgi.nph = 1
default_mimetype =

default_charset =

しかし、次の条件の時はまだ足らない、

  • セーフモード:オフでないとならない場合。かつ、
  • レスポンスヘッダーがPHPで設定したContent-Typeでならないとき。かつ
  • レスポンスヘッダーがStatus:304でならないとき。

このとき、なにが足らないかというとStatusが常に200となってしまう。
一応回避策はあって、

  • 先頭行に、#!/usr/local/bin/php -q とする。
  • アクセス権を755とする。
  • .htaaccess でなどで該当ファイルを
    AddHandler cgi-script .php とする。

でも、この方法は面倒だなぁ。

2次元配列のソート

複数の多次元の配列をソートする

例3 データベースの結果をソートする

この例では、配列 data の個々の要素がテーブルのひとつの行を表しています。 これは、データベースのレコードの典型的な形式です。

データの例:

volume | edition
——-+——–
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7

データは data という名前の配列に格納します。 これは、例えば mysql_fetch_assoc() の結果をループさせたりすれば得られます。
$data[] = array(‘volume’ => 67, ‘edition’ => 2);
$data[] = array(‘volume’ => 86, ‘edition’ => 1);
$data[] = array(‘volume’ => 85, ‘edition’ => 6);
$data[] = array(‘volume’ => 98, ‘edition’ => 2);
$data[] = array(‘volume’ => 86, ‘edition’ => 6);
$data[] = array(‘volume’ => 67, ‘edition’ => 7);
?>

この例では、データを volume の降順、 edition の昇順に並べ替えます。

私たちが今もっているのは行方向の配列ですが、 array_multisort() で必要なのは列方向の配列です。 そこで、以下のコードで列方向の配列を得たあとでソートを行います。
// 列方向の配列を得る
foreach ($data as $key => $row) {
$volume[$key] = $row['volume'];
$edition[$key] = $row['edition'];
}

// データを volume の降順、edition の昇順にソートする。
// $data を最後のパラメータとして渡し、同じキーでソートする。
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
?>

データセットの行はソートされ、以下のようになります:

volume | edition
——-+——–
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7

PHPでメール送信 PEARを使って!

下記サイト参照。
早急にやらんと。。。

S-MEMO(エスメモ): PEAR::Mailを使ってメールを送信してみよう

CoreserverでPEARのインストール記事発見。

SeeIn開発日誌 – 共有サーバ(CORESERVER.JP)で自由にPEARのインストールをする

ちょっと、良い説明。
http://masha.maakikaku.jp/2007/12/_peargopear.php