Есть ли гарантированный файловый ресурс на PHP?

Есть ли какой-нибудь URL/поток, который fopen будет успешно открываться на большинстве установок PHP? /dev/null недоступен или не открывается в некоторых системах. Что-то вроде php://temp должно быть довольно надежной ставкой, верно?

Приложение для этого кода, которое гарантирует ресурс файла, вместо смешанного типа файла bool|resource, который у вас есть с fopen:

/**
 * @return resource
 */
function openFileWithResourceGuarantee() {
    $fh = @fopen('/write/protected/location.txt', 'w');
    if ( $fh === false ) {
        error_log('Could not open /write/protected/location.txt');
        $fh = fopen('php://temp');
    }
    return $fh;
}

В PHP 7 со строгими типами вышеприведенная функция должна гарантировать ресурс и избегать логических значений. Я знаю, что ресурсы не являются официальными типами, но все же хочу быть максимально безопасным для типов.


person chiborg    schedule 31.08.2018    source источник
comment
php://temp должно работать нормально, но может быть не лучшим местом для фактического ведения журнала, поскольку оно предназначено для временного хранения. На самом деле он вообще не затронет файловую систему, если вы не напишете больше определенного предела памяти (по умолчанию 2 МБ), поэтому он будет потерян, как только скрипт завершит работу. tmpfile может быть другим вариантом.   -  person iainn    schedule 31.08.2018
comment
Взгляните на sys_get_temp_dir, который должен работать почти во всех ОС, использующих PHP: secure.php.net/manual/en/function.sys-get-temp-dir.php   -  person Loek    schedule 31.08.2018
comment
Если целью здесь является регистрация ошибок, то почему бы не использовать php.net/manual/ en/function.error-log.php для начала? При message_type=0 уже используются локальные настройки относительно того, где должны учитываться ошибки.   -  person misorude    schedule 31.08.2018
comment
Если это поможет   -  person AymDev    schedule 31.08.2018
comment
Комментарий Do some error logging here просто указывает, что я хочу получить какой-то сигнал о том, что открытие файла не удалось. Я отредактирую пример.   -  person chiborg    schedule 31.08.2018
comment
@chiborg Я все еще не очень понимаю, извините. Почему вам нужен указатель файла в случайном месте? Чтение из него или запись в него не служат никакой цели, так почему бы просто не бросить исключение (или return/break/и т. д.), и ваш код может продолжаться откуда-то еще?   -  person iainn    schedule 31.08.2018


Ответы (2)


php://memory должен быть общедоступен.

person weirdan    schedule 31.08.2018

Если вам нужен поток для записи ошибок в почему вы не пишете в php://stderr?

Пример из документов:

При входе в apache в Windows как error_log, так и trigger_error приводят к тому, что в начале сообщения отображается состояние apache error. Это плохо, если все, что вы хотите сделать, это регистрировать информацию. Однако вы можете просто войти в stderr, однако вам придется выполнить сборку всех сообщений:

LogToApache($Message) {
        $stderr = fopen('php://stderr', 'w'); 
        fwrite($stderr,$Message); 
        fclose($stderr); 
}

Примечание. php://stderr иногда совпадает с php://stdout, но не всегда.

Для потоков см.: http://php.net/manual/en/wrappers.php.php

Что-то вроде php://temp должно быть довольно безопасной ставкой, верно?

Как уже указывал @weirdan, php://memory, вероятно, безопаснее, поскольку ему даже не нужно создавать какой-либо файл. ДОЛЖЕН быть возможен доступ к памяти. Из документов:

php://memory и php://temp — это потоки чтения-записи, которые позволяют хранить временные данные в файловой оболочке. Единственная разница между ними заключается в том, что php://memory всегда будет хранить свои данные в памяти, тогда как php://temp будет использовать временный файл, как только объем хранимых данных достигнет предопределенного предела (по умолчанию 2 МБ). Местоположение этого временного файла определяется так же, как и функция sys_get_temp_dir().

Не уверен, что это полностью отвечает на ваш вопрос, но ведет ли оно вас в правильном направлении?

person Blackbam    schedule 31.08.2018