我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何执行字符串的PHP代码

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何执行字符串的PHP代码

最近因项目需要,引出一个议题:如何执行字符串的php代码(php和html混写)。
注:传统情况下,php代码存储在文件中,直接运行文件即可。以下讨论的情况是,如果php代码是从数据库中获取到,那么要如何运行?

最直观的方案

  • 将字符串代码写到临时文件,然后在项目中include该文件,执行完成再删除这个临时文件

  • system exec 之类的系统函数

  • php函数eval (会不会有安全问题?)

进一步的瞎想

  • 把字符串代码当做参数,传入到php的cli或者php-fpm中运行

  • 重新定义include,让include可以直接操作字符串

几种思路的验证

  • 1:写临时文件,然后include文件。豪无疑问,可行。那么岂不是每次都要写文件,每个请求都要写一次文件。好吧,总有办法解决,缓存+过期验证之类的,但总感觉这方案不够专业。。

  • 2:system exec之类的函数。稍微思考下就会明白,这类函数是执行系统命令,不是运行php代码

  • 3:eval函数,手册上写着:

    Caution :The eval() language construct is very dangerous because it allows execution of arbitrary PHP code. Its use thus is discouraged. If you have carefully verified that there is no other option than to use this construct, pay special attention not to pass any user provided data into it without properly validating it beforehand.

  • 4: php-fpm cli模式是否有办法解决此类问题
    初步设想是把字符串代码传到fpm、cli模式中,等待返回结果。
    但有一个硬伤,需要执行的字符串代码是有上下文的。比如字符串代码中使用了一个变量$_GET,如果把这个字符串代码传到fpm中,而$_GET变量并没有传过去,那代码还是没办法正常运行。

  • 5:include能不能直接操作字符串
    好吧,前面的4种方法好像都不太满意,那就深挖一下这个思路吧

    首先,php中的include是什么原理?
    并没有去看过源码,猜一下吧,1:读取文件(fopen,fread之类的)2:解析php语法 3:运行代码

    那么,如果可以让fopen,fread操作字符串,也许这个问题就解决了?
    设想:把字符串转换为一个对象或者流,提供fopen,fread接口。首先想到php的SPL中应该有此类接口,查php官方手册,找到php手册中关于”支持的协议与封装协议“章节(同事也提过使用自定义协议的方式),以下为测试的最简demo:(封装自定义协议,使用include直接操作字符串)

    <?php
    //业务需要:从数据库中读出字符串的php代码
    function mysql_get($id) {
    	return '<?php $i = '.$id.';
    	echo "contextValue: ".$contextName."\n";
    	echo "hello $i \n"; 
    	';
    }
    //自定义协议
    class VariableStream {
        private $string;
        private $position;
        public function stream_open($path, $mode, $options, &$opened_path) {
            $url = parse_url($path);
            $id = $url["host"];
    
            //根据ID到数据库中取出php字符串代码
            $this->string = mysql_get($id);
            $this->position = 0;
            return true;
        }
        public function stream_read($count) {
            $ret =  substr($this->string, $this->position, $count);
            $this->position += strlen($ret);
            return $ret;
        }
        public function stream_eof() {}
        public function stream_stat() {}
    }
    
    stream_wrapper_register("var", "VariableStream");
    
    //上下文变量
    $contextName = "1000";
    //include字符串php代码。(php代码是从数据库中读出来,这里传入的199是数据库的主键ID)
    include("var://199");
    
    //修改上下文变量
    $contextName = "2000";
    //引入另一个字符串php代码
    include("var://299");

    OK,终于找到一种解决思路。再继续思考,既然我们希望最终的展示是include这种方式,include的内部是fopen之类的系统函数,那么fopen除了支持自定义协议之外,还支持哪些呢?
    手册中,fopen的第一个参数$filename,可以是文件名,也可以是"scheme://..." 的格式,第二种格式就是上面说的自定义协议方式。再继续查看相关的东西,发现SplFileInfo、 stream_context_create,不过并不能解决问题。

总结

现在已经有3种方式可以做成这个事情,那么哪种方式更好
1:写临时文件,加缓存,直接include
2: eval,官方手册上说这个函数有安全问题
3:自定义协议,直接include

首先排除方法1,原因1:缓存文件会增加硬盘I/O。原因2:不够专业(这不是小问题)
至于eval提到的安全问题,仔细阅读手册上写的那段话后,发现他只是提示你现在正在运行一段项目代码以外的代码,请多小心。
这样看来,方法2并没有比方法3更危险。


选取标准,如果项目中只有一个很小的功能需要执行php字符串,那直接使用eval即可
如果项目中有大量的此类需求,封装一个自定义协议会很方便。
项目中的引用会是这样的: include("protocolName://param");

好吧,以上提供的大部分都是思路,希望思路对你有用


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何执行字符串的PHP代码

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

PHP如何对字符串执行 ROT13 编码

