PHPメモ

はまったところメモ

include の振る舞い

include というのは、外部ファイルを読み込む演算子。

include 'ファイル名';

読み込まれるのはわかるが、 include をしたファイルは、 HTMLモードで展開される、ということを知らなかったためにハマった。

どういうことかというと、include ファイルは php スクリプトが書かれている前提ではなく、 HTML(というか、スクリプトではない単純テキスト)として読み込まれる。

つまり、

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
 
 
 
 
 
<?php
    // phpコード1
    
    include 'xxxx.inc';
    
    // phpコード2
?>

というのは、

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 
 
 
 
 
 
 
 
 
<?php
     // phpコード1
?>
 
    <!-- xxx.inc の内容 -->
 
<?php
    // phpコード2
?>

ということ。

なので、include ファイルの内容を php スクリプトとする場合は、 include ファイルにも php の開始タグと終了タグを書く必要がある。

逆にいえば、ファイルの内容を HTML として出力したいのなら、 読み込んだ内容を echo や print などする必要はなく、include するだけでOK。

これは require(require_once)も同じ。

参考

PHP4 と PHP5 のインスタンスの扱い

インスタンスを生成し、それを別の変数に代入した場合の扱いが PHP4 と PHP5 で異なるらしい。

具体的には、

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 <?php
 
     class hoge {
         var $fuga = 'default';
     }
 
     $src = new hoge();
 
     $dst = $src;
 
     $dst->fuga = 'modify';
 
     echo $src->fuga;
 
 ?>

としたとき、PHP4 では 'default' になり、PHP5 では 'modify' になる。 つまり、PHP5 では元の値が変更されるが、PHP4 では変更されない。

その理由が次のページで解説されていた。

なんかいろいろ書かれてるけど、 つまり、オブジェクトにおける代入演算子('=')の挙動は、 PHP4 はコピーの扱いで、PHP5 は参照の扱いになるってこと。

PHP4 では参照はできないのかといえば、明示的に '=&' を使えば参照の代入になる。

PHP4 で参照による代入をする場合

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
 
 
 
 
 
<?php
     ...
 
     $dst =& $src;
 
     ...
?>

PHP5 からは、オブジェクトの代入はデフォルトで参照になったということなので、 PHP4 のときのようにコピーをとりたい場合は、clone を使う必要がある。

PHP5 でコピーによる代入をする場合

Everything is expanded.Everything is shortened.
  1
  2
  3
  4
  5
  6
  7
 
 
 
 
 
 
 
 <?php
     ...
 
     $dst = clone $src;
 
     ...
 ?>

allow_url_fopen が無効にされちゃったYO!

allow_url_fopen というのは、PHPでリモートファイルを開いて参照できるかどうかを設定するスイッチ。これが OFF に設定されると、fopen() でリモートファイル(URL)を開くことができなくなる。

最近はどのサーバでもセキュリティを厳しくする傾向にあり、このスイッチは大抵 OFF に設定されるようになっている模様。

そんな場合は、HTTP_Request を使う。

PEAR のライブラリに HTTP/Request というものがあるので、これがサーバにインストールされていれば、そのまま利用する。

例えば、次のような感じでリモートのファイル内容を参照できる。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
<?php
require_once "HTTP/Request.php";
 
function getRemoteFile($url) {
    $http_req =& new HTTP_Request($url);
    if ( !PEAR::isError( $http_req->sendRequest() ) ) {
        $code = $http_req->getResponseCode();
        if ( $code >= 300 && $code < 400 ) {
            $http_hdr = $http_req->getResponseHeader();
            if ( isset($http_hdr['location']) ) {
                return getRemoteFile($http_hdr['location']);
            }
        } else {
            return $http_req->getResponseBody();
        }
    }
    return null;
}
?>

上記では、応答コードが300番台の場合は「リダイレクトしてくれ」ってことなので、 ヘッダ情報に書かれている location を取得して関数を再起させている。

fopen() を使ってファイルを開いて内容を読み出している部分のコードを、マルッとコイツに置き換えれば解決。

HTTP/Request がインストールされていない場合は、PEAR のサイトから HTTP/Request, Net/URL, Net/Socket の3つのライブラリ(依存関係の都合でこの3つが必要)をダウンロードしてきて、上記スクリプトのファイルと同じ階層(ディレクトリ)に配置すれば OK。

注意すべきは、PEAR のライブラリはパスが通った場所に置かれている前提で require が書かれているので、HTTP というディレクトリの下に Net ディレクトリを配置しないと動かない(若しくは、HTTP/Request.php の require を書き換えるか)。

つまり、こんな感じで。

(root)
   |
   +- [DIR] HTTP
   |    |
   |    +- [DIR] Net
   |    |   |
   |    |   +- Socket.php
   |    |   +- URL.php
   |    |
   |    +- Request.php
   |
   +- 上のスクリプトを書いたファイル

セッションの扱い

初期化、終了

使うページでは、まず

session_start();

を呼出すのはお約束。

破棄する場合は

session_destroy();

破棄は、完全にそのサイトを離れる場合に呼出すようにするといい。ログアウトとか。

毎回呼出すわけじゃない。呼出した時点でセッションが切れる。

セッションに変数を作成する

PHP5以降であれば $_SESSION というグローバル配列へ書き込み、読み出しができる。

例えば、"user_id" と "user_pass" などというセッション変数を作りたい場合は

$_SESSION['user_id']   = "xxxxx";
$_SESSION['user_pass'] = "xxxxx";

とすればOK。

PHP4.1より前のバージョンでは session_register という関数を呼出してから使用。

session_register('user_id');
session_register('user_pass');

$user_id   = "xxxxx";
$user_pass = "xxxxx";

PHP5でも session_register は使える。でも、いちいち宣言の要らない $_SESSION を使う方が楽よね。

$_SESSION の実装は、その中で結局 session_register を呼出してるようなので、 どちらで書いても同じ意味っぽい。

読み出す場合は、

$id   = $_SESSION['user_id'];
$pass = $_SESSION['user_pass'];

で。

ImageMagic? を Windows 環境にインストール メモ

  1. ここから Windows 用のバイナリをダウンロードしてインストール。
    ImageMagic インストーラ(Win)
  2. 次のサイトから php_imagick_dyn-Q16 をダウンロード。
  1. dll を PHP の ext フォルダに配置。
    php.ini にフォルダの設定があるはず。
  2. php.ini に次の記述を追加。
    extension=php_imagick_dyn-Q16.dll
  3. システム環境変数に次の記述を追加。
    MAGICK_HOME=[ImageMagic をインストールしたフォルダ]
    ex.) C:\ImageMagick

これで、例えば次のようなスクリプトを表示してみる。

  1
  2
  3
<?php $image =& new Imagick('test.jpg');
$image-> thumbnailImage(100, 0);
$image-> writeImage('test_thumb.jpg'); ?>

("test.jpg" は同じフォルダに配置で。)

サムネイルが出力されればよし。

駄目な場合に試すこと。

  • Apache 再起動。
  • Windows(OS)再起動。

もっといろいろやってみる

ここらへんにリファレンスがある。
PHP Manual - 画像処理 (ImageMagick)

参考サイト


MLEXP. Wiki


添付ファイル: filephp_imagick_dyn-Q16.dll 611件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-05-15 (土) 12:07:39 (3662d)