APC と jQuery を利用してファイルアップロードの進行状況を表示する

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  ネタ的には特別新しいものではないですが、気になっていたので試してみました。
  PHP 5.2.0 以降、APC 3.0.13 が必要です。

1. APC の設定

  普通に APC をインストールして、以下のように apc.rfc1867 を有効にするだけです。

apc.rfc1867 = On

2. アップロードフォームの準備

  普通のアップロードフォームです。
  ただし、"APC_UPLOAD_PROGRESS" という name 属性を持った hidden フィールドを用意します。値は、何でもいいのですが、ここでは "progress_key" という風にしています (本当はランダムにするほうがいいと思います)。

<form id="upload" action="upload.php" method="post" enctype="multipart/form-data">
<p>
<input type="hidden" name="APC_UPLOAD_PROGRESS" value="progress_key" />
<input type="file" name="file" />
<input id="submit_button" type="submit" value="アップロード" />
</p>
</form>

3. アップロードファイルの処理

  上記アップロードフォームの upload.php ですが、これは通常のファイルアップロード時の処理を書いてください。
  今回はテストなので何もしませ

<?php
// 通常のファイルアップロードの処理
?>

4. アップロードの進行状況を返す処理

  次のファイルを progress.php とします。

<?php
// progress.php
header('Content-type: application/json; charset=UTF-8');
$status = apc_fetch('upload_progress_key');
echo json_encode($status);
exit;
?>


  2 で指定した "APC_UPLOAD_PROGRESS" の値の先頭に upload_ をつけたものを apc_fetch() の引数に指定します。upload_ は設定で変更することが出来ます (apc.rfc1867_prefix)。
  apc_fetch() で取得できる値は次のようになります。

total          アップロードされるファイルのサイズ                              
current        現時点までに受信したファイルのサイズ                            
rate           アップロード速度 (byte/second)           アップロード完了時のみ
filename       ファイル名                                                      
name           <input type="file" /> の name 属性                              
temp_filename 一時ファイル名                           アップロード完了時のみ
cancel_upload アップロードがキャンセルされたかどうか   アップロード完了時のみ
done           アップロードが完了したかどうか                                  
start_time     アップロード開始日時の UNIX TIME                                
  • cancel_upload: 0 = キャンセルされていない、1 = キャンセルされた
  • done: 0 = 未完了、1 = 完了

  これらの値を JSON で出力しています。

5. jQuery を使って進行状況を取得する

  jQuery Form Plugin を使って、フォームを POST し、1 秒毎に getJSON で進行状況を取得します。
  また、getJSON でリクエストに現在日時を渡しているのは、ブラウザのキャッシュを利用しないようにするためです。

var timer = null;

var progress = function() {
    // progress.php を呼び出して進行状況を取得する
    $.getJSON('progress.php', { 'd': new Date().getTime() }, function(json) {
        // 進行状況を % で表示する
        $('#status').html(parseInt(json.current / json.total * 100) + '%');
    });
};

$(function() {
    $('#upload').submit(function() {
        timer = setInterval('progress()', 1000);
        // フォームを POST する
        $(this).ajaxSubmit(function() {
            clearInterval(timer);
            progress();
        });
        return false;
    });
});

6. デモ

  本当は、デモを用意したかったのですが、ここのレンタルサーバでは APC が使えないようでしたのでアップロード状況をキャプッチャしました。
  基本的には、上記の処理を行なっているだけですが、進行状況の表示の部分は Progress Bar Plugin を利用して、プログレスバーで表示しています。



  このデモで使用したファイル一式を以下に置いておきます。

参考


- PHP V5.2 の新機能、第 5 回: ファイル・アップロードの進行状況を追跡する方法
  http://www.ibm.com/developerworks/jp/opensource/library/os-php-v525/

- upload meter for PHP with APC and Json
  http://progphp.com/progress.phps

- PHP: APC 関数 - Manual
  http://php.net/apc

- jQuery Form Plugin
  http://malsup.com/jquery/form/

- Progress Bar Plugin
  http://digitalbush.com/projects/progress-bar-plugin

タグ: [PHP][jQuery][JavaScript]

PEAR::setErrorHandling でエラー処理を行なう

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  PEAR パッケージのエラー処理ですが、よくあるパターンとしては以下のような書き方をすると思います。

$result = $mdb->query('SELECT * FROM table');
if (PEAR::isError($result)) {
    die($result->getMessage());
}


  エラー処理の数が少ない場合はこれでいいのですが、多くなってくると可読性が悪くなります。

  この場合、PEAR::setErrorHandling() を使うことで以下のように簡潔に書くことができます。

