首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有Quercus的Apache Commons VFS

带有Quercus的Apache Commons VFS
EN

Stack Overflow用户
提问于 2011-08-17 16:55:53
回答 1查看 581关注 0票数 3

在未修改的安装中,如何配置Quercus以使PHP文件函数使用Apache Commons VFS访问文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-26 06:43:57

这是一个相当大的发展!超出了这里的答案。总而言之,这里有两个主要的障碍需要克服:

  1. 使用VFS I/O而不是常规I/O在PHP语言中实现函数
  2. 使用上述函数替换标准文件函数(fopen/fread/fwrite/fclose)。

实现Quercus模块相当简单-您可以定义在php中可用的函数。该模块的主要工作是为虚拟文件系统提供接口。

代码语言:javascript
复制
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处理。)

模块编码完成后,作为健全性测试,编写一些php脚本来调用此模块中的自定义vfs函数。

由于您可以直接从PHP调用java (和vfs),因此您可以在没有模块的情况下,通过在PHP中编写等效的VFS调用来实现这一点。

代码语言:javascript
复制
$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中所述。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7090163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档