广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >如何执行字符串的PHP代码
  • 377
分享到

如何执行字符串的PHP代码

2024-04-02 19:04:59 377人浏览 八月长安
摘要

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

最近因项目需要,引出一个议题:如何执行字符串PHP代码(phphtml混写)。
注:传统情况下,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");

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


--结束END--

本文标题: 如何执行字符串的PHP代码

本文链接: https://www.lsjlt.com/news/38364.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 如何执行字符串的PHP代码
    最近因项目需要,引出一个议题:如何执行字符串的php代码(php和html混写)。注:传统情况下,php代码存储在文件中,直接运行文件即可。以下讨论的情况是,如果php代码是从数据库中获取到,那么要如何运行...
    99+
    2022-10-18
  • JavaScript中Eval函数的介绍以及如何执行代码字符串
    JavaScript中Eval函数的介绍以及如何执行代码字符串,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Eval:执行代码字符串内建函数 ...
    99+
    2022-10-19
  • LINQ代码如何生成字符串
    这篇文章主要为大家展示了“LINQ代码如何生成字符串”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“LINQ代码如何生成字符串”这篇文章吧。本文介绍生成随机序列和生成字符串,如果你在LINQ方面有...
    99+
    2023-06-17
  • PHP转义字符串的代码是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑怎么转义字符串?字符串可以用单引号''、双引号""、定界符<<<3 种方式定义,其中最简单的方法就是使用单引号&#...
    99+
    2016-07-05
    PHP 转义字符串
  • PHP转义字符串的代码怎么写
    这篇文章主要介绍“PHP转义字符串的代码怎么写”,在日常操作中,相信很多人在PHP转义字符串的代码怎么写问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP转义字符串的代码怎么写”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-29
  • Python中字符串类型代码的执行函数——eval()、exec()和compile()详解
    目录字符串类型代码的执行eval()exec()compile()字符串类型代码的执行 字符串类型代码的执行函数有三个,都是Python的内置函数。 eval()执行字符串类型的代码...
    99+
    2023-02-07
    Python中字符串类型代码的执行函数 Python eval() exec()和compile()
  • php如何替换字符串中的字符串
    1、php如何替换字符串中的字符串2、php如何替换字符之间的内容3、php替换怎么替换指定位置字符4、php正则如何实现全部替换字符串5、php中字符替换函数是什么6、php如何从指定位置替换字符串 php如何替换字符串中的字符串 php...
    99+
    2023-09-23
    php 开发语言
  • php如何去掉字符串中的某串字符串
    本篇文章给大家分享的是有关php如何去掉字符串中的某串字符串,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。php去掉字符串中的某串字符串的方法:1、创建一个PHP示例文件;2、...
    99+
    2023-06-26
  • php如何查看字符串的编码
    在php中使用mb_detect_encoding()函数和switch语句查看字符串的编码,具体方法如下:首先,新建一个php项目文件;php项目文件新建好后,在文件中定义一个字符串;$str = 'Hello world!';字符串定义...
    99+
    2022-10-04
  • php如何改变字符串编码
    这篇文章主要介绍“php如何改变字符串编码”,在日常操作中,相信很多人在php如何改变字符串编码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php如何改变字符串编码”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-20
  • 如何解决php字符串乱码
    本篇内容介绍了“如何解决php字符串乱码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php字符串乱码的解决办法:1、通过iconv把gb2...
    99+
    2023-06-25
  • php字符串如何转换编码
    本篇内容主要讲解“php字符串如何转换编码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php字符串如何转换编码”吧!mb_convert_encoding函数mb_convert_encodi...
    99+
    2023-07-05
  • php如何进行字符串替换
    这篇文章主要讲解了“php如何进行字符串替换”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php如何进行字符串替换”吧!字符串替换方法:1、使用str_replace()函数,语法“str_...
    99+
    2023-06-29
  • php如何去掉字符串空行
    这篇文章主要介绍了php如何去掉字符串空行,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php去掉字符串空行的方法:1、创建一个PHP示例文件;2、通过“function D...
    99+
    2023-06-28
  • C#如何实现动态执行字符串脚本
    这篇文章主要介绍了C#如何实现动态执行字符串脚本的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#如何实现动态执行字符串脚本文章都会有所收获,下面我们一起来看看吧。先来代码using System;u...
    99+
    2023-07-05
  • php字符串如何去掉转义字符串
    本篇内容主要讲解“php字符串如何去掉转义字符串”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php字符串如何去掉转义字符串”吧!PHP字符串去掉转义字符在PHP中,转义字符被用来表示特殊的字符...
    99+
    2023-07-05
  • php字符串如何去掉“-”字符
    这篇文章主要介绍“php字符串如何去掉“-”字符”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php字符串如何去掉“-”字符”文章能帮助大家解决问题。3种方法:1、使用“str_replace(&q...
    99+
    2023-06-30
  • 字符串中找出连续最长的数字字符串的实例代码
    复制代码 代码如下://1. 写一个函数,它的原形是int continumax(char *outputstr,char *intputstr) //功能: //在字符串中找出连续...
    99+
    2022-11-15
    连续最长 数字字符串
  • php字符串如何转成二进制字符串
    这篇“php字符串如何转成二进制字符串”文章,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要参考一下,对于“php字符串如何转成二进制字符串”,小编整理了以下知识点,请大家跟着小编的步伐一步一步的慢慢理解,接下来就让...
    99+
    2023-06-06
  • Python执行js字符串的方法有哪些
    这篇文章主要讲解了“Python执行js字符串的方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python执行js字符串的方法有哪些”吧!方法执行大型js时有点慢特殊编码的输入或输...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作