Есть ли какой-нибудь 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. я знаю это ресурсы не являются официальными типами, но все же хочу быть максимально безопасным для типов.
php://memory
должен быть общедоступным.
Если вам нужен поток для записи ошибок, почему вы не пишете в 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()
функция.
Не уверен, что это полностью отвечает на ваш вопрос, но ведет ли вас в правильном направлении?