这里就要用到PHP的内置函数exec() 和system() ;
PHP的exec() 和system() 函数区别:
(1)system()
原型:string system (string command [, int return_var])
system()函数很其它语言中的差不多,它执行给定的命令,输出和返回结果。
(2)exec()
原型:string exec (string command [, string array [, int return_var]])
exec ()函数与system()类似,也执行给定的命令,但不输出结果,而是返回结果的最后一行。
可以看出两个函数的区别就是PHP在调用执行外部命令后,system()函数将执行的结果输出并返回给PHP程序。而 exec() 函数在调用执行外部命令后不会将结果输出,只是返回结果。
程序代码实现和对比:
(1)in.php程序使用exec()函数代码及解析:
(2)test.py程序代码:
(3)PHP程序执行后效果1:
这样就利用exec()函数实现了对python脚本的调用,下面说一下将in.php程序中的exec()函数替换成system()函数后的执行效果。
(4)in.php程序使用system()函数代码及解析:
(5)PHP程序执行后效果2:
可以看出使用system()函数时,执行python程序时不但返回结果,而且将结果输出了,而exec()函数只是返回结果,没有输出。
扩展应用:(php web开发数据调用)
想要在网页上显示其它网站上的数据内容时,都需要网站提供数据的调用接口直接调用,如果没有接口,就需要用爬虫将数据爬回来后保存到数据库,在用程序从数据库中取出数据展示出来。(当然也可以用到php的curl库进行数据爬取后进行展示,但是个人认为在编程语言中做爬虫最简单并且强大的还是Python),而如果在PHP程序中直接调用python脚本进行爬虫,然后再将数据展示到网页上,这样就可以省去插入数据到数据库和从数据库读取数据的过程,这种做法对一些实时数据的爬取还是比较有用的,但是一定会影响网页的加载速度。下面将以前写的一个爬虫爬到的数据直接展示到web网页上供大家参考。
(1)php程序代码:
<?PHP $output=exec('python test1.py'); echo $output; ?>
(2)python爬虫代码:
import requests import json class WeatherSpider(object): def __inti__(self): pass def request(self,url): headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36', 'Referer': 'http://www.weather.com.cn/weather40d/101060201.shtml' } return requests.get(url,headers=headers) def create_url(self): year = '2016' for i in range(1,2): month = str(i) if i > 9 else "0" + str(i) url = "http://d1.weather.com.cn/calendar_new/" + year + "/101060201_" + year + month + ".html" self.get_data(url) def get_data(self,url): respone = self.request(url).content json_str = respone.decode(encoding='utf-8')[11:] weathers = json.loads(json_str) data = "" for weather in weathers: data = data+weather.get('date')+'星期'+weather.get('wk')+weather.get('hmax')+weather.get('hmin')+weather.get('hgl')+"<br>" print (data) if __name__ == '__main__': jl_weather = WeatherSpider() jl_weather.create_url()
(3)web网页爬虫展示:
Python sys.argv
PHP 借助 shell_exec
通过类似于 python sum.py $aa $bb
的形式以执行系统命令的方式传递参数给Python文件;
Python 则通过 sys.argv(需引入sys模块)
来接收命令中所包含的参数(需要注意的是:此时传入的参数都会被默认为 str
类型,需要在函数内部进行解析和转换)并将处理结果通过print
函数输出;
PHP 通过将 shell_exec 函数返回的结果赋给变量实现取得 Python 返回数据的效果。
php index.php
<form action="" method="post"> 请输入a:<input type="number" name="a" value="请输入a"><br> 请输入b: <input type="number" name="b" value="请输入b"> <button type="submit">计算</button> </form> <?php $aa = $_POST["a"]; $bb = $_POST["b"]; $cmd = shell_exec("python sum.py $aa $bb"); echo "a与b的和是: $cmd";
python sum.py
import sys # 以下两行解决中文乱码问题 import codecs sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) a, b = sys.argv[1], sys.argv[2] # 接收位置参数 print(int(a)+int(b))
字符串示例
?php $name = '订单5210804229002567电子发票.pdf'; $cmd = shell_exec("python sum.py $name"); echo $cmd;
import sys # 以下两行解决中文乱码问题 import codecs sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) a = sys.argv[1] # 接收位置参数 print(a)
PHP (shell_exec()、exec()、passthru()、system())的区别
PHP:除了使用 shell_exec(),还可以使用 exec()、passthru() 和 system() 函数调用系统命令,
它们四者的区别如下:
shell_exec()
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
也就是说, PHP先运行一个 shell 环境, 然后让 shell 进程运行你的命令, 并且把所有输出以字符串形式返回, 如果程序执行有错误或者程序没有任何输出, 则返回 null。
exec()
与 shell_exec() 不一样, exec 不会创建 shell 进程, 可以理解是 php 进程直接创建一个子进程, 运行指定的命令, 返回值只返回命令的最后一行, 所有的返回以参数形式返回。
passthru()
与 exec() 类似, 唯一不同的是, 命令的所有输出返回内容都不再导入到 PHP 环境, 而是直接作为输出内容, 返回到浏览器的输出上, 等效是把所有返回内容直接 echo 输出。
system()
这个方法和 passthru() 类似, 但是 system() 方法会在程序的每行输出的时候执行一次缓存输出动作, 可以理解为, 只要外部程序输出一行, php 就会马上把内容推送到浏览器, 无论这个内容是否足够大。
php通常为了输出效率, 都会有一个输出缓存, 会等到输出内容足够大之后, 再一次输出返回. system() 方法则强制输出内容立刻推送, 即使输出的内容只有一个字母. 如果客户端具有实时打印服务器的返回 http 内容流的能力, 就可以看到 system() 的实时推送效果。
已有1位网友发表了看法: