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

时间:2012-07-08 03:47:15

标签: php stream include

我想include已经打开过的文件。由于包含想要的文件名,这看起来并不重要。

我在http://php.net/manual/en/wrappers.php.php上唯一能找到的是以某种方式将文件描述符从fopen的返回值中哄骗并使用php://fd/$fd。我再也找不到了。

编辑:显然还不清楚,我想重用文件描述符而不是重新打开文件。

3 个答案:

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