Is writable: примеры (PHP)

Полное руководство по функции is_writable в PHP
Раздел: Работа с файловой системой
is_writable(string $filename): bool

Функция is_writable() проверяет, доступен ли файл или директория для записи.

Назначение и использование

Функция используется для проверки прав перед операциями записи, такими как file_put_contents(), fwrite() или mkdir(). Это помогает избежать ошибок в работе скрипта.

Аргументы функции

Функция принимает один обязательный аргумент:

  • filename (string) - Путь к проверяемому файлу или директории.

Возвращает true, если файл существует и доступен для записи, иначе false.

Базовые примеры использования
Проверка файла
<?php
$file = 'test.txt';
if (is_writable($file)) {
    echo "В файл можно записать данные.";
} else {
    echo "Файл недоступен для записи.";
}
?>
Файл недоступен для записи.
Проверка директории
<?php
$dir = '/path/to/directory';
var_dump(is_writable($dir));
?>
bool(false)
Использование с абсолютным путем
<?php
$file = __DIR__ . '/config.ini';
echo is_writable($file) ? 'Да' : 'Нет';
?>
Нет
Похожие функции в PHP
fopen() с режимом 'w' или 'a'

Попытка открыть файл на запись. Если файл не доступен для записи, функция вернет false. Это более ресурсоемкий способ проверки.

Проверяет только существование файла или директории, но не права доступа. Часто используется в паре с is_writable().

Проверяет доступность файла или директории для чтения. Логический аналог для операции чтения.

Когда что использовать

is_writable() применяют для предварительной проверки перед записью. fopen() с обработкой ошибок подходит, если следующей операцией будет запись через дескриптор. file_exists() нужна для проверки существования, но не заменяет проверку прав.

Типичные ошибки
Проверка несуществующего файла

Функция вернет false для несуществующего файла, что можно спутать с отсутствием прав.

<?php
var_dump(is_writable('missing_file.txt'));
?>
bool(false)
Игнорирование владельца и группы на Linux/Unix

Важен не только флаг записи для 'others', но и владелец процесса PHP (часто www-data).

Кэширование результатов

PHP может кэшировать информацию о файле. При изменении прав во время выполнения скрипта результат может быть устаревшим. Помогает clearstatcache().

<?php
$file = 'test.txt';
var_dump(is_writable($file)); // false
// Предположим, права изменились внешним процессом
clearstatcache(true, $file);
var_dump(is_writable($file)); // может стать true
?>
Изменения в версиях PHP

Функция is_writable() остается стабильной. В PHP 8.0 не было изменений в поведении этой функции. Основные принципы работы сохранены с ранних версий.

Расширенные примеры
Проверка перед созданием файла
Пример php
<?php
$dir = 'uploads/';
$filename = $dir . 'report.pdf';
if (!is_writable($dir)) {
    die('Директория не доступна для записи.');
}
file_put_contents($filename, 'data');
echo 'Файл создан.';
?>
Рекурсивная проверка директории
Пример php
<?php
function isDirWritableRecursive($dir) {
    if (!is_writable($dir)) return false;
    foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)) as $file) {
        if ($file->isFile() && !$file->isWritable()) {
            return false;
        }
    }
    return true;
}
var_dump(isDirWritableRecursive('project/'));
?>
bool(true)
Проверка через SSH или удаленно

Прямая проверка невозможна. Используют обертку или проверяют возвращаемые ошибки от функций FTP/SFTP.

Символические ссылки

Функция проверяет сам файл, на который ведет ссылка, а не саму ссылку.

Пример php
<?php
// Предположим, link.txt -> target.txt
symlink('target.txt', 'link.txt');
// Проверяет target.txt
var_dump(is_writable('link.txt'));
?>
Сравнение с Windows и Unix системами

На Windows результат зависит от ACL. На Unix-системах учитываются права пользователя, под которым работает PHP.

Аналоги в других языках

Is writable в Python

Используют модуль os и функцию os.access() с флагом os.W_OK.

import os
print(os.access('test.txt', os.W_OK))
False
JavaScript (Node.js)

В Node.js применяют методы модуля fs, например fs.accessSync() с константой fs.constants.W_OK.

const fs = require('fs');
try {
  fs.accessSync('test.txt', fs.constants.W_OK);
  console.log('Доступен');
} catch {
  console.log('Не доступен');
}
Не доступен

Is writable в MySQL

Прямого аналога нет. Привилегии проверяются через запросы к системным таблицам, например FILE привилегия для LOAD DATA.

PHP is_writable function comments

En
Is writable Tells whether the filename is writable