PHP:包含使用eval的等价物

Jas*_*per 14 php eval include

如果代码相同,则之间似乎存在差异:

include 'external.php';

eval('?>' . file_get_contents('external.php') . '<?php');

有什么不同?有人知道吗?


我知道这两个是不同的,因为include工作正常,并eval给出一个错误.当我最初问这个问题时,我不确定它是否在所有代码上或者仅在我的代码上发生错误(并且由于代码被eval编辑,因此很难找出错误的含义).但是,在研究了答案之后,事实证明,无论你是否得到错误都不依赖于代码external.php,但确实取决于你的php设置(short_open_tag确切地说).

Jas*_*per 13

经过一些研究,我发现自己出了什么问题.问题在于这<?php是一个"短开始标记",因此只有在short_open_tag设置为1 时才会起作用(在php.ini中或者具有相同效果的东西).正确的完整标签是<?php在第二个p之后有一个空格.

因此,包括的适当等价物是:

eval('?>' . file_get_contents('external.php') . '<?php ');
Run Code Online (Sandbox Code Playgroud)

或者,您可以将开头标记全部放在一起(如下面的评论中所述):

eval('?>' . file_get_contents('external.php'));
Run Code Online (Sandbox Code Playgroud)

我原来的解决方案是添加一个分号,这也有效,但如果你问我,看起来不那么干净:

eval('?>' . file_get_contents('external.php') . '<?php;');
Run Code Online (Sandbox Code Playgroud)


nit*_*ria 6

如果你使用eval(),AFAIK你不能利用php加速器.

  • AFAIK你必须在文件系统上有一个真实的文件. (3认同)
  • @niteria只想指出你说AFAIK太多了. (3认同)

Pas*_*TIN 6

如果您使用的是安装了操作码缓存的Web服务器,例如APC,eval则不会是" 最佳解决方案 ":如果我没记错的话,eval'd代码不存储在操作码缓存中(另一个答案也是如此)事,顺便说一句).

您可以使用的解决方案,至少在代码不经常更改的情况下,可以获得存储在数据库中的混合代码和包含的代码:

  • 必要时,从DB获取代码,并将其存储在磁盘上的文件中
  • 包含该文件
  • 由于代码现在位于磁盘上的文件中,操作码缓存将能够缓存它 - 这对于性能更好
  • 每次必须执行代码时,您都不需要向DB发出请求.

我使用过这种解决方案的软件(磁盘上的文件只不过是存储在DB中的代码的缓存),而且我的工作并不太糟糕 - 比每页的大量数据库请求更好,无论如何...

一些不那么好的东西,结果是:

  • 你必须从数据库中获取代码,以便"必要时"将其放入文件中
    • 这可能意味着每小时重新生成一次临时文件,或者在修改数据库中的条目时删除它?你有办法确定何时发生这种情况?
  • 您还必须更改代码,使用临时文件,或者在必要时重新生成它
    • 如果你有几个地方需要修改,这可能意味着一些工作

顺便说一句:我敢说"eval是邪恶的"吗?