PHP如何跟linux中的软件交互呢?

2022-05-01 奥古斯宏

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、各种文档之间的转换,具体支持的操作如下:

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

  • 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,他拥有这些好处

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

  • 捕捉: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的魔术方法实现了非常酷的调用方法

以上就是本文的主要内容,以后有机会,会对上面提到的库一一介绍。


评论
点击登录