PEAR::setErrorHandling(PEAR_ERROR_DIE);

$mdb2->query('SELECT * FROM table');
// PEAR:isError() を使わなくていい


  この書き方は、マニュアルによると「PEAR_Error の生成時に、エラーメッセージが出力され、スクリプトが終了します。」ということになります。

  エラーが発生したら、ログを出力して終了したいという場合は、以下のようにコールバックを利用することができます。

PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');

function handleError($error)
{
    require_once 'Log.php';
    $log = &Log::singleton('file', 'error.log');
    $log->err($error->getMessage());
    exit('エラー');
}

$mdb2->query('SELECT * FROM table');


  PEAR パッケージをよく使う場合には便利です。

- PEAR::setErrorHandling()
  http://pear.php.net/manual/ja/core.pear.pear.seterrorhandling.php

タグ: [PHP]

PEAR::Pager で Digg っぽいページャを作る

comments(1) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  UI Patterns紹介されているように Digg のページャは見た目にも綺麗だし、わかりやすいと思います。
  以下の画像が Digg のページャです。

  Digg Pager

  そこで、PEAR::Pager を使って Digg っぽいページャを作ってみました。

- スクリーンショット
  PEAR::Pager Digg Pager

- デモページ
  http://pocari.org/demo/digg-pager/

  完全に一緒というわけではありませんが、これくらいならば結構簡単に作ることができました。

  ソースは以下のようになります。

<?php
require_once 'Pager/Pager.php';

$params = array(
    'mode'                  => 'sliding',
    'perPage'               => 10,
    'delta'                 => 5,
    'separator'             => '',
    'curPageLinkClassName'  => 'current',
//  上記はこれと同じ意味
//  'curPageSpanPre'        => '<span class="current">',
//  'curPageSpanPost'       => '</span>',
    'prevImg'               => '&#171; Previous',
    'nextImg'               => 'Next &#187;',
    'firstPagePre'          => '',
    'firstPagePost'         => '',
    'lastPagePre'           => '',
    'lastPagePost'          => '',
    'spacesBeforeSeparator' => 0,
    'spacesAfterSeparator'  => 0,
    'totalItems'            => 2180,
    'altFirst'              => 'Go to page 1',
    'altPrev'               => 'Go to Previous Page',
    'altNext'               => 'Go to Next Page',
    'altLast'               => 'Go to Last Page',
    'altPage'               => 'Go to page',
);

$pager =& Pager::factory($params);
$links = $pager->getLinks();
$page_range = $pager->getPageRangeByPageId();
$page_range = range($page_range[0], $page_range[1]);

