3 回答
TA贡献1798条经验 获得超3个赞
我想到的一个想法是将生成的代码保存在一个临时文件中(在tmpfs中),然后include对其进行处理。
$Test_Function = file_get_contents('data:application/x-php;base64,ZnVuY3Rpb24gdGVzdCgpe2VjaG8nVGhpcyB0ZXN0IGRhdGEgdXJsIGZ1bmN0aW9uIDEgaXMgd29ya2luZy4nO30gdGVzdCgpOw==');
file_put_contents("/mnt/tempfs/<name>.php", "<?php\n$Test_Function");
include "/mnt/tempfs/<name>.php";
关于性能:
tmpfs 工具允许创建内容驻留在虚拟内存中的文件系统。由于此类文件系统上的文件通常驻留在 RAM 中,因此文件访问速度非常快。
TA贡献1860条经验 获得超9个赞
我闻到了X/Y 问题的味道——您已经将URIeval
和data:
URI 视为特定问题的可能解决方案,并发现了两者的缺点,但没有回到最初的问题陈述。
从各种评论中,我们可以将问题定义为找到一种机制:
可以执行任意动态代码
具有与正常相似的解析性能
include
将允许代码缓存在 OpCache 中
不需要在其他地方放松安全
你说eval
在第 2 点(因为它启动了一个新的解析器)和第 3 点(因为没有可供 OpCache 使用的密钥)失败。
您已经确定data:
URI 在第 4 点失败(因为它们需要allow_url_include
),但我怀疑它们在第 2 点(因为 base64 解码是一项重要的开销)和第 3 点(因为 OpCache 不支持缓存任意流;我相信它只支持文件路径和 PHAR 内容)
更好的整体解决方案是将代码写入“真实”文件,使用内存文件系统(例如tmpfs
提高性能)。这符合上述所有四个标准,因为就 PHP 而言,它与任何其他源文件相同;唯一的额外开销是将文件写入虚拟文件系统的 I/O 速度。
关键优化将确保您跟踪动态内容何时更改,从某种修订 ID 或字符串的哈希生成唯一的文件路径。这可以实现两件事:
您可以跳过写入磁盘上已存在的文件,从而节省 I/O 时间
OpCache 将能够缓存此文件的内容并重新使用它,即使您设置
opcache.validate_timestamps
为 false ,您也可以确信正确的代码会运行
- 3 回答
- 0 关注
- 163 浏览
添加回答
举报