PHP 如何跟linux的软件交互呢,本质上是通过exec函数去处理的。当然,我们还是要简单分析一下具体场景。
分析场景
大多数情况下,这些需要交互的软件,是要通过shell命令调用的,这类的自然要通过exec去进行交互,然而有一些软件会内置rpc服务和http 的 接口服务,此类的软件是不需要通过exec去交互的,而是php作为一个http客户端去发起请求,这种场景下,我建议使用guzzle扩展进行处理,它使用起来非常优雅,不需要进行复杂的curl编写,推荐guzzle。
另一种场景,就是我们需要exec进行交互,比如ffmpeg来进行视频转码/封面截取、无头libreoffice进行文档转吗、调用常见的系统命令获取状态等等。本文将重点介绍此类场景的解决方案。
特殊的场景
在上面,我们介绍了几个常见的需求和软件,比如调用ffmpeg、无头libreoffice、获取命令状态等,我们先介绍一下对于这几个需求的特殊库。
php-ffmpeg/php-ffmpeg
这是一个专门用来调用ffmpeg的库,本质上还是通过exec去掉用,但是直接用exec调用很麻烦,要自己拼接字符传等等,既然有大佬贡献了这样的好用的轮子,我们自然要拿来用。
使用这个库来调用ffmpeg的方法非常简单,没有丑陋的字符串拼接,并且有安全的调用方式:
require 'vendor/autoload.php';
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('video.mpg');
$video
->filters()
->resize(new FFMpeg\Coordinate\Dimension(320, 240))
->synchronize();
$video
->frame(FFMpeg\Coordinate\TimeCode::fromSeconds(10))
->save('frame.jpg');
$video
->save(new FFMpeg\Format\Video\X264(), 'export-x264.mp4')
->save(new FFMpeg\Format\Video\WMV(), 'export-wmv.wmv')
->save(new FFMpeg\Format\Video\WebM(), 'export-webm.webm');
ncjoes/office-converter
这是一个专门又来调用libreoffice的库,能够实现html、pdf、各种文档之间的转换,具体支持的操作如下:
- pptx => pdf
- ppt => pdf
- pdf => pdf
- docx => pdf, odt, html
- doc => pdf, odt, html
- xlsx => pdf
- xls => pdf
- png => pdf
- jpg => pdf
- jpeg => pdf
使用起来非常的简单:
<?php
// 自动加载
use NcJoes\OfficeConverter\OfficeConverter;
$converter = new OfficeConverter('test-file.docx');
$converter->convertTo('output-file.pdf'); //转码输出
$converter->convertTo('output-file.html'); //转码输出
// 将内部附件解压至指定目录
$converter = new OfficeConverter('test-file.docx', 'path-to-outdir');
这个库本身也是利用的libreoffice和openoffice的命令操作,如果你认为这个库不够强大,还有其他扩展可以利用,以后有机会再讲。
linfo/linfo
这个库是专门用来获取系统状态的,比如:网络/torrents/cpu/内存/usb/pci/声卡/文件系统/raid阵列/ipmi/等。他内置了一个案例页面,效果如下:
更重要的是,这个库不仅仅可以在linux上使用,还可以在很多系统平台上使用,让我们避免去调用繁杂的shell命令再去文本匹配。
mikehaertl/php-shellcommand
与上面介绍的几个不同,这是专门用来调用第三方命令的,和exec函数比起来,他让我们写出来的代码更健壮,无需进行各种字符串拼接,并且拥有多种运行模式,健全的输出抓取。
相比exec,他拥有这些好处
- 捕捉:stdOut,stdErr,exitCode
- 处理复杂的参数
- 支持环境变量和其他参数
- 支持管道资源比如文件或流
- 可以超时执行
使用起来就像下面这样,非常简单。
<?php
$command = new Command('/bin/somecommand');
// Add arguments with correct escaping:
// results in --name='d'\''Artagnan'
$command->addArg('--name=', "d'Artagnan");
// Add argument with several values
// results in --keys key1 key2
$command->addArg('--keys', array('key1','key2'));
if (!$command->execute()) {
echo $command->getError();
} else {
echo $command->getOutput();
}
像这样的工具库,PHP还有很多,可以根据自己的喜好挑选,比如:
- symfony/process:他有一个实时捕获输出的模式,可以实现随时监听内容来进行其他操作
- spatie/ssh:这个库并不是直接调用exec命令,而是通过发起一个ssh连接进行操作
- mrrio/shellwrap:这个库利用PHP的魔术方法实现了非常酷的调用方法
以上就是本文的主要内容,以后有机会,会对上面提到的库一一介绍。
原文标题:PHP如何跟linux中的软件交互呢?
原文地址:https://phpreturn.com/index/a626e5966eac59.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。