$link = '';
if ($links['pages'] != '') {
    // 前のページ
    if ($links['back'] != '') {
        // クラスを付ける
        $link .= str_replace('<a href', '<a class="nextprev" href', $links['back']);
    } else {
        $link .= '<span class="nextprev">' . $pager->getOption('prevImg') . '</span>';
    }
    // 最初のページ
    if ($links['first'] != '' && !in_array(1, $page_range)) {
        $link .= $links['first'] . '<span>....</span>';
    }
    // ページ
    $link .= $links['pages'];
    // 最後のページ
    if ($links['last'] != '' && !in_array($pager->numPages(), $page_range)) {
        $link .= '<span>....</span>' . $links['last'];
    }
    // 次のページ
    if ($links['next'] != '') {
        // クラスを付ける
        $link .= str_replace('<a href', '<a class="nextprev" href', $links['next']);
    } else {
        $link .= '<span class="nextprev">' . $pager->getOption('nextImg') . '</span>';
    }
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <link rel="stylesheet" type="text/css" href="style.css" />
  <title>PEAR::Pager で Digg っぽいページャを作るデモ</title>
</head>

<body>

<div class="pager">
<?php echo $link; ?>
</div>

</body>
</html>


  CSS は以下のようになります (Digg のものとほとんど同じです)。

div.pager {
    margin-top: 20px;
    font-size: 85%;
}

div.pager a,
div.pager span {
    display: block;
    float: left;
    margin-right: 0.1em;
    padding: 0.2em 0.5em;
}

div.pager a {
    color: #105cb6;
    background-color: #fff;
    border: 1px solid #9aafe5;
    text-decoration: none;
}

div.pager a:hover {
    color: #003;
    background-color: #fff;
    border: 1px solid #2e6ab1;
}

div.pager span.current {
    color: #fff;
    background-color: #2e6ab1;
    border: 1px solid #2e6ab1;
    font-weight: bold;
}

div.pager span.nextprev {
    border: 1px solid #ddd;
    color: #999;
    background-color: #fff;
}

div.pager a.nextprev {
    font-weight: bold;
}

タグ: [PHP]

XAMPP に含まれる Apache,MySQL,PHP のバージョンの遷移

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  今年もまた約一年ぶりに調査。もはやこの情報が役に立つかどうかは不明ですが……

XAMPP      リリース日 Apache 2.x MySQL 4.x MySQL 5.x PHP 4.x    PHP 5.x
0.9        2003-07-22 2.0.47      4.0.14                4.3.3 rc2
1.0        2003-09-03 2.0.47      4.0.14                4.3.3     
1.1        2003-10-13 2.0.47      4.0.16                4.3.3     
1.2        2003-11-04 2.0.48      4.0.16                4.3.4     
1.3        2004-02-10 2.0.49      4.0.18                4.3.6     
1.4        2004-03-25 2.0.49      4.0.18                4.3.4     
1.4.2      2004-04-06 2.0.49      4.0.18                4.3.6     
1.4.3      2004-06-12 2.0.49      4.0.20a               4.3.7     
1.4.4      2004-07-03 2.0.50      4.0.20                4.3.7     
1.4.5      2004-07-14 2.0.50      4.0.20                4.3.8      5.0.0
1.4.6      2004-08-16 2.0.50      4.0.20                4.3.8      5.0.1
1.4.7      2004-09-18 2.0.51      4.0.21                4.3.8      5.0.1
1.4.8      2004-09-25 2.0.51      4.0.21                4.3.9      5.0.2
1.4.9      2004-10-02 2.0.52      4.0.21                4.3.9      5.0.2
1.4.10     2004-12-05 2.0.52      4.1.7                 4.3.9      5.0.2
1.4.11     2004-12-25 2.0.52      4.1.8                 4.3.10     5.0.3
1.4.12     2005-02-20 2.0.53      4.1.9                 4.3.10     5.0.3
1.4.13     2005-04-10 2.0.54      4.1.11                4.3.11     5.0.4
1.4.14     2005-06-19 2.0.54      4.1.12                4.3.11     5.0.4
1.4.15     2005-08-14 2.0.54      4.1.13                4.4.0      5.0.4
1.4.16     2005-10-03 2.0.54      4.1.14                4.4.0      5.0.5
1.5.0      2005-11-06 2.0.55                 5.0.15     4.4.1      5.0.5
1.5.0-pl1 2006-01-08 2.0.55                 5.0.15     4.4.1-pl1 5.0.5
1.5.1      2006-01-08 2.2.0                  5.0.18     4.4.1-pl1 5.1.1
1.5.2      2006-04-26 2.2.0                  5.0.20     4.4.2-pl1 5.1.2
1.5.3      2006-05-28 2.2.2                  5.0.21     4.4.2-pl1 5.1.4
1.5.4      2006-09-10 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.4a     2006-10-04 2.2.3                  5.0.24a    4.4.4      5.1.6
1.5.5      2006-11-26 2.2.3                  5.0.27     4.4.4      5.2.0
1.6.0      2007-02-18 2.2.4                  5.0.33     4.4.5      5.2.1
1.6.0a     2007-02-21 2.2.4                  5.0.33     4.4.5      5.2.1
1.6.1      2007-04-17 2.2.4                  5.0.37     4.4.6      5.2.1
1.6.2      2007-05-28 2.2.4                  5.0.41     4.4.7      5.2.2
1.6.3      2007-07-22 2.2.4                  5.0.45     4.4.7      5.2.3
1.6.3a     2007-07-26 2.2.4                  5.0.45     4.4.7      5.2.3
1.6.4      2007-10-07 2.2.6                  5.0.45     4.4.7      5.2.4
                                                                    
最新版                 2.2.6       4.1.22     5.0.45     4.4.7      5.2.4


  最新版は,2007-11-04 での各プロダクトの最新バージョン.
  調査対象は XAMPP for Windows.

- XAMPP
  http://sourceforge.net/projects/xampp/
  http://www.apachefriends.org/en/xampp.html

タグ: [MySQL][PHP]

PEAR::Pager で生成されるリンクを並び替える方法

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

- ウノウラボ Unoh Labs: PEAR::Pagerで生成されるリンクを並び替える
  http://labs.unoh.net/2007/11/pearpager.html

  上記エントリで、PEAR::Pager で生成されるリンクを並び替えるために Pager_Common クラスの Build() メソッドを書き換える方法が紹介されていました。
  そこで、ここでは Build メソッドを書き換えずに、getLinks() メソッドを利用して、リンクを並び替える (任意の項目を任意の順序で表示する) 方法を紹介します。

  上記エントリのように以下の順序で出力する方法です。

前のページ [最初のページ] n 〜 m 番目のページ [最後のページ] 次のページ

require_once 'Pager/Pager.php';

$params = array(
    'mode' => 'sliding',
    'delta' => 5,
    'perPage' => 5,
    'prevImg' => '&lt;&lt;',
    'nextImg' => '&gt;&gt;',
    'totalItems' => 1000,
    'spacesBeforeSeparator' => 1,
    'spacesAfterSeparator' => 1,
);

$pager =& Pager::factory($params);
$links = $pager->getLinks();
if ($links['pages'] != '') {
    echo $links['back'], ' ', $links['first'], $links['pages'], $links['last'], ' ', $links['next'];
}


  このようにすることで、以下のような出力が得られます。

  PEAR::Pager

  getLinks() メソッドの戻り値を利用して、任意の順序で出力するだけです。

  getLinks() メソッドは以下のような連想配列を返します。

back      前のページへのリンク
pages     n ~ m 番目のページへのリンク ($pager->links と同じ)
next      次のページへのリンク
first     最初のページへのリンク
last      最後のページへのリンク
linktags サイトナビゲーション用のリンク (参考)


  linktags は以下のようなものが返されます。

<link rel="first" href="./pager.php?pageID=1" title="first page" />
<link rel="previous" href="./pager.php?pageID=7" title="previous page" />
<link rel="next" href="./pager.php?pageID=9" title="next page" />
<link rel="last" href="./pager.php?pageID=200" title="last page" />


  このように getLinks() メソッドの戻り値をうまく使えば、任意の項目を任意の順序で表示することができます。

  ちなみに私が好んで指定するオプションは以下のようなものです。最初/最後のページへのリンクは表示しないことも多いです。

require_once 'Pager/Pager.php';

$params = array(
    'mode' => 'sliding',
    'perPage' => 20,
    'delta' => 5,
    'urlVar' => 'p',
    'separator' => ' |',
    'curPageSpanPre' => '',
    'curPageSpanPost' => '',
    'prevImg' => '&lt;前の20件',
    'nextImg' => '次の20件&gt;',
    'firstPageText' => '最初',
    'firstPagePre' => '[',
    'firstPagePost' => ']',
    'lastPageText' => '最後',
    'lastPagePre' => '[',
    'lastPagePost' => ']',
    'spacesBeforeSeparator' => 0,
    'spacesAfterSeparator' => 1,
    'totalItems' => 1000,
    'altFirst' => '最初のページへ移動',
    'altPrev' => '前のページへ移動',
    'altNext' => '次のページへ移動',
    'altLast' => '最後のページへ移動',
    'altPage' => 'ページ',
);

$pager =& Pager::factory($params);
$links = $pager->getLinks();
if ($links['pages'] != '') {
    echo $links['first'], $links['back'], ' | ', $links['pages'], ' | ', $links['next'], ' ', $links['last'];
}


  出力は次のようになります。

PEAR::Pager

タグ: [PHP]

PEAR Log を使って Firebug にログを出力する

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  PEAR Log 1.9.11 から Firebug にログを出力することができるようになったみたいなので試してみました。

- PEAR :: Package :: Log
  http://pear.php.net/package/Log

- Firebug - Web Development Evolved
  http://www.getfirebug.com/jp.html

require_once 'Log.php';

$log = &Log::singleton('firebug', '', 'PHP', array('buffering' => true), PEAR_LOG_DEBUG);

$log->log('デバッグレベルのログ', PEAR_LOG_DEBUG);
$log->log('情報レベルのログ', PEAR_LOG_INFO); // この場合は、PEAR_LOG_INFO は省略可
$log->log('警告レベルのログ', PEAR_LOG_WARNING);
$log->log('エラーレベルのログ', PEAR_LOG_ERR);


  コードはこれだけで、log() メソッドでログを出力します。

PEAR Log Firebug

  生成される HTML は以下のようになります。

<script type="text/javascript">
console.debug("PHP [debug] デバッグレベルのログ");
console.info("PHP [info] 情報レベルのログ");
console.warn("PHP [warning] 警告レベルのログ");
console.error("PHP [error] エラーレベルのログ");
</script>


  singleton の第 4 引数はオプションですが、上記の例ではバッファリングを有効にしています。
  バッファリング有効にすると JavaScript が HTML の一番最後に追記されるようになります。
  逆に、バッファリングを有効にしない場合 (デフォルト) は、log() メソッドの場所に JavaScript が生成されるようになります。

  header() で何か出力しているときや、セッションを使う場合はバッファリングが無効だと問題になる場合があるので、そのようなときには、バッファリングを有効にすることで、問題なくログを出力することができる場合があります。

タグ: [PHP][Firefox][JavaScript]

PHP カンファレンス 2007 レポート

comments(1) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  2007-09-01 に PHP カンファレンスが大田区産業プラザ (PiO) で行なわれました。
  自分が見たプログラムの内容をメモしておいたので簡単にまとめます。また、まとめながら調べたことも一緒に記述しています。

  なお、間違いがあるかもしれませんが、その際は教えていただけるとありがたいです。

- PHPカンファレンス2007プログラム概要
  http://www.php.gr.jp/seminar/20070901/prog.php

1. 基調講演「PHP の今とこれから 2007」

PHP 4.3/4.4 の利用率は 75% 程度

PHP 5 について

PHP 5.2 について

PHP 5.3 について

  • 本来は予定にはなかった
  • 2008/01 以降にリリースか?
  • PHP 6 までのつなぎのバージョン
    • Unicode サポート以外の新機能が入るかもしれない
  • ICU (国際化) 拡張
    • IBM が開発している国際化用のライブラリ
  • OpenSSL で OpenID がサポートされる
  • 名前空間も?

PHP 4.4/5.1/5.2/6.0 のベンチマーク

  • php-5.x.x/Zend/bench.php を使用
  • PHP 5.2 が今のところ一番早い

セキュリティーについて

PHP 6.0 について

  • Unicode 対応
    • ICU 3.4 をエンジンとする
    • 内部的には UTF-16
    • echo strlen('日本語'); // -> 3
    • mbstring は不要になるか? (微妙な状況)
    • エンコードの検知の精度がまだ低い
  • レガシーコードの削除
    • register_globals
    • magic_quotes_*
    • safe_mode
    • zend.ze1_compatibility_mode
  • MySQLND (MySQL Native Driver)
    • libmysql の代替ライブラリ
    • PHP 5/6 をサポート (PHP 6.0 には標準バンドル。PHP 5.3 にも?)
    • MySQL 4.1 以上をサポート
  • 新しいガベージコレクタ

Namespace (名前空間)

2. 大規模サイトの構築・運用ノウハウ (仮題)

  • ウノウ、GREE の CTO 対談
  • サーバマシンは統一する
  • テーブルは JOIN しない

ウノウの場合

GREE の場合

  • スライド中に「GREE に入りたい」のサブリミナル効果
  • ページビュー、サーバ台数、ユーザ数など (非公開っぽいので省略)
  • フレームワークはもちろん Ethna
  • TEXT を外に出す

     +-----+----------+
     | UID | 名前     |
     +-----+----------+
     |  7  | すなおか |
     +-----+----------+
        ↑
        ↓
+----+-----+-------------+
| ID | UID | 内容 (TEXT) |
+----+-----+-------------+
|  1 |  7  | ほげほげ... |
+----+-----+-------------+

  • テーブル (DB) を分割する

                            +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
| UID | パーティション |    +----+-----+---------+
+-----+----------------+    |  1 |  7  | ...     |
|  7  |              1 | → +----+-----+---------+
+-----+----------------+
|  9  |              2 | → +----+-----+---------+
+-----+----------------+    | ID | UID | 内容    |
                            +----+-----+---------+
                            |  2 |  9  | ...     |
                            +----+-----+---------+

  • JOIN しない
  • 正規化がんばらない
  • 本番機への投入は rsync

3. PHP Framework Update

symfony

1590597869

  • 間もなく 1.1 のベータリリース

CakePHP

Piece Framework

  • ステートフルでセキュアな Web アプリケーションフレームワーク
  • 個別のライブラリだけを使用することもできる
  • Piece IDE のデモ (現在は Eclipse のプラグイン)
    • ウィザード式の画面がビジュアルに作成できる (楽しい)
    • 出力は YAML

Ethna

  • 今後の方向性
  • いろいろ直したいところとか

4. PHP at Yahoo!

Y! について

  • 13 億 3800 万ページビュー
  • 1960 万アクティブユーザ ID
  • 2007/08 現在 140 サービス

Y! と PHP の関係

  • PHP 界隈で有名な人が在籍
  • PHP のバグはまず Y! 社内にレポートされる (PHP に独自のパッチを当てているため)
  • 当初は FreeBSD 2.1 上の独自システムで構築
    • Web サーバ: Filo Server -> Apache (1996 年)
    • DB: フラットファイル -> MySQL (1998 年)
    • yScript -> PHP (2002 年)
  • Oracle も使うよ
  • FreeBSD、Apache、PHP には独自のパッチを当てている
  • C++ で書かれたライブラリを PHP 拡張から呼び出す
  • 日本ではフロントエンドはほとんどが PHP

なぜ PHP を採用したか

  • Web 用の言語
  • 高いパフォーマンス
  • 大きなコミュニティ
  • ライブラリが充実している、拡張性がある
  • ツールが豊富 (IDE、プロファイラ、デバッガ)
  • トレーニングコストが低い

現在の PHP

  • フレームワークはほとんど使っていない
    • HTML ページ: 5% PHP
    • ヘルパー (ヘッダ出力など): 50% PHP
    • ビジネスロジック: 100% PHP
    • コア: C/C++
  • PHP は最低限でビルド

$ ./configure --disable-all

  • 必要なモジュールは共有モジュールとしてインストール
    • 不必要な依存性を下げる
    • メモリの使用量を下げる
    • 再コンパイルが不要
    • しかし、Apache 起動時に若干のオーバーヘッドが

PHP 5 への移行について

  • 日本では 4.4 系がメイン
    • 2007 年末までに 5 系へ
    • 2008 年には 5.2 系へ移行する

セキュリティについて

  • 開発ルール・プラットフォームの整備による開発
  • Scanmus
    • Rasmus が開発した XSS 検出ツール
  • open_basedir を設定
  • allow_url_fopen = Off、allow_url_include = Off
    • 必要があれば libcurl を利用
  • safe_mode = Off
  • display_errors = Off
    • しかし log_errors = On でログには残す
  • error_reporting = E_ALL
  • ユーザからの入力値はフィルタリングする
  • PHP 5.2.0 からのフィルタ拡張を利用する
    • Y! から PHP コミュニティに還元した拡張
    • Y! 社内では PHP 4 でも利用できるように PHP 自体にパッチを当てている
  • CSRF 対策は Crumb (セッション追跡用の秘密情報) を利用

パフォーマンス

  • APC を利用 (Rasmus が携わっているため)
    • xdebug + WinCacheGrind・KCacheGrind
  • PHP 拡張の開発
    • C/C++ に PHP を埋め込んで利用することも (Web アプリではない)
  • セッションの利用を避ける
  • Cookie を利用して画面遷移に必要な情報は POST で (hidden) で埋め込む
  • r3 (テンプレート管理ツール) を開発
    • 日本語の解説がある (どこだろう?)
  • OSS のフレームワークのはあまり利用しない
    • 汎用的すぎてパフォーマンスに問題があるので
  • 実装はエンジニアに委ねる
    • プロダクトに特化した独自のフレームワークを利用している場合も
    • トップページ専用の CMS とか
  • Smarty はオーバーヘッドが Y! では無視できないので利用しない
  • symfony は使い始めた
    • Yahoo! Bookmarks
    • del.icio.us
    • Yahoo! Answers (Yahoo! 知恵袋)
    • いろいろカスタマイズしている
  • CakePHP
    • 検討中
    • ただし、利用実績も予定もなし

まとめ

  • 5 年ほど PHP を使っている
    • いろいろカスタマイズしている
  • PHP 拡張を多用している
  • OSS のフレームワークはあまり使っていない
    • symfony は使い始めた
  • IDE は使っていない
  • CVS を使っている

5. ライトニングトーク

  • 人が多すぎで 6F から 2F に移動

モバイル開発における PHP の利用方法と Tips

  • 資料
  • 携帯サイトと PC サイトの違い
  • PEAR Net_UserAgent_Mobile
  • 文字コード
    • sjis-win、eucjp-win を利用する
    • DB は cp932
  • 絵文字
  • Cookie は使えない

Usagi Project

  • OpenPNE 2.4系の派生プロジェクト
  • PHP ライセンス
  • いっしょに開発しませんか

PEAR DB_DataObject 開発ケーススタディ

  • DB をまたぐテーブルの結合をサポートした
  • テスト重要

PHP で画像処理をしてモテようかなと思って

PHP プログラマのための恋愛術

  • ふつうに恋愛論
  • PHP の話は出ない

code なにがしについて

  • 資料PDF
  • ググれといわれない場を
  • みんな優しい

ケータイキット for Smarty について

  • モバイルサイトに特化した Smarty
  • モバイルサイト開発の問題点を解消
  • 個人利用は無償

PHP でシェルを作る

  • /dev/null T シャツ
  • PHP で書かれた phsh を開発
    • もうじき公開? -> 公開されました
  • ログインシェルにもできる
  • eval で処理してるっぽい
  • シェルは偉大

6. スペシャルセッション

  • Piece IDE のデモのリベンジ
  • 基調講演の続き
    • 開発体制
    • ユーザ会など

以上、大雑把ですがまとめてみました。講師のみなさんありがとうございました。
懇親会にも出席していろいろな方と名刺交換・お話ができて充実した一日でした。

最後に戦利品です。

1. Yahoo! JAPAN さんに頂いたメモパッド

メモパッド

2. Asial さんに頂いた時計

時計

3. アイデアマンズさんに頂いた LED

LED

タグ: [PHP][MySQL][Solaris]

PHP の変数をトレースする HTTPTrace をちょっと改造してみた

comments(2) | trackback(1)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  HTTPTrace とは、Windows アプリケーションと連動して PHP の変数の内容を表示するツールです。
  以下のページにて配布されています。

- 過去と他人はかえられないが、未来と自分はかえられる - [PHP]値を調べたい時に外部に出力するツール(var_dumpするよか便利)
  http://d.hatena.ne.jp/magiwo/20070821

  HTTPTrace は print_r() や var_dump() と異なり、ブラウザなどの画面ではなく Windows アプリケーションに変数の内容を表示するのが特長です。
  面白そうなので少し試してみました。

  まず、HTTPTraceServer.exe を起動して [Start] を選択します。このアプリケーションが PHP から変数の内容を受け取る HTTP サーバになっているようです。

  次にサンプルプログラムを動かします。

// HTTPTrace ライブラリ
require_once 'htrace.php';

// HTTPTraceServer.exe を実行しているマシンの設定
htrace_set('192.168.1.100', 6006);

// 変数の内容を送信
htrace($_SERVER);


  これをブラウザで実行すると HTTPTraceServer.exe は以下のように表示されます。

  

  使い方はいたって簡単ですが、いくつか気づいた点があったので改造してみました。

1. allow_call_time_pass_reference = Off のとき警告がでる。

  php,ini などで allow_call_time_pass_reference が Off (デフォルトは On) の場合は、以下のように警告が表示されます。

Warning: Call-time pass-by-reference has been deprecated

  ソースを見ると fsockopen() の 第 3, 4 引数をリファレンスで渡しているのが原因で、これはリファレンスで渡す必要がないので、修正しました。

// 修正前
$fp = fsockopen($host, $port, &$err_num, &$err_msg, 1);

// 修正後
$fp = fsockopen($host, $port, $err_num, $err_msg, 1);

2. HTTPTraceServer.exe が起動していないとき警告がでる。

  当たり前といえば、当たり前ですが若干気になったのでエラー制御演算子 (@) で警告が出ないようにしました。

// 修正前
$fp = fsockopen($host, $port, $err_num, $err_msg, 1);

// 修正後
$fp = @fsockopen($host, $port, $err_num, $err_msg, 1);

3. ソースファイルのパスが UNIX 環境でうまく区切れていない

  HTTPTraceServer.exe は htrace() されたソースファイルをツリー上に表示してくれて非常に便利なのですが、UNIX 環境ではうまく表示されません。例えば以下のようにツリーではなく一行で表示されます。

%2Fhome%2Fhttpd%2Fpocari%2FHTTPTrace-0.1.0%2Fsample.php

  Windows 環境を想定しているのかパスの分解が \ (バックスラッシュ) になっていたので、DIRECTORY_SEPARATOR (PHP4 >= 4.0.7, PHP 5) を使って、これを修正しました。

// 修正前
$exp = explode('\\', $debug['file']);

// 修正後
$exp = explode(DIRECTORY_SEPARATOR, $debug['file']);


  これで無事にソースがツリー上に表示されるようになりました。

4. 何かしらの定数で htrace() を実行しないようにしたい

  具体的には USE_HTRACE という定数を実装して、これが false の場合は htrace() が無効になるようにしました。

// 修正前
function htrace($vars, $stop=false)
{
    $trace = debug_backtrace();
    $debug = array_shift($trace);
    $exp = explode('\\', $debug['file']);
    $key = '';
    foreach ($exp as $num=>$dt) {
        $key .= rawurlencode($dt).'/';
    }
    $key .= sprintf("%05d", $debug['line']);
    $inc = new HTTPTraceClient();
    $inc->ModeGlobal();
    $inc->SendValue($key, $vars, $stop);
}

function htrace_set($ip='localhost', $port=6006)
{
    $inc = new HTTPTraceClient();
    $inc->ModeGlobal(array('ip'=>$ip, 'port'=>$port));
}

// 修正後
if (!defined('USE_HTRACE')) {
    define('USE_HTRACE', true);
}

if (USE_HTRACE) {
    function htrace($vars, $stop=false)
    {
        $trace = debug_backtrace();
        $debug = array_shift($trace);
        $exp = explode(DIRECTORY_SEPARATOR, $debug['file']);
        $key = '';
        foreach ($exp as $num=>$dt) {
            $key .= rawurlencode($dt).'/';
        }
        $key .= sprintf("%05d", $debug['line']);
        $inc = new HTTPTraceClient();
        $inc->ModeGlobal();
        $inc->SendValue($key, $vars, $stop);
    }

    function htrace_set($ip='localhost', $port=6006)
    {
        $inc = new HTTPTraceClient();
        $inc->ModeGlobal(array('ip'=>$ip, 'port'=>$port));
    }
} else {
    function htrace() {}
    function htrace_set() {}
}


  これを利用することで、htrace.php を require/include する前に USE_HTRACE を false に設定すれば htrace() は何もしなくなって便利です。

// htrace を無効にする
define('USE_HTRACE', false);

require_once 'htrace.php';
htrace_set('192.168.1.100', 6006);

// なにもしない
htrace($_SERVER);


  以上のパッチを以下においておきます。

- HTTPTrace-0.1.0.diff
  http://pocari.org/tools/HTTPTrace/HTTPTrace-0.1.0.diff

  このような PHP のデバッグツールは大変ありがたいです。使いどころによっては大変威力を発揮するツールだと思います。

- 追記 (2007-08-31)
  上記パッチを適用していただきました。ありがとうございます。
  http://d.hatena.ne.jp/magiwo/20070830

タグ: [PHP]

phpMyAdmin のテーマを集めてみました

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  phpMyAdmin をお使いの人は知っていると思いますが、phpMyAdmin はテーマを変更することができます。
  複数の phpMyAdmin を使い分けているときに、テーマを変えておくことで誤操作を減らすことができます。

  テーマは、SourceForge の phpMyAdmin のプロジェクトからダウンロードできます。

- SourceForge.net: phpMyAdmin
  http://sourceforge.net/project/showfiles.php?group_id=23067

  ところが、テーマのサムネイルなど用意されていないので、どのようなテーマかダウンロードしてみるまでわかりません。

  そこで、上記ページからダウンロードできるテーマを集めて、サムネイルを作成してみました。

  まずは、バンドルされている 2 つのテーマから。

- original
  

- darkblue_orange
  

  次に、追加でダウンロードできるテーマです。

- aqua
  

- aqua_brushed
  

- arctic_ocean
  

- cactica_blues
  

- crimson_gray
  

- darkblue_gray
  

- dark_lime
  

- garv_blue
  

- green_orange
  

- grid
  

- openphpnuke
  

- original_small
  

- paradice
  

- pixeline
  

- silk
  

- very_small
  

- xampp
  

- xp_basic
  

- xp_blue
  

- xp_dirty
  

- xp_green
  

- xp_silver
  

タグ: [PHP][MySQL]

Ethna×PHP LL フレームワーク Books

comments(0) | trackback(0)

はてなブックマークに追加 はてなブックマーク数 del.icio.us に追加 livedoor クリップに追加 livedoor クリップ数 Yahoo!ブックマークに追加

  4774131393
  amazon.co.jp 詳細ページへ
  藤本 真樹/一井 崇/鶴岡 直也/新井 啓太 (著)
  技術評論社
  ISBN: 4774131393
  2007/6/27
  1,980 円

本書は PHP を利用した Web フレームワーク・Ethna (エスナ) の解説書です。
Web フレームワークとは何か,Ethna を使うために何が必要かなどの基礎知識からはじまり,
開発環境のインストールと設定,Ethna を利用した簡単な Web アプリケーションの作成までを一通り解説します。
Web プログラミングを勉強中の人,PHP による Web アプリケーション開発のスキルを向上させたい人にお勧めできる一冊です。

タグ: [Books][PHP]