Я знаю, что по самому своему определению фатальное исключение должно убить выполнение и не должно подавляться, но вот в чем проблема.
Я запускаю сценарий, который очищает, анализирует и сохраняет в БД около 10 000 страниц. Это занимает пару часов, а в редких случаях (1 из 1000) страница не проходит синтаксический анализ и выдает фатальное исключение.
В настоящее время я делаю следующее:
for ($i=0;$i<$count;$i++)
{
$classObject = $classObjects[$i];
echo $i . " : " . memory_get_usage(true) . "\n";
$classDOM = $scraper->scrapeClassInfo($classObject,$termMap,$subjectMap);
$class = $parser->parseClassInfo($classDOM);
$dbmanager->storeClassInfo($class);
unset($classDOM,$class,$classObject);
}
Могу я сделать что-нибудь вроде
for ($i=0;$i<$count;$i++)
{
$classObject = $classObjects[$i];
echo $i . " : " . memory_get_usage(true) . "\n";
try
{
$classDOM = $scraper->scrapeClassInfo($classObject,$termMap,$subjectMap);
$class = $parser->parseClassInfo($classDOM);
$dbmanager->storeClassInfo($class);
unset($classDOM,$class,$classObject);
}
catch (Exception $e)
{
//log the error here
continue;
}
}
Приведенный выше код не работает для фатальных исключений
.
Можно ли сделать что-то вроде этого:
Если я переместил основной цикл в метод, а затем вызвал метод из register_shutdown_function
?
Примерно так:
function do($start)
{
for($i=$start;$i<$count;$i++)
{
//do stuff here
}
}
register_shutdown_function('shutdown');
function shutdown()
{
do();
}
Это сообщение выводится, когда выполнение останавливается:
Fatal error: Call to a member function find() on a non-object in ...
Я ожидаю, что это сообщение выше, когда страница не может быть проанализирована с помощью метода, который я использую. Я не против просто пропустить эту страницу и перейти к следующей итерации цикла.