我做了一个像守护进程的守护进程。
该守护进程将在所有模块页面中搜索名为“modulename.cron.php”的文件,并通过eval()
执行它们。
我的问题是,如果发生一些错误,我不会停止守护进程。 (如果状态=='错误',我已经有一个看门狗重启守护进程,每次客户端请求某个页面时,我的CMS / CMF都会触发监视程序)
为什么我不这样做?
防止破解尝试,更快地纠正错误,我不想制作插件,当发生错误时,它会向我发送电子邮件
抱歉我的英文不好
修改
此网站使用eval()
来运行您的代码,尝试它并且您将了解它的工作原理,我只是不知道如何:
http://writecodeonline.com/php/
我已经尝试了@eval($code) OR error_handler_function_here($code)
但它不起作用!
答案 0 :(得分:2)
来自eval
documentation
无法捕获解析 使用eval()时出错 的set_error_han dler()
在同一页面的评论中有一个关于“防弹”评估的建议。看看http://www.php.net/manual/en/function.eval.php#103360。
答案 1 :(得分:0)
解决“打破程序”问题并不困难。
首先将代码作为测试运行...即
$file='/tmp/'.rand(0,99999);
/*private eyes*/
touch($file);
chmod($file,600);
/*save to a temp file*/
$fp=fopen($file,'w');
fwrite($fp,'<?php eval("'.str_replace('"',"\\\"",$code).'");?>');
fclose($fp);
/* redirect stderr to stdout and execute */
$result=`php -q $file 2>&1`;
unlink($file);
if (stristr($result,'fatal')) {
/* no breaky */
echo 'If I run that code it may will maybe possibly definitely cause me to break.';
} else {
/* ok, probably */
echo eval($code);
}
(但你可能不应该从非本地用户向eval()提供代码,除非你骑的方式。)
答案 2 :(得分:-1)
可以通过try / catch捕获eval()的致命错误-(至少)在php 7.x上可以正常工作,但我没有在较早的版本上对其进行过测试。
try {
eval($code);
} catch (Throwable $error) {
// do some stuff with the Throwable, contains also fatal errors like
// ParseError: syntax error, unexpected end of file etc.
}
问候