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'];
?>
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.
一時ファイルを使用できます。
$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);