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


Is it better to eval dynamically-generated code or store it in a temp file and include it?

有时我需要创建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()代码,不存储历史记录更好?

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

但是,我质疑这里的做法。您的示例代码要么太琐碎,无法充分证明对此模式的需求,要么您过于复杂化了可能是基本过程代码和闭包或其他东西。

一般准则:

  • 如果在生产环境中生成 *,然后调用动态代码,则可能错误地处理了问题
  • eval在所有情况下99.999%都被视为不良做法
  • eval永远不会再次调用的生成代码
  • 将来将(或很可能)调用的生成代码应缓存到文件或数据库中

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

将其

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

对于您正在做的事情,可能有一个更好的解决方案(例如 memcache 或 APC 获取/存储),但我遇到了类似的情况,这些情况在很大程度上受益于包含的东西(例如,调整聪明的模板以包含而不是 eval 效果惊人)。