使用字符串而不是文件名进行Include

3
我想对一个字符串进行include操作,而不是文件,但我不知道如何实现。
//This is the desired functionality
include($filename);

//But I want to do something like this instead.
$file_contents = getFileFromCacheOrSomewhereElse($filename);
include($file_contents);  // Doens't work...
eval($file_contents);     // Also incorrect.

请注意:"eval"不同于include——"include"会输出文件的内容(并执行任何PHP标签),而"eval"会将字符串作为PHP代码执行。
一个使用示例是从Memcache加载模板文件(作为字符串),然后在该字符串上运行include,而不是运行include并依赖PHP文件缓存。

1
你不能只是使用 APC 作为字节码缓存吗?或者缓存已经被评估过的模板? - Gordon
可能是重复的问题:是否可以执行PHP字符串? - ircmaxell
3个回答

10

如果你可以打开php.ini中的allow_url_fopenallow_url_include设置,那么另一种选择是使用data流封装器(手册)。

include 'data:text/plain,' . urlencode($file_contents);

7
eval("?>" . $file_contents . "<?php ");

它可以吗?


你确定在这种情况下,eval和include是等效的吗?有很多要考虑的事情——变量作用域、错误处理等。 - TempAccount12345
不是的。我只是测试了上面的代码,并认为那可能已经足够满足你的需求了。虽然在变量作用域方面,它是等价的(没有作用域变化)。错误处理可能会有所不同。 - Moritz Both
这是否适用于不包含关闭 ?> 标记的文件? - Grzegorz Adam Kowalski

1

在memcache中存储PHP代码不是最好的想法。
之后再进行eval更糟糕。

任何opcode缓存,如APC或EAccelerator都会动态缓存您的PHP文件,无需像这样奇怪的尝试,甚至为更快的执行解析它。

编辑。考虑到多年来的投票结果,我认为这个问题只吸引了新手,他们有相同的奇怪心思。因此,我必须重复一遍:尽管它打败了你的绝妙想法,

只需按原样保留您的包含文件

它们将由内部PHP的opcode cache缓存得更好并且执行得更快。


1
感谢您的回复。知道如果有一个opcode缓存,缓存模板是一个坏主意是很好的。然而,这并没有回答我的问题 :) - TempAccount12345

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接