热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

用php写一个解释器,如何编写一个PHP解释器文件

什么是解释器概念解释器文件是一种文本文件,它第一行的形式为:#!pathname[optional-argument]在#!和pathname之间的空格不是必要的&#

什么是解释器

概念

解释器文件是一种文本文件,它第一行的形式为:#! pathname [optional-argument]在#!和 pathname 之间的空格不是必要的,可以根据需求选择有无。pathname 指的是绝对路径名,[optional-argument] 指的是可选参数。

PHP脚本执行程序

在linux中,我们来执行php程序,一般是使用命令php xxxx.php 这样来执行,接下来我们编写这样一个程序运行一下,而下面这个图片则是在linux下运行php脚本的过程

3acf8ce31032de5a52e8d21fb77afee1.png

解释器文件

上面介绍了解释器文件的概念以及书写形式,接下来咱们编写一个php解释器文件

1、查找linux中,你安装的php可执行文件,如果是编译安装的相信大家都能找到,如果不是编译安装的,大家可以通过whereis php 这个命令来查看,我这里不是编译安装的,所以先查看一下本地的php可执行文件的路径

3108da647cb655d784fc75a9a8e25e95.png

因为不是编译安装的,所以大家看到查出来很多个,但正常的一般都安装在/usr/bin/php 目录下

2、编写可执行文件

1b721a14c370f0da3db08a97487ef318.png

3、编写好可执行文件后,要查看编写文件的权限,如果没有可执行权限,要给可执行权限

8c241d510f7fa9bef3bd62edfc7eebe1.png

3e4e16d3b204ab265dd7e2eb801a2748.png

4、当给可执行的权限后,我们就可以执行这个文件了

9b20daf664c4b63ad1b5815eba026995.png

通过以上两种方式,我们都可以得到我们想要的结果。而解释器最大的好处就是使用户得到效率方面的好处,其代价是内核的额外开销(因为识别解释器文件的是内核)

扩展

在PHP中,我们有没有见到过这样的可执行文件呢,答案肯定是见到过。首先在easyswoole的脚本文件中,我们也会看到所谓的解释器文件,那么他是用来干什么的呢?

#!/usr/bin/env php

$file = null;

foreach ([__DIR__ . '/./vendor/bin/easyswoole', __DIR__ . '/./bin/easyswoole'] as $file) {

if (file_exists($file)) {

require $file;

break;

}

}

if(!file_exists($file)){

die("include /vendor/bin/easyswoole fail\n");

}

通过上面编写解释器文件的过程,想必大家也能猜出来

首先就是查找linux系统中,安装的PHP,也就是找到对应的php可执行文件

其次就是为了兼容用户的程序,使代码具有扩展性

通过这篇文章,希望大家下次见到这种格式的代码不会在懵逼了哦



推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 本文介绍了在多平台下进行条件编译的必要性,以及具体的实现方法。通过示例代码展示了如何使用条件编译来实现不同平台的功能。最后总结了只要接口相同,不同平台下的编译运行结果也会相同。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
  • 本文介绍了在使用vue和webpack进行异步组件按需加载时可能出现的报错问题,并提供了解决方法。同时还解答了关于局部注册组件和v-if指令的相关问题。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
author-avatar
乐檬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有