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

PHP 中可以运行外部程序的函数详解

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

北京

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

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

看不清楚,换张图片

免费获取短信验证码

PHP 中可以运行外部程序的函数详解

运行外部程序的函数解析


PHP 提供了四个用来运行外部程序的函数——system、exec、passthru和shell_exec。 下面我们就这几个函数分别说明一下其用法,并且比较一下它们之间有什么不同。

system()


system ( string $command [, int &$return_var ] ) : stringfalse

system 接收两个参数:

第一个是要执行的外部命令;第二个参数是可选的。如果提供了第二个参数,则会将外部程序的执行完之后的状态码保存在第二个参数变量中(注意,是一个整数)。

当command正常执行成功,并且command有输出信息 则system函数返回值是输出信息的最后一行(对于cli模式下,command执行过程中产生的输出信息system都会显示到stdout)。 如果执行失败,则返回值为false

exec()


exec ( string $command [, array &$output [, int &$return_var ]] ) : string

exec 可以接收三个参数:第一个就是要执行的外部命令;第二、三个参数是可选的,如果提供了第二个参数,则会将command程序在执行的过程中产生的每一行数据以数组的形式保存到第二个参数中。 如果提供了第三个参数,则和system函数相同,将外部程序的执行完之后的状态码保存在第三个参数变量中。

当command正常执行成功,并且command有输出信息 则exec函数返回值是输出信息的最后一行。

和system函数不同的是,在command执行过程中产生的输出信息exec函数并不会显示在终端上。如果想要获取这些输出信息,可以通过提供第二个参数。当然也可以换用其他的函数,比如: system 或者 passthru。 要根据实际项目选择相应的函数。 如果command是一个自定义的服务程序,那么即使给exec提供了第二个参数,也不能在程序运行过程中获取到输出信息,这可能会影响自定义程序的使用。

passthru


passthru ( string $command [, int &$return_var ] ) : void

该函数和system一样接收两个参数,而且用途也都一样。 并且该函数也可以将command运行过程中产生的输出信息打印到终端上面。只是和system不同的是,输出信息是原生的。也就是说如果command输出二进制数据,则可以使用该函数。 除此之外,passthru是没有返回值的,这也是和system不同的地方。

shell_exec


shell_exec ( string $cmd ) : string|null

这个函数就比较简单,只有一个必须的参数。那就是我们要执行的命令。 并且在command执行的过程中产生的输出信息该函数也是不会显示到终端上的。 但是这些信息是会通过返回值返回给我们的主程序的。 如果程序执行错误或者程序没有输出的话,则返回null。


上面四个函数,在PHP底层都是使用的popen()这个函数。关于这个函数这里不展开讨论,简单来说就是打开一个全双工的管道(pipe)。 我们的PHP主程序会在管道一端一直监听我们指定的外部程序是否有向管道发送信息(指定程序的运行状态,或者向终端的输出都会发送到管道中)。 其实也就是相当于两个进程通过管道进行通信。

如果外部程序就是一个服务程序。使用上面四个函数执行这个服务程序,这样就会一直有两个进程。PHP为主进程, 外部程序的进程是PHP主进程的子进程。 既然是两个进程,按说应该是并发的。因为服务程序是运行在子进程中的,这并不影响我们的PHP的主进程的运行。 这没错,事实也是我们的PHP主进程和子进程是并行的。然而我们的PHP主进程看起来像阻塞了一样,只有当子进程关闭以后,才会继续执行后面的PHP代码。 为什么会产生这样的现象,我们上面说了,popen()函数是会打开一个管道和一个子进程。子进程和主进程通过这个管道进行通信。而我们的PHP进程是一直在监听这个管道,如果管道有信息,则把信息取出来进行相应的处理。也就是说只要子进程不退出,我们的PHP进程就一直会检查这个管道是否有信息。 这样看起来就像PHP进程被阻塞了一样。所以如果使用PHP运行一个服务程序,在处理的时候要注意这个问题。尤其是信号处理方面。

免责声明:

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

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

PHP 中可以运行外部程序的函数详解

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

下载Word文档

猜你喜欢

PHP 中可以运行外部程序的函数详解

运行外部程序的函数解析PHP 提供了四个用来运行外部程序的函数——system、exec、passthru和shell_exec。 下面我们就这几个函数分别说明一下其用法,并且比较一下它们之间有什么不同。system
PHP 中可以运行外部程序的函数详解
2024-02-27

如何解决javac不是内部或外部命令,也不是可运行程序的问题

如果您在使用命令行或终端运行javac时遇到了"javac不是内部或外部命令,也不是可运行程序"的错误,可能是由于以下几个原因导致的:1. Java Development Kit(JDK)未正确安装:确保您已正确安装了JDK,并且JAVA
2023-08-25

最新解决'nvidia-smi'不是内部或外部命令也不是可运行的程序

使用cmd查看电脑显卡的信息,调用nvidia-smi查看显卡使用情况报错,提示'nvidia-smi'不是内部或外部命令,也不是可运行的程序,本文给大家分享完美解决方案,感兴趣的朋友跟随小编一起看看吧
2023-01-03

windows系统提示不是内部或外部命令也不是可运行的程序的解决办法

Windows系统电脑在运行CMD命令提示符窗口,出现不是内部或外部命令也不是可运行的程序或批处理。 解决方法:环境变http://www.cppcns.com量异常,重新配置系统默认值即可。 百度经验:jingyan.bphpaidu.c
2023-06-11

java不是内部或外部命令,也不是可运行程序的报错问题怎么解决

本篇内容主要讲解“java不是内部或外部命令,也不是可运行程序的报错问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java不是内部或外部命令,也不是可运行程序的报错问题怎么解决”吧!
2023-06-30

解决使用node命令提示:'node'不是内部或外部命令,也不是可运行的程序

最近在工作中遇到了个常见的问题,分享给大家,这篇文章主要给大家介绍了关于如何解决使用node命令提示:'node'不是内部或外部命令,也不是可运行的程序的相关资料,需要的朋友可以参考下
2023-02-27

vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件怎么解决

本文小编为大家详细介绍“vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件怎么
2023-07-05

使用node命令提示:'node'不是内部或外部命令,也不是可运行的程序如何解决

本文小编为大家详细介绍“使用node命令提示:node不是内部或外部命令,也不是可运行的程序如何解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“使用node命令提示:node不是内部或外部命令,也不是可运行的程序如何解决”文章能帮助大家
2023-07-05

解决vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件的报错问题

这篇文章主要介绍了解决vue-cli-service不是内部或外部命令也不是可运行的程序或批处理文件的报错问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
2023-03-03

'webpack-dev-server' 不是内部或外部命令也不是可运行的程序 或批处理文件的最新解决方法

这篇文章主要介绍了'webpack-dev-server' 不是内部或外部命令也不是可运行的程序 或批处理文件的最新解决方法,文中给大家补充介绍了webpack-dev-server的介绍与用法,需要的朋友可以参考下
2023-02-07

编程热搜

  • 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动态编译

目录