To manage files and directories within a domain, use the pm_FileManager class. This class lets you create and remove files and directories, check for existence of files and directories, read and write data to files, and also change file and directory permissions (only on Linux).

Note: For security considerations, we strongly recommend that you do not use system calls such as fopen or file_get_contents in the code of your extension. When you use such calls, the extension works with files on behalf of the psaadm user. In turn, if you use the pm_FileManager class, the manipulations are performed on behalf of the domain owner’s system user.

Descriptions and usage examples for some of the methods can be found below.

scanDir() - returns a list of files and directories inside the specified path.

Usage

array scanDir(string $path [, bool $skipDots = false [, bool $showSystemFiles = true ]])

Parameters

  • path (type: string)

    The directory that will be scanned.

  • skipDots (type: boolean, default value: false)

    If the optional parameter skipDots is set to “true”, then the root directories “..” and “.” will be excluded from the resulting array, otherwise they will be included.

  • showSystemFiles (type: boolean, default value: true)

    If the optional parameter showSystemFiles is set to “true”, then hidden files (for example, system files) will be included in resulting array, otherwise they will be absent.

Return Values

Returns an array containing the files and directories in the directory.

Examples

Directory tree

$ ls -a var
.  ..  config.json  .gitkeep

Example

$result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir()); // Default use
// analogue:
// $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), false, true);
var_dump($result);

Output

array(4) {
  [0]=>
  string(1) "."
  [1]=>
  string(2) ".."
  [2]=>
  string(11) "config.json"
  [3]=>
  string(8) ".gitkeep"
}

Example

$result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), true);
// analogue:
// $result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), true, true);
var_dump($result);

Output

array(2) {
  [0]=>
  string(11) "config.json"
  [1]=>
  string(8) ".gitkeep"
}

Example

$result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), false, false);
var_dump($result);

Output

array(3) {
  [0]=>
  string(1) "."
  [1]=>
  string(2) ".."
  [2]=>
  string(11) "config.json"
}

Example

$result = (new \pm_FileManager())->scanDir(\pm_Context::getVarDir(), true, false);
var_dump($result);

Output

array(1) {
  [0]=>
  string(11) "config.json"
}

joinPath() - returns joined path parts.

Usage

string joinPath(string ...$pathParts)

Parameters

  • pathParts (type: string, one or more variables can be specified)

Return Values

A string containing a string representation of all specified path parts arranged in the same order, with a DIRECTORY_SEPARATOR between each path part.

Example

$result = (new \pm_FileManager())->joinPath('var', 'config', 'config.json');
var_dump($result);

Output

string(22) "var/config/config.json"

isSubpath() - checks if a path is a subpath of the webspace root directory.

Usage

bool isSubpath(string $path)

Parameters

  • path (type: string)

Return Values

“True” if the path is inside the base directory, “false” otherwise.

Examples

Example

$result = (new \pm_FileManager())->isSubpath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
var_dump($result);

Output

bool(true)

Example

// assuming that the webspace document root is '/var/www/vhosts/a.a/'
$result1 = (new \pm_FileManager(1))->isSubpath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
$result2 = (new \pm_FileManager(1))->isSubpath('/var/www/vhosts/b.b/httpdocs/qwe/qwe/ddd/wqecfds');
var_dump($result1);
var_dump($result2);

Output

bool(true)
bool(false)

getRelativeFilePath() - returns a relative path inside the webspace root directory for the specified absolute path.

Usage

string getRelativeFilePath(string $path)

Parameters

  • path (type: string, an absolute path)

Return Values

A relative path inside the base directory.

Examples

Example

$result = (new \pm_FileManager())->getRelativeFilePath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
var_dump($result);

Output

string(47) "var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds"

Example

// assuming that webspace document root is '/var/www/vhosts/a.a/'
$result1 = (new \pm_FileManager(1))->getRelativeFilePath('/var/www/vhosts/a.a/httpdocs/qwe/qwe/ddd/wqecfds');
$result2 = (new \pm_FileManager(1))->getRelativeFilePath('/var/www/vhosts/b.b/httpdocs/qwe/qwe/ddd/wqecfds');
var_dump($result1);
var_dump($result2);

Output

string(28) "httpdocs/qwe/qwe/ddd/wqecfds"
string(35) "../b.b/httpdocs/qwe/qwe/ddd/wqecfds"

copyFile() - copies file system objects (files and directories) from the source to the destination. Directories are copied recursively.

Usage

copyFile(string $source, string $destination)

Parameters

  • source (type: string, the full path to the source)
  • destination (type: string, the full path to the destination)

Example

(new \pm_FileManager())->copyFile('/tmp/source', '/tmp/destination');

Below is an example of working with domain files. In this example, some manipulations are applied to a file content. The following methods are used:

Use the following code:

$fileManager = new pm_FileManager($domainId);
$filePath = $fileManager->getFilePath("$currentDir/$file");
if ($fileManager->fileExists($filePath)) {
    $fileData = $fileManager->fileGetContents($filePath);
    // Some manipulation with file data...
    $fileData = str_replace('foo', 'bar', $fileData);

    $fileManager->filePutContents($filePath, $fileData);
}

The $filePath path here is an absolute path. It is formed from the relative path within the domain directory $currentDir by the call of the getFilePath() method.