如果代码相同,则之间似乎存在差异:
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)
如果你使用eval(),AFAIK你不能利用php加速器.
如果您使用的是安装了操作码缓存的Web服务器,例如APC,eval则不会是" 最佳解决方案 ":如果我没记错的话,eval'd代码不存储在操作码缓存中(另一个答案也是如此)事,顺便说一句).
您可以使用的解决方案,至少在代码不经常更改的情况下,可以获得存储在数据库中的混合代码和包含的代码:
我使用过这种解决方案的软件(磁盘上的文件只不过是存储在DB中的代码的缓存),而且我的工作并不太糟糕 - 比每页的大量数据库请求更好,无论如何...
一些不那么好的东西,结果是:
顺便说一句:我敢说"eval是邪恶的"吗?
| 归档时间: |
|
| 查看次数: |
16708 次 |
| 最近记录: |