PHPでアップローダーを作るときに、プログレスバーをどうにか実装できるか調べたら、どうやらできるっぽかったので試してみた。
ちなみにできると言っても制約がいくつかあるみたい。まず第一に、 PHP 単体ではファイルのアップロード状況を把握したりすることはできない。そのため PECL APC エクステンションをインストールする必要がある。
また PHP のバージョンは 5.2 以上。 PECL APC エクステンションのバージョンは 3.0.13 以上。
そのため、うちの CentOS5 も FC6 もパッケージでは対応できなかった。
環境は以下の通り。
php-5.2.5
PECL APC-3.0.16
※追記
実はこの APC はスレッドセーフじゃないらしく、一つのアップロードが完了する前に次のアップロードが開始されると、現在進行中のキャッシュがクリアされるらしいので注意。
Apache と PHP はインストールされてるものとして、 APC エクステンションを追加する。
まず最新の APC エクステンションを以下から取得する。
PECL :: Package :: APC
次に以下のコマンドを実行してインストールする。
ただし、ここで apache の apxs のパスは /usr/sbin/apxs 、php-config のへパスは /usr/bin/php-config とする。
また、 php-devel パッケージがインストールされて無い場合はインストールする必要がある。
$ phpize $ ./configure --enable-apc-mmap --with-apxs=/usr/sbin/apxs --with-php-config=/usr/bin/php-config $ make # make install
次に、 /etc/php.ini なり /etc/php.d/apc.ini なりを設定して APC を有効にする。
# vi /etc/php.ini
extension_dir = "/home/www/php/lib/php/extensions/no-debug-non-zts-20060613/" extension=apc.so apc.enabled=1 apc.shm_segments=1 apc.shm_size=128 apc.ttl=7200 apc.user_ttl=7200 apc.num_files_hint=1024 apc.mmap_file_mask=/tmp/apc.XXXXXX apc.enable_cli=1 apc.apc.rfc1867=1
これで apache を再起動すれば APC が有効になるはず。
次に実際の php のコーディング。とりあえずどんなコードを書けば情報が取得できるかだけ書いておく。
まず form を含んだ HTML を作成する。まずコードから。
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="hidden" name="APC_UPLOAD_PROGRESS" value="abcdefg" /> <input type="file" name="upload_file" /> <input type="submit" /> </form>
ここで重要なのは hidden で指定した APC_UPLOAD_PROGRESS 。ここに指定した value の値がサーバ上でファイルのアップロードの進捗状態を知るためのキーになる。このサンプルコードでは abcdefg をとりあえず指定してあるが、実際はランダム文字列を生成して設定するなどする。
次に PHP 。
$status = apc_fetch('upload_abcdefg'); var_dump($status);
この apc_fetch() っていう関数が PHP の Cache を確認するものらしい。
ここで指定した upload_ という suffix は upload 用の特別な値で、この値は php.ini で変更することもできる。
実際にこのようなコードを実行すると、現在進行中の upload 状況が確認できるはず。
あとは色々な方法でプログレスバーを作成すればいい。
実際のコードは気が向いたら作るけど、最近は .NET にはまってるので作らないかもしれない。