是否更好地评估动态生成的代码或将其存储在临时文件中并包含它?

时间:2012-08-08 18:28:36

标签: php

有时我需要创建用于动态格式化数组的PHP代码。一种方法是使用eval。但我想将生成的代码写入PHP文件然后包含它。这对eval有很多好处,其中之一就是缓存生成的代码。但我还没有在其他代码中看到过这种做法。我不知道安全性或其他方面是否存在任何问题?

这是一个例子:

<?php

$code = '<? foreach($rows as $row) {$row["insertion"] = format($row["insertion"]);} ?>'
file_put_contents('formatter.php', $code);
include('formatter.php');

?>

我只想知道动态创建PHP文件然后包含它是否合适?

或者直接进行eval()直接代码,没有存储历史记录会更好吗?

2 个答案:

答案 0 :(得分:5)

如果您要使用生成的代码一次,而且只使用一次,那么最好使用eval。

但是,我在这里质疑这种做法。您的示例代码要么过于简单,无法充分证明对此模式的需要,要么是基本过程代码和闭包等过于复杂。

一般准则:

  • 如果您在生产环境中生成* 然后调用动态代码,则可能是您的问题不正确。
  • eval在99.999%的情况下被视为不良做法
  • 永远不会再次调用的生成代码应为eval ed
  • 将来(或很可能会)将被调用的生成代码应缓存到文件或数据库

答案 1 :(得分:0)

如果必须动态创建代码,将输出转储到文件然后包含它总是更有效率,通常更安全。然后你只需要为每段代码执行一次它允许操作码缓存(通过APC等)和Zend Core引擎更有效的预处理。另一个好处是您可以调试包含的文件,而很少支持调试eval() ed语句。

将它存储到文件中更安全的原因是,您可以记录运行的内容;使用eval(),它或多或少是一个黑盒子,你不知道正在执行什么。此外,您应该能够将写入文件夹锁定到只有某个应用程序可以写入的位置。如果您将动态数组创建逻辑与主应用程序分开,然后通过主应用程序本身包含该文件,这无疑会提高安全性和性能,假设您已将临时文件设置为只读Apache并且只能由PHP应用程序(可通过cron,以及其他方法)。

对于你正在做的事情(比如memcache或APC fetch / store),可能有一个更好的解决方案但是我遇到了类似的情况,这些情况在很大程度上得益于包含的内容(例如,调整智能模板而不是eval “工作得很惊人。”