PHP中的ROT13编码是一种替换式密码,将字母表中的每个字母向后移动13位。可以使用str_rot13()函数或自定义函数执行编码。自定义函数遍历字符串中的每个字符,并在字母表中找到编码后的字符。其他替代方案包括使用preg_replace()函数或位运算。ROT13编码是一种简单的密码,在PHP中可以轻松实现。
PHP如何对字符串执行 ROT13 编码
2024-04-02

Java如何对字符串执行 ROT13 编码

摘要:Java中的ROT13编码通过将字母替换为相隔13位的字母来加密字符串。有5种实现方法:字符数组:遍历字符数组,替换字母。StringBuilder:使用可变字符串表示,提高效率。正则表达式:一次执行所有替换。ApacheCommonsLang库:使用内置函数。第三方库(如java.security):使用标准化的实现。根据需求选择适合的方法。
Java如何对字符串执行 ROT13 编码
2024-04-02

Python如何对字符串执行 ROT13 编码

ROT13是一种用于轻微加密字符串的替换式算法。本文提供了4种在Python中对字符串进行ROT13编码的方法:使用string.maketrans()函数使用循环使用map()和lambda使用第三方库(如cryptography.fernet或rot13)选择哪种方法取决于个人偏好和特定要求。string.maketrans()方法通常是最简单、最有效的。
Python如何对字符串执行 ROT13 编码
2024-04-02

PHP如何对字符串执行rot13转换

PHP的rot13转换是一种加密算法,将字母向后或向前移动13个位置。PHP提供内置函数str_rot13(),实现简单便捷。自定义函数提供更多灵活性,可并行处理字符,但性能可能不如内置函数。Rot13并非安全加密算法,处理敏感信息时不建议使用。此外,可以使用正则表达式等方法实现转换。选择最合适的方法取决于需求和性能要求。
PHP如何对字符串执行rot13转换
2024-04-02

C语言如何对字符串执行 ROT13 编码

ROT13是一种简单编码算法,用于替换字母表中字母位置。用C语言实现ROT13编码包括:创建字符串、遍历字符、按字母位置执行替换、存储编码字符和返回编码字符串。示例代码展示了如何用C语言实现ROT13编码,该编码主要用于匿名留言、简单密码和谜题。
C语言如何对字符串执行 ROT13 编码
2024-04-02

Go语言如何对字符串执行 ROT13 编码

本文介绍了Go语言中如何实现ROT13字符串编码。ROT13是一种字符替换算法,用于加密文本,通过将每个字符替换为字母表中相隔13个位置的字符。Go语言提供了多种实现ROT13编码的方法,包括使用strconv包的QuoteToASCII函数或编写自定义函数。本文提供了使用这两种方法的示例代码,展示了如何编码和解码ROT13字符串。
Go语言如何对字符串执行 ROT13 编码
2024-04-02

Java如何对字符串执行rot13转换

本文介绍了如何在Java中实现ROT13字符串转换,这是一种替换密码用于混淆文本。该过程涉及创建字符数组、查找对应映射并遍历字符串。代码示例展示了如何使用ROT13.rot13()方法将原始文本转换为ROT13格式。另外,文中还提到了扩展字符集、处理多语言文本和性能优化等附加功能。
Java如何对字符串执行rot13转换
2024-04-02

PHP如何把字符串按照 PHP 代码来计算

本文介绍了PHP中将字符串作为PHP代码计算的方法,包括:eval()函数直接执行字符串代码。create_function()函数创建字符串表示的函数。call_user_func()函数执行回调,包括字符串函数。PHP5.3及更高版本的匿名函数。强调了安全注意事项,建议使用过滤器、限制作用域和日志记录。也讨论了性能考虑和示例应用,例如动态代码生成、执行用户代码和代码混淆。
PHP如何把字符串按照 PHP 代码来计算
2024-04-02

php如何停止代码执行

今天小编给大家分享一下php如何停止代码执行的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。php停止代码执行的方法:1、使用
2023-07-04

LINQ代码如何生成字符串

这篇文章主要为大家展示了“LINQ代码如何生成字符串”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LINQ代码如何生成字符串”这篇文章吧。本文介绍生成随机序列和生成字符串,如果你在LINQ方面有
2023-06-17

php如何进行字符串替换

这篇文章主要讲解了“php如何进行字符串替换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何进行字符串替换”吧!字符串替换方法:1、使用str_replace()函数,语法“str_
2023-06-29

php如何去掉字符串空行

这篇文章主要介绍了php如何去掉字符串空行,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php去掉字符串空行的方法:1、创建一个PHP示例文件;2、通过“function D
2023-06-28

php如何去掉字符串中的某串字符串

本篇文章给大家分享的是有关php如何去掉字符串中的某串字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php去掉字符串中的某串字符串的方法:1、创建一个PHP示例文件;2、
2023-06-26

php如何改变字符串编码

这篇文章主要介绍“php如何改变字符串编码”,在日常操作中,相信很多人在php如何改变字符串编码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何改变字符串编码”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-20

php字符串如何转换编码

本篇内容主要讲解“php字符串如何转换编码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php字符串如何转换编码”吧!mb_convert_encoding函数mb_convert_encodi
2023-07-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录