我想include
已经打开过的文件。由于包含想要的文件名,这看起来并不重要。
我在http://php.net/manual/en/wrappers.php.php上唯一能找到的是以某种方式将文件描述符从fopen
的返回值中哄骗并使用php://fd/$fd
。我再也找不到了。
编辑:显然还不清楚,我想重用文件描述符而不是重新打开文件。
答案 0 :(得分:1)
这可能适合你。根据流的打开方式,它可能会返回完整路径名或只返回基本名称,因此您可能需要进行一些检查并确保提供正确的路径。 (或者脚本从正确的目录运行。)
<?php
$fh = fopen('include_source.php', 'r');
$md = stream_get_meta_data($fh);
include $md['uri'];
?>
答案 1 :(得分:0)
您可以使用临时文件:
$return_to_position = ftell($fp);
$temp_path = tempnam('/tmp', 'INC');
$temp_fp = fopen($temp_path, 'w');
rewind($fp);
while(!feof($fp)) {
fwrite($temp_fp, fread($fp, 1024));
}
fclose($temp_fp);
fseek($fp, $return_to_position);
include $temp_path;
编辑作为内存替代
与我之前的回答类似,但完全在内存中...并且使用 dreaded eval()...(不要讨厌eval :这是相当于以前在安全方面的答案)(我的意思是,这个想法一般让我感到不安......但尝试解决这个问题很酷; - )
注意 eval不喜欢php标签,如果文件包含它们,这可能无效......
$return_to_position = ftell($fp);
rewind($fp);
$fp_php_code = "";
while(!feof($fp)) {
$fp_php_code .= fread($fp, 1024);
}
fseek($return_to_position);
eval($fp_php_code);
答案 2 :(得分:0)
我不确定你的目标是什么,但是如果它类似于动态添加类(而不是程序代码),你可以探索 experimental PECL extension bcompiler_read
显然你可以给它一个文件描述符,它会读取它并创建类......看起来很酷。
还有runkit,它允许对多个方面进行运行时操作,包括类层次结构。也是实验性的。