1

我想要include一个已经打开的文件。由于 include 想要一个文件名,这似乎并不重要。

我可以在http://php.net/manual/en/wrappers.php.php上找到的唯一内容是以某种方式fopen将文件描述符从php://fd/$fd. 我不能再进一步了。

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

4

3 回答 3

1

这可能对你有用。根据流的打开方式,它可能会返回完整路径名或仅返回基本名,因此您可能需要进行一些检查以检查并确保提供了正确的路径。(或者脚本从正确的目录运行。)

<?php

    $fh = fopen('include_source.php', 'r');
    $md = stream_get_meta_data($fh);
    include $md['uri'];
?>
于 2012-07-08T04:01:45.863 回答
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;

编辑作为内存中的替代品

类似于我之前的答案,但完全在记忆中......并使用可怕的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);
于 2012-07-08T03:59:50.630 回答
0

我不确定你在追求什么,但如果它类似于动态添加类(而不是过程代码),你可以探索实验性 PECL 扩展 bcompiler_read

显然你可以给它一个文件描述符,它会读取它并创建类......看起来很酷。

还有runkit,它允许对多个方面进行运行时操作,包括类层次结构。也是实验性的。

于 2012-07-08T04:29:58.090 回答