另一种场景,便是我们须要exec进行交互,比如ffmpeg来进行视频转码/封面截取、无头libreoffice进行文档转吗、调用常见的系统命令获取状态等等。
本文将重点先容此类场景的办理方案。

分外的场景

在上面,我们先容了几个常见的需求和软件,比如调用ffmpeg、无头libreoffice、获取命令状态等,我们先先容一下对付这几个需求的分外库。

php-ffmpeg/php-ffmpeg

这是一个专门用来调用ffmpeg的库,实质上还是通过exec去调用,但是直接用exec调用很麻烦,要自己拼接字符串等等,既然有大佬贡献了这样的好用的轮子,我们自然要拿来用。

php与linuxPHP若何跟linux中的软件交互呢 Ruby

利用这个库来调用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 => pdfppt => pdfpdf => pdfdocx => pdf, odt, htmldoc => pdf, odt, htmlxlsx => pdfxls => pdfpng => pdfjpg => pdfjpeg => 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的魔术方法实现了非常酷的调用方法

以上便是本文的紧张内容,往后有机会,会对上面提到的库逐一先容。