laravel_进程门面_简单介绍

文章目录

Facade是什么?

在 Laravel 框架中,Facade 是一种设计模式。

它提供了一种简洁、静态的接口来访问应用程序容器中的底层类

Facade充当了底层类的一个「静态代理」

这意味着你可以通过静态方法调用容器中的服务,而无需手动解析实例化这些服务。

在 Laravel 中,Process Facade 对应的底层类是 Illuminate\Console\Process

但通过使用 Facade,你无需直接关心这个底层的实现细节。

Facade能干什么

具体到 Process Facade,它是 Laravel 提供的一个门面,用于简化与外部进程交互的过程

通过使用 Process Facade,你可以方便地启动和管理系统进程 ,而无需直接使用 PHP 的 proc_openproc_close 等底层函数。


Facade有哪些方法?

Process Facade 提供了一系列静态方法,允许你创建和管理进程,例如:

  • command($command, $options = []):
    • 运行一个外部命令、并返回一个 Symfony\Component\Process\Process 实例。
  • mustRun($command, $options = [], &$output = null):
    • 运行一个命令,并确保它成功执行。
    • 如果命令执行失败,将抛出一个异常。
  • fromShellCommandline($command, $cwd = null, array $env = null, array $input = null, int &$exitcode = null):
    • 创建一个新的 Process 实例。
    • 该实例从 shell 命令行中解析命令。

怎么使用Facade呢?

在 Laravel 中使用 Process Facade 非常简单,

你只需要在代码文件的开头引入它,然后就可以使用其提供的静态方法来操作进程了。

例如:

php 复制代码
use Illuminate\Support\Facades\Process;

$process = Process::fromShellCommandline('ls -lart');

$process->run();

// 获取输出信息
$output = $process->getOutput();

// 获取退出码
$exitCode = $process->getExitCode();

使用 Facade 的好处在于它提供了简洁的语法,并且使得代码更加易于阅读和维护。

同时,Facade 还使得底层类的实现、可以更容易地进行替换或修改,而无需修改使用这些类的代码

详细的代码解释

php 复制代码
// 引入 Laravel 的 Process 门面
// 它提供了对底层进程处理类的静态访问方式。
use Illuminate\Support\Facades\Process;

// 使用 Process 门面的 fromShellCommandline 静态方法
// 创建一个新的进程实例。
// 
// 该方法接受一个 shell 命令(在这个例子中是 'ls -lart'),并返回一个 Process 实例。
// 
// 'ls -lart' 是一个在 Unix 和类 Unix 系统
// (如 Linux)中常见的命令,
// 用于列出当前目录下的所有文件和文件夹,
// 显示详细信息(包括权限、所有者、大小等),
// 并按文件修改时间降序排列。
$process = Process::fromShellCommandline('ls -lart');

// 调用 Process 实例的 run 方法来
// 执行之前通过 fromShellCommandline 方法设置的命令。
// 
// 这个方法会阻塞当前 PHP 进程,直到 shell 命令执行完成。
$process->run();

// 在命令执行完成后,使用 Process 实例的 getOutput 方法来获取命令的输出。
// 
// 这个输出通常是一个字符串,包含了命令执行后在标准输出(stdout)上打印的所有内容。
// 这里将这个输出存储在 $output 变量中。
$output = $process->getOutput();

// 使用 Process 实例的 getExitCode 方法来获取命令执行后的退出码。
// 
// 退出码是一个整数,通常用于表示命令执行的成功与否。
// 按照惯例,退出码为 0 表示成功,非零值表示出现了某种错误。
// 这里将这个退出码存储在 $exitCode 变量中。
$exitCode = $process->getExitCode();

到这里是不是就理解了,原来可以使用laravel去执行shell命令等等东西。

原来是这种用途的呀。

真是有意思,有意思。

Symfony Process是什么?

在 Laravel 中,Process 门面实际上是对 Symfony Process 组件的一个封装。

Symfony Process 组件提供了一套丰富的 API 来处理 PHP 与外部进程的交互,

包括运行命令、获取输出、处理错误、等待进程结束等。

Laravel 通过引入这个组件,并以门面的形式提供静态访问接口,

简化了在 Laravel 应用程序中执行外部命令和处理进程输出的过程。

需要注意的是,虽然上面的代码展示了如何使用 Process 门面来执行一个简单的 shell 命令并获取其输出和退出码,

但在实际的生产环境中,执行外部命令可能会带来安全风险,

特别是当命令的内容来自不可信的来源时。

因此,在使用 Process 门面或类似的工具时,应确保仔细验证和过滤输入,以防止命令注入等安全漏洞

介绍Symfony

在法语中,"symfony"是一个复数形式,意为"和谐"或"和谐的声音"。


Symfony是一款免费开源的网页框架,与一组可PHP重用的开发组件资源程序库。

在MIT License许可下发行。

2005年10月18日,其官方网站symfony-project.com对外开放。

这TM都快20年了,真实不简单呀。

Symfony致力于减少重复代码的编写,以加速Web应用的开发和维护。

Symfony与许多关系型数据库集成的也非常好,成本也较小。

Symfony致力于在企业背景下创建健壮的应用,同时也给予了开发者强大的配置功能:

文件结构外部目录,几乎所有的东西都可以自定义。

Symfony也捆绑了一些诸如测试调试文档生成额外的工具来满足企业的开发过程。


Symfony 受到了 Spring Framework 的启发。

它使用了以下一些PHP开源项目的部分功能。

  • Propel (PHP) 或 Doctrine (PHP):用作对象关系映射(ORM)

  • PDO 数据库抽象层

  • PHPUnit: 单元测试框架

  • Twig:用作模板引擎


Symfony 也使用自己创作的组件,这些组件可以在Symfony组件网站上免费获得,用于其他各种项目:

  • Symfony YAML, 一个 YAML 转译器

  • Symfony Event Dispatcher

  • Symfony Dependency Injector, 依赖注入器

  • Symfony Templating, 页面板块引擎


Sensio是Symfony的赞助商,它是一家法国Web代理商。

起先Symfony使用Sensio Framework作为该项目的名字,

因此代码中所有的类名前都加上了"sf"前缀。

当它决定以开源形式发布时,便以Symfony作为名称(Symfony的英文缩写也是sf)。

这个东西原来是有法国背景的,难怪的。


一款开源的Q&A服务Askeet就是使用Symfony开发的。

包括拥有2000万用户的Yahoo Bookmarks,也是使用Symfony开发的。

Yahoo Bookmarks,也被称为"雅虎书签",是一种网络存储服务。

使用户能够从任何联网的电脑上访问他们的书签。

这种服务提供了两种方式来组织书签:

文件夹方式(Use Folders)标签方式(Use Tags)

同时,用户可以选择三种方式来查看他们的书签:全方式列表式图标式


网站地址是:https://symfony.com/

这个东西现在还在更新的,具体的版本情况看下面的图片:

总结

laravel框架当中使用了symfony process组件,并且使用Facade来简化操作。

相关推荐
2401_857439697 小时前
SSM 架构下 Vue 电脑测评系统:为电脑性能评估赋能
开发语言·php
拭心9 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王11 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡12 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道12 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库13 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
Smile灬凉城66613 小时前
反序列化为啥可以利用加号绕过php正则匹配
开发语言·php
元争栈道13 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe14 小时前
Android Hook - 动态加载so库
android
居居飒14 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin