1

我做了一个守护进程,就像一个cron。

该守护进程将在所有模块页面中搜索名为“modulename.cron.php”的文件并通过eval().

我的问题是,如果发生一些错误,我不想停止守护进程。(如果状态=='错误',我已经有一个看门狗重新启动守护程序,并且每次客户端请求某个页面时都会在我的 CMS/CMF 上触发看门狗)

为什么我不要这个?
防止黑客尝试,更快地纠正错误,而且我不想制作一个插件,当错误发生时,它会向我发送一封电子邮件

对不起,我的英语不好

编辑:

该站点用于eval()运行您的代码,尝试一下,您就会明白它可以工作,我只是不知道如何:

http://writecodeonline.com/php/

我已经尝试过了@eval($code) OR error_handler_function_here($code),但它不起作用!

4

3 回答 3

2

eval 文档

使用 set_error_handler() 无法在 eval() 中捕获解析错误

在同一页面的评论中有一个“防弹”评估的建议。看看http://www.php.net/manual/en/function.eval.php#103360

于 2011-06-24T16:04:46.847 回答
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() 提供代码,除非您是这样骑的。)

于 2014-03-07T06:43:32.913 回答
-1

eval() 的致命错误可以用 try/catch 捕获——它(至少)在 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.
}

问候

于 2018-09-06T20:36:58.313 回答