-2

有时我需要创建 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()直接继续编写代码而不存储历史记录更好?

4

2 回答 2

5

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

但是,我质疑这里的做法。您的示例代码要么太微不足道,无法充分证明对这种模式的需求,要么您过于复杂化了可能是基本过程代码和闭包之类的东西。

一般准则:

  • 如果您生成 *然后在生产环境中调用动态代码,您可能会错误地处理您的问题
  • eval在 99.999% 的情况下被视为不良做法
  • 应该eval编辑永远不会再次调用的生成代码
  • 将来会(或很可能会)调用的生成代码应缓存到文件或数据库
于 2012-08-08T18:59:30.263 回答
0

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

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

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

于 2012-08-08T18:34:25.037 回答