Пропускане на файл с грешки

Msecurity

Registered
Здравейте колеги,
има ли възможност при инклудване на файл, тои ако съдържа някаква грешка при изпълнението да не се инклудва, и всичко да продължи да си работи след него?
Примерно си индклудвам файл с функция за галерия, но има грешка в нея ... и вместо да дъни Fatal error .. и т.н, просто дане го инклудва, а всичко друго да си продължи да работи без галерията?
 
include() не предизвиква фатална грешка, а само предупреждение.
Всичко след include продължава да се изпълнява. За да продължи да работи всичко останало трябва да знаеш кои файлове не са се заредили - можеш да записваш резултата от всеки include. След това на всяко място на което използваш класове, функции или променливи от инклуднат файл първо проверяваш резултата от include - ако е false не изпълняваш кода.
Имай предвид обаче, че ако има синтактичнa грешкa в инклудвания файл, това ще спре изпълнението и на скрипта който извиква include
 
Msecurity каза:
Здравейте колеги,
има ли възможност при инклудване на файл, тои ако съдържа някаква грешка при изпълнението да не се инклудва, и всичко да продължи да си работи след него?
Примерно си индклудвам файл с функция за галерия, но има грешка в нея ... и вместо да дъни Fatal error .. и т.н, просто дане го инклудва, а всичко друго да си продължи да работи без галерията?

Няма как да стане, или поне не можеш да покриеш всички случаи - ти искаш да се върнеш назад във времето.
Един print в инклуднатия файл и грешка след него как ще възстановиш? Можеш да буферираш outputа преди инклуда и да изпразниш буфера след това, но така е твърде hacky.
Друго - какво правиш с дефинираните класове и функции? Ще ги un-дефинираш ли? Ако използваш функции от инклуднатия файл, които поради по-ранна грешка са недефинирани, цялото изпълнение ще гръмне така или иначе.
 
Зависи какви грешки. Например може така:

PHP:
try {
    require 'file-with-parse-error.php';
} catch (ParseError $e) {
    echo $e->getMessage(), "\n";
}
(от тук)

Можеш направо Throwable да прихващаш.

Ако искаш също да няма и Warnings (например Division by zero), погледни set_error_handler и хвърляй Exception вътре.

Но като цяло това цялото занимание не звучи хубаво. Може би има друг начин? :)
 
Тук има едно доста добро решение на казуса, като проверка на кода във файла:

https://www.tehplayground.com/026v6OSCW8y1eakr

PHP:
$fileName = '/path/to/file.php';
exec("php -l {$fileName}", $output, $return);

if ($return === 0) {
    // Correct syntax
} else {
    // Syntax errors
}
 
Да не знаеш какъв файл include-ваш си е чист пробив в сигурността... и въпреки това има начин, казва се eval().
 

Горе