PUT メソッドのサポート

PHP 3 と PHP 4 の間で PUT メソッドのサポートが変更されました。 PHP 4 では、HTTP PUT のコンテンツを読み込むためには 標準の入力ストリームを使用すべきです。

例 38-5. PHP 4 で HTTP PUT ファイルを保存する

<?php
/* PUT データが標準入力ストリームから入ってくる */
$putdata = fopen("php://stdin","r");

/* 書き込み先ファイルをオープン */
$fp = fopen("myputfile.ext","w");

/* 1kb毎に読み込んでファイルに書き込む */
while ($data = fread($putdata,1024))
  
fwrite($fp,$data);

/* ストリームを閉じる */
fclose($fp);
fclose($putdata);
?>

注意: 以下の全てのドキュメントは PHP 3 にのみ適用されます。

PHP は、Netscape Composer や W3C Amaya のようなクライアントを使用した場合の HTTP PUT メソッドのサポートを提供します。 PUT リクエストはファイルアップロードよりもシンプルであり、 次のような形になります。

PUT /path/filename.html HTTP/1.1

これは、通常、リモートクライアントが /path/filename.html が指す内容を Web ツリーに保存したいことを意味します。 Apache または PHP に おいて全ての人が Web ツリー上の任意のファイルを自動的に上書きできる ようにするというのは明らかに良い発想ではありません。よって、このような りクエストを処理する際には、まずそのリクエストを処理する特定の PHP スクリプトが必要なことを web サーバに通知する必要があります。 Apache においては、Script ディレクティブにより これを行うことができます。これは、Apache 設定ファイルのほぼ任意の 場所に置くことができます。一般的なのは、<Directory> ブロック または <Virtualhost> ブロックの中です。次のように指定します。

Script PUT /put.php

これにより、この行を指定したコンテキストにマッチする URI を有する すべての PUT リクエストが put.php スクリプトに送られるよう Apache に 指定します。 もちろん、拡張子 .php により PHP が実行されるよう設定され、 PHP がアクティブであることが必要です。

put.php ファイルの中で次のように処理を行う必要があります。

<?php copy($PHP_UPLOADED_FILE_NAME,$DOCUMENT_ROOT.$REQUEST_URI); ?>

これは、リモートクライアントによりリクエストされた位置にファイルを コピーします。このファイルコピーを実行する前に何らかの確認やユーザの 認証を実行することが望ましいでしょう。上記のスクリプトでは、PHP が PUT メソッドのリクエストを受けた際に POST メソッド と全く同様にテンポラリファイルにアップロードされたファイルを保存すると いうことを利用しています。リクエストが終了した際に、テンポラリファイルは 削除されます。よって、PUT を処理する PHP スクリプトは、この ファイルをどこかにコピーする必要があります。このテンポラリファイルの ファイル名は $PHP_PUT_FILENAME 変数に保持されており、 $REQUEST_URI(Apache 以外の Web サーバでは変わる可能性があります) で指定された送信先ファイル名を得ることができます。送信先ファイル名は、 リモートクライアントが指定したものです。このクライアントの指定を 必ずしも受ける必要はありません。例えば、アップロードされた全ての ファイルを特別なアップロード用ディレクトリにコピーすることも可能です。