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

PHP 如何跟linux的软件交互呢,本质上是通过exec函数去处理的。当然,我们还是要简单分析一下具体场景。

分析场景

大多数情况下,这些需要交互的软件,是要通过shell命令调用的,这类的自然要通过exec去进行交互,然而有一些软件会内置rpc服务和http 的 接口服务,此类的软件是不需要通过exec去交互的,而是php作为一个http客户端去发起请求,这种场景下,我建议使用guzzle扩展进行处理,它使用起来非常优雅,不需要进行复杂的curl编写,推荐guzzle。

特殊的场景

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

php-ffmpeg/php-ffmpeg

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

使用这个库来调用ffmpeg的方法非常简单,没有丑陋的字符串拼接,并且有安全的调用方式:

require 'vendor/autoload.php';$ffmpeg = FFMpegFFMpeg::create();$video = $ffmpeg->open('video.mpg');$video    ->filters()    ->resize(new FFMpegCoordinateDimension(320, 240))    ->synchronize();$video    ->frame(FFMpegCoordinateTimeCode::fromSeconds(10))    ->save('frame.jpg');$video    ->save(new FFMpegFormatVideoX264(), 'export-x264.mp4')    ->save(new FFMpegFormatVideoWMV(), 'export-wmv.wmv')    ->save(new FFMpegFormatVideoWebM(), '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 NcJoesOfficeConverterOfficeConverter;$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的魔术方法实现了非常酷的调用方法
  • 声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2022年4月1日
    下一篇 2022年4月1日

    相关推荐