Работа с инфраструктурой MVC и контроллером отображает страницу в деструкторе. Я загружаю файл через php, поэтому в конце действия скрипт должен заканчиваться.
Как закончить скрипт без вызова деструктора?
Есть ли лучшее решение?
exit и die вызовите деструктора.
Как сказал Дэвид: вам нужно вызвать exit () внутри деструктора, чтобы остановить его.
Если, однако, вы просто хотите остановить визуальный вывод, вызванный этими деструкторами, но не любые другие побочные эффекты (закрытие файлов, закрытие базы данных), они могут сделать, тогда лучше всего просто убить дальнейший вывод, но оставить только деструкторы. Который, по моему мнению, будет маршрутом, поскольку деструкторы, как правило, существуют по одной важной причине: очистка.
вы можете сделать это, манипулируя буферизированным выходом:
<?php class Tester{ public function devNull($string){ return ""; } public function runAndBreak(){ print "run" . PHP_EOL; // if any output buffer is working, flush it and close it if(ob_get_level()) ob_end_flush(); // redirect new buffer to our devNull ob_start(array($this,'devNull')); exit(); print "still running"; } function __destruct(){ print "destructor" . PHP_EOL; } } $t = new Tester(); $t->runAndBreak();
это приведет только к run
печати, а не к деструктору. Это делается путем предоставления вашей собственной процедуры обратного вызова ob_start, которая обрабатывает и затем возвращает результат. В нашем случае мы просто отбрасываем его, возвращая пустую строку.
См. Этот ответ . Попробуйте создать деструктор в классе, который загружает файл, который проверяет, действительно ли файл отправлен в браузер, и если это так, вызовите exit () в этом деструкторе.
Это, безусловно, остановит ваш скрипт, но будьте осторожны, если вы запустите такой сервер, где один процесс обслуживает несколько запросов PHP, это также остановится:
$pid = getmypid(); exec("kill $pid"); exec("TSKILL $pid");