在 PHP 中包含一个已经打开的文件


Include an already open file in PHP?

我想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,它允许运行时操作多个方面,包括类层次结构。也是实验性的。