有时我需要创建用于动态格式化数组的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()
直接代码,没有存储历史记录会更好吗?
答案 0 :(得分:5)
如果您要使用生成的代码一次,而且只使用一次,那么最好使用eval。
但是,我在这里质疑这种做法。您的示例代码要么过于简单,无法充分证明对此模式的需要,要么是基本过程代码和闭包等过于复杂。
一般准则:
eval
在99.999%的情况下被视为不良做法eval
ed 答案 1 :(得分:0)
如果必须动态创建代码,将输出转储到文件然后包含它总是更有效率,通常更安全。然后你只需要为每段代码执行一次和它允许操作码缓存(通过APC等)和Zend Core引擎更有效的预处理。另一个好处是您可以调试包含的文件,而很少支持调试eval()
ed语句。
将它存储到文件中更安全的原因是,您可以记录运行的内容;使用eval()
,它或多或少是一个黑盒子,你不知道正在执行什么。此外,您应该能够将写入文件夹锁定到只有某个应用程序可以写入的位置。如果您将动态数组创建逻辑与主应用程序分开,然后通过主应用程序本身包含该文件,这无疑会提高安全性和性能,假设您已将临时文件设置为只读Apache并且只能由PHP应用程序(可通过cron,以及其他方法)。
对于你正在做的事情(比如memcache或APC fetch / store),可能有一个更好的解决方案但是我遇到了类似的情况,这些情况在很大程度上得益于包含的内容(例如,调整智能模板而不是eval “工作得很惊人。”