Я написал PHP шаблонизатор для разбора текста в действительный код php перед выполнением. В настоящее время я храню этот файл в памяти eval()
после разбора в действительный код php. После исследования больше о пороках использования eval()
с пользовательским вводом я нашел более разумным записать проанализированный контент в файл, а затем include
файл. я использую tmpfile()
Функция для этого. До сих пор это не работает, кроме того, я не знаю, где этот временный файл создан, и я не хотел бы, чтобы мой парсер шаблонов слонялся в любом случае в файловой системе пользователя. Я хотел бы, чтобы этот временный файл был создан в том же каталоге, в котором находится класс анализатора шаблонов.
Теперь проблема в том, tmpfile()
не принимает никаких параметров, как показано здесь http://php.net/manual/en/function.tmpfile.php .
Ниже приведен мой класс анализатора шаблонов
<?php
class TemplateParser {
//this method renders template file
public function render($file_path)
{
#...code to compile contents
//create temporary file and store handle
$file_handler = tmpfile();
//write contents to tmpfile()
fwrite($file_handler,$compiled_template_file_contents);
//close opened file
fclose($file_handler);
//include the file into the current script
include $file_handler; //this doesn't work, now what works?? coz this is not a valid filepath but a resource
}
}
Мне нужно знать путь к файлу, потому что я хочу быть уверенным, что я не оставляю мусор даже в случае фатальной ошибки или остановленного процесса с помощью вызова unlink($tmp_file_path)
Любые идеи о том, как определить каталог для tmpfile()
только во время выполнения этого скрипта? Буду признательна.
tmpfile()
Функция создает файл в системе TMP
реж. Где это вы можете получить с sys_get_temp_dir()
,
Еще немного контроля дает вам tempnam()
, Но не забывайте убирать за собой.
Если вы используете tmpfile()
Вам не нужно удалять файл вручную. Согласно документации:
Файл автоматически удаляется при закрытии (например, путем вызова
fclose()
или когда нет оставшихся ссылок на дескриптор файла, возвращаемыйtmpfile()
) или когда сценарий заканчивается.
к include
содержимое файла вы можете попробовать следующее:
$filename = tempnam(sys_get_temp_dir());
// create content with fopen(), fwrite(), fclose()
include $filename;
unlink($filename);
Я бы предложил вместо этого использовать некоторые современные библиотеки шаблонов, такие как всезнайка или же прут
Других решений пока нет …