Есть ли гарантированный файловый ресурс на PHP? - PullRequest
0 голосов
/ 31 августа 2018

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

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

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

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

При входе в apache в Windows, error_log, а также В результате trigger_error возникает ошибка apache на передней панели сообщение. Это плохо, если все, что вы хотите сделать, это записать информацию. тем не мение Вы можете просто войти в 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().

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

0 голосов
/ 31 августа 2018

php://memory должен быть универсально доступен.

...