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

I'm not sure what you are after, but if it's something like adding classes dynamically (as opposed to procedural code), you could explore the experimental PECL extension bcompiler_read

Apparently you can give it a file descriptor and it will read it and create classes... seems pretty cool.

There is also runkit, which allows runtime manipulation of several facets, including class hierarchy. Also experimental.

于 2012-07-08T04:29:58.090 に答える
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 に答える