safe_modeによるini_set()制限

memory_limitを引き上げるために、

ini_set("memory_limit", 256M);

って試したところ、safe_modeがONの場合はini_set()できないみたい。
safe_modeで制限受けてんじゃん。ini_set()。
↓の一覧にini_set()は記載されてないんだけど。

PHP: セーフモードにより制限を受けるか無効となる関数 - Manual

PHPの挙動

初心に返ってPHPマニュアルを読み直してます。その中で新たな発見、気になった点をつらつらと。

PHP: PHP を使用する初めてのページ - Manual

  • 改行に関する注意

PHPの閉じタグ"?>"の直後の改行は、PHPによって取り除かれるらしい。

改行に関する注意: HTML においては改行にはほとんど意味がありません。ただ、 HTML の見栄えをよくするためにも適宜改行を入れておくとよいでしょう。 ?> の直後の改行は、PHP によって取り除かれます。 複数の PHP ブロックを使用している場合や、 何かを出力するのかどうかがわからないファイルを include する際などに、 この挙動は非常に便利です。と同時に少々混乱するかもしれません。 強制的に改行させるには、?> の後に空白を置くか、 あるいは PHP ブロック内の最後の echo/print で明示的に改行を出力します。

  • 複雑な (波括弧) 構文

http://jp.php.net/manual/ja/language.types.string.php#language.types.string.parsing.complex
中略

注意: 文字列内での変数のパースは、文字列の連結に比べてよりメモリを消費します。 メモリの使用量をできるだけ抑えた PHP スクリプトを書きたいのなら、 変数のパースを用いるのではなく、連結演算子 (.) を使用しましょう。

引数で指定した起点ディレクトリ以下のファイル一覧を生成するスクリプト ver1.1

<?php

/**
 * 引数で指定した起点ディレクトリ以下のファイル一覧を生成するスクリプト
 * 
 * @version 1.1
 */


// 引数がディレクトリパスでなかったら、終了
if ( !is_dir($basePath = $argv[1]))
{
    echo "It is not a directory.";
}


// ファイルリストの配列
$fileList = array();
// ファイルリストを生成
makeFileList($basePath, $fileList);

// 確認
print_r($fileList);



/**
 * ディレクトリパスを受け取り、<br>
 * それ以下のファイル、及びディレクトリパスを生成する
 * 
 * @access public
 * @param  string $dirPath ディレクトリパス
 * @param  array  $fileList ファイルリスト
 */
function makeFileList($dirPath, &$fileList)
{
    // ディレクトリハンドラを開く
    //   有効なディレクトリでないか、
    //   または権限が制限されているか、
    //   ファイルシステムのエラーによりディレクトリがオープンできない場合はexit
    if ( !$dh = opendir($dirPath) )
    {
        exit;
    }

    // ファイルを一つずつ処理
    while (false !== ($entry = readdir($dh)))
    {
        // ファイルの絶対パスを生成
        $realPath = realpath($dirPath) . DIRECTORY_SEPARATOR . $entry;

        // "."と".."と自分のスクリプトファイル名は処理しない
        if ( "." === $entry || ".." === $entry || __FILE__ === $realPath)
        {
            continue;
        }

        // ファイルリストを追加
        $fileList[] = $realPath;

        // ディレクトリの場合は再帰処理
        if ( is_dir($realPath) )
        {
            makeFileList($realPath, $fileList);
        }
    }

    closedir($dh);

}

?>

指定した起点ディレクトリ以下のファイル一覧を表示するスクリプト

<?php
/**
 * 指定した起点ディレクトリ以下のファイル一覧を表示するスクリプト
 * 
 */

// 引数を取得
$basepath = $argv[1];

// ファイルリストを取得
$fileList = array();
$fileList = getFileList($basepath, $fileList);

// 表示
print_r($fileList);



/**
 * ファイルリストを再帰的に取得する
 * 
 * @access public
 * @param  string $path ファイルパス(file or dir)
 * @param  array  $buf ファイルリストを溜め込む箱
 */
function getFileList($path, &$buf)
{
    // ディレクトリ判別
    if ( is_dir($path) )
    {
        // ディレクトリの場合、そのディレクトリの一覧を取得するために、
        // ディレクトリハンドラを開く
        if ( $dh = opendir($path) )
        {
            // ディレクトリの中身をループ処理
            //   readdir()でディレクトリエントリを取得し、
            //   それが妥当な場合は処理開始
            while (false !== ($entry = readdir($dh)))
            {
                // 絶対パスを生成
                $realPath = realpath($path) . DIRECTORY_SEPARATOR . $entry;

                // "."と".."と自分のスクリプトファイルは省く
                if ("." !== $entry && ".." !== $entry && __FILE__ !== $realPath)
                {
                  // ファイルリストを溜め込む箱に詰む
                  $buf[] = $realPath;

                  // エントリがディレクトリだったら、再帰
                  if ( is_dir($realPath) )
                  {
                    getFileList($realPath, $buf);
                  }
                }
            }

            closedir($dh);
        }

      }

}

?>