ter*_*ase 8 php memorystream include
我正在为一个浏览器应用程序编写一个系统,它将一些特定的PHP脚本存储在一个数据库中,然后将它们拉出来并在需要时执行它们.起初我尝试使用exec()和管道输出一个脚本的输出,该脚本将脚本从数据库中取出并打印出来.这在一个用例中起作用,但不是全部,并且无论如何都感觉很脆弱,所以我正在寻找一种更好的方法.
我现在正试图通过在内存中使用PHP文件流来实现这一目标.例如:
$thing = <<<'TEST'
<?php
$thing = array();
print "Testing code in here.";
var_dump($thing);
?>
TEST;
$filename = "php://memory";
$fp = fopen($filename, "w+b");
fwrite($fp, $thing);
//rewind($fp);
fclose($fp);
include "php://memory";
Run Code Online (Sandbox Code Playgroud)
但是,执行脚本时不会打印任何内容.这是否可能通过这种方式,如果没有,还有另一种方法吗?我正在努力避免编写临时文件并从中读取文件,因为我确信访问文件系统会减慢速度.是否有一个我可以提供给"include"的URL,以便它将读取内存流,就像它是一个文件一样?
我不认为eval()会这样做,因为,如果我没记错的话,它只限于一行.
另外,请不要"eval = include = hell"答案.非管理员用户无权编写存储在数据库中的脚本,我知道这需要对我的应用程序的生命周期进行特殊处理.
eval()而include实际上是相当一致。因此eval()适用于多行-仅供参考。但是,我宁愿include在这里,我一直认为它更快。也许我错了,不知道。
但是,我认为您应该调试您的代码,我看不出为什么它不起作用的原因。您可能需要rewind指向指针(您已经评论了),但是您应该直接检查的是您的PHP配置允许包含URL。我知道该设置会阻止使用data://URI,因此您可能启用了此功能。
另外,您始终可以尝试使用PHP是否可以通过使用file_get_contents和转储来打开内存。这应该给您代码。如果不是,则您已经犯了一些错误(例如,不倒带或类似操作)。
编辑:我还没走那么远(demo):
<?php
/**
* Include from “php://memory” stream
* @link /sf/ask/696140721/
*/
$thing = <<<TEST
<?php
\$thing = array();
print "Testing code in here.";
var_dump(\$thing);
TEST;
$filename = "php://memory";
$fp = fopen($filename, "w+b");
fwrite($fp, $thing);
rewind($fp);
var_dump(stream_get_contents($fp));
Run Code Online (Sandbox Code Playgroud)
这是我发现的:
php://memory是一条流,一旦关闭,它将消失。$fpas流,这对于include开箱即用的AFAIK 是不可能的。使用数据URI(demo)可能会更容易:
<?php
/**
* Include from “php://memory” stream
* @link /sf/ask/696140721/
*/
$thing = <<<TEST
<?php
\$thing = array();
print "Testing code in here.";
var_dump(\$thing);
TEST;
include 'data://text/plain;,'. urlencode($thing);
Run Code Online (Sandbox Code Playgroud)
另请参见:包括来自PHP流的代码
| 归档时间: |
|
| 查看次数: |
8405 次 |
| 最近记录: |