2011-08-17 18 views
3

変更を加えないで、PHPファイル関数がApache Commons VFSを使ってファイルにアクセスするようにQuercusを設定するにはどうすればよいですか?Apache Commons VFS with Quercus

答えて

2

これはかなりの開発です!ここに答えに収まる以上のもの。 (fopenを/関数fread/fwriteの/ fcloseの標準ファイル関数を置き換えるVFS I/Oを使用してPHPの関数ではなく、通常のI/O

  • を実装

    1. :概要では、ここに克服するには、2つの主要な障害があります)を上記の関数で置き換えます。

    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スクリプトを書きます。

    PHPからjava(およびvfs)を直接呼び出すことができるので、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ファイル関数にマッピングしています。これは、redefine buit-in php functionsに記載されているように、いくつかの方法で行うことができます。

  • +0

    私がQuercusの関数を置き換えることができるかどうかはわかりませんが、試してみます。非常に詳細な答え、ありがとう! – Bogdacutu

    +0

    @mdmaは、Javaコードの正確な上記スニペットですか?それはjavaのために無効な 'function'を使用していくつかの斑点を持っています。 –

    +0

    正確 - それが何を意味しているかわかりませんが、完全ではなく、むしろデザインの概要です。 – mdma

    関連する問題