Apache Commons VFS с Quercus - PullRequest
       38

Apache Commons VFS с Quercus

3 голосов
/ 17 августа 2011

При неизмененной установке, как я могу настроить Quercus, чтобы файловые функции PHP использовали Apache Commons VFS для доступа к файлам?

1 Ответ

2 голосов
/ 26 августа 2011

Это совсем немного развития! Больше, чем может уместиться в ответе здесь. В общих чертах, здесь необходимо преодолеть два основных препятствия:

  1. реализация функций в PHP, которые используют ввод-вывод VFS вместо обычного ввода-вывода
  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 исключена, чтобы избежать беспорядка.)

Как только модуль закодирован, в качестве теста работоспособности напишите некоторый php-скрипт, который вызывает пользовательские функции vfs из этого модуля.

Поскольку вы можете вызывать java (и vfs) напрямую из PHP, вы можете сделать это без модуля, кодируя эквивалентные вызовы VFS в PHP.

$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 .

...