3

未変更のインストールで、PHP ファイル関数が Apache Commons VFS を使用してファイルにアクセスするように Quercus を構成するにはどうすればよいですか?

4

1 に答える 1

2

かなりの進化です!ここでの答えは以上です。概説すると、ここで克服すべき主な障害が 2 つあります。

  1. 通常の I/O ではなく VFS I/O を使用する関数を PHP に実装する
  2. 標準ファイル関数 (fopen/fread/fwrite/fclose) を上記の関数に置き換えます。

Quercus モジュールの実装は非常に簡単です。php で使用できるように関数を定義します。モジュールの主な作業は、VFS へのインターフェースを提供することです。

class VFSModule extends AbstractQuercusModule
{

    FileSystemManager fsManager = VFS.getManager();

    public Object vfs_fopen(String filename, String mode) {            
        FileObject file =  fsManager.resolveFile(filename);
        if (mode.equals("r"))
            return file.getContent().getInputStream();
        else if (mode.equals("w"))
            return file.getContent().getOutputStream();
        throw new IllegalArgumentException("unsupported mode; "+mode);                
    }

    function String vfs_fread(Object stream, int length) {
        InputStream in = (InputStream)stream;
        byte[] buffer = new byte[length];
        int read = in.read(buffer);
        // todo - handle smaller than length reads
        return buffer;
    }

    function void vfs_fwrite(Object stream, int length, byte[] data) {
        OutputStream out = (OutputStream)stream;
        out.write(data);
    }

} 

(煩雑さを避けるため、IOException の処理は省略されています。)

モジュールをコーディングしたら、サニティ テストとして、このモジュールからカスタム vfs 関数を呼び出す php スクリプトを記述します。

Java (および vfs) を PHP から直接呼び出すことができるため、PHP で同等の VFS 呼び出しをコーディングすることにより、モジュールなしでこれを行うことができます。

$mgr = org.apache.commons.vfs2.VFS.getManager();

function vfs_open($filename, $mode) {
   if ($mode=="r") {
      return $mgr->resolveFile($filename)->content->getInputStream();
   }
   else if ($mode=="w") {
      return $mgr->resolveFile($filename)->content->getOutputStream();
   }
  // todo - handle other mode combinations
}
function vfs_read($resource, $length) {
   $buf = str_repeat(" ", 1024);
   $lenRead = $resource->read($buf, 0, 1024);
   if ($lenRead<0) return "";
   return substr($buf, 0, $lenRead);
}

次の部分では、これらの関数を標準の php ファイル関数にマッピングします。これは、組み込み php 関数の再定義で説明されているように、いくつかの方法で実行できます。

于 2011-08-25T22:43:57.450 に答える