我想要include
一个已经打开的文件。由于 include 想要一个文件名,这似乎并不重要。
我可以在http://php.net/manual/en/wrappers.php.php上找到的唯一内容是以某种方式fopen
将文件描述符从php://fd/$fd
. 我不能再进一步了。
编辑:显然不清楚,我想重用文件描述符而不是重新打开文件。
我想要include
一个已经打开的文件。由于 include 想要一个文件名,这似乎并不重要。
我可以在http://php.net/manual/en/wrappers.php.php上找到的唯一内容是以某种方式fopen
将文件描述符从php://fd/$fd
. 我不能再进一步了。
编辑:显然不清楚,我想重用文件描述符而不是重新打开文件。
这可能对你有用。根据流的打开方式,它可能会返回完整路径名或仅返回基本名,因此您可能需要进行一些检查以检查并确保提供了正确的路径。(或者脚本从正确的目录运行。)
<?php
$fh = fopen('include_source.php', 'r');
$md = stream_get_meta_data($fh);
include $md['uri'];
?>
您可以使用临时文件:
$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;
编辑作为内存中的替代品
类似于我之前的答案,但完全在记忆中......并使用可怕的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);
我不确定你在追求什么,但如果它类似于动态添加类(而不是过程代码),你可以探索实验性 PECL 扩展 bcompiler_read
显然你可以给它一个文件描述符,它会读取它并创建类......看起来很酷。
还有runkit,它允许对多个方面进行运行时操作,包括类层次结构。也是实验性的。