PHP代码生成
Posted
技术标签:
【中文标题】PHP代码生成【英文标题】:PHP code-generation 【发布时间】:2018-06-15 06:20:00 【问题描述】:而不是eval()
,我正在调查使用php 代码动态创建.php 文件的利弊。
主要是因为生成的代码应该在很长一段时间内可供其他访问者使用,而不仅仅是当前会话。生成的 php 文件是使用专用函数创建的,并且仅在高度受控的条件下创建(用户输入将永远不会到达这些代码文件)。
那么,就性能而言,与更新数据库记录并在每次访问时始终查询数据库相比,稍后在其他地方使用include()
创建用于即时执行的 .php 文件给网络服务器带来了多少负载?
生成的文件应该经常更新(覆盖),但与执行频率相比,应该不是很频繁
其他优点/缺点是什么?一个用户在其他人当前正在执行代码文件的同时覆盖代码文件的可能性是否会引入复杂的并发冲突解决?使用互斥锁?如果访问者不断“查看”(执行)文件,是否几乎不可能覆盖这些文件?
PS。我不对实现“相同”目标的替代方法/解决方案感兴趣,例如:
-
缓存和/或保存的输出缓冲区作为替代方案是不可能的,主要是因为生成的 php 代码的输出是高度动态的和上下文相关的
将代码作为变量存储在数据库中,并创建可以根据存储数据执行请求的动态 php 代码,主要是因为我不想使用数据库作为该功能的后端。我不需要搜索数据、查询聚合、排名或任何其他数据收集或操作
Memcached、APC 等。这不是我想要的缓存功能
具有在内存中运行的自定义编译二进制文件的独立(不是 PHP)服务器。不是我在这里寻找的,尽管我已经想到了这个替代方案。
编辑: 有很多关于生成什么“类型”代码的问题。无需详细说明,我可以说:这是非常上下文敏感的代码。代码不是基于用户直接输入,而是基于选择、位置和标志的输入。就像相对于其他对象的“封闭”对象。大多数代码部分以许多不同但非常受控制的方式相互关联(类似于链表、AI 代码中的遗传细胞等),因此查询数据库是不可能的。一个代码文件将包含一个或多个其他代码文件,依此类推..
【问题讨论】:
“任何用户输入都不会到达那些代码文件” 这可能是计划,但是如果您授予 Web 服务器对其所服务的文件的写入权限...您会有一段糟糕的时光。 听起来你正在构建一个图书馆系统。因此只需使用数据库。 这似乎是个坏主意。为什么不使用数据库?无论如何,要回答您的问题,性能会受到影响,但可能可以忽略不计,具体取决于它正在编写的文件数量以及创建它们所涉及的effort
。如果它们不是用户独有的,那么它们可能会更改in between
调用。这确实会导致安全风险(可能)。
你看错了方向。由于您不接受替代方案,因此这是一个死胡同。
@Plarsen 很好,大多数编写代码都在想办法做你想做的事,所以我不会责怪你,但似乎存储过程甚至多个数据库调用会更快;而且绝对更安全。我想您可以使用将文件与用户或时间联系起来的命名约定,以避免不匹配问题。祝你好运!
【参考方案1】:
我在应用程序中做同样的事情。它从 mysql 数据库中的数据生成静态 PHP 代码。我将代码存储在 memcached 中并使用“eval”来执行它。只有当 MySQL 数据库发生变化时,我才会重新生成 PHP。它节省了大量的 MySQL 读取
【讨论】:
有趣的想法,例如在使用有关 SQL/memcashed 方法的更新过程的专家时,将专家从 eval php 代码中保留下来。我需要考虑到这一点,看看我是否可以更进一步并创建 fysical .php-files 你当然可以输出物理的php文件,但是通过正确的缓存它会有效地得到相同的结果。以上是关于PHP代码生成的主要内容,如果未能解决你的问题,请参考以下文章