때로는 PHP 애플리케이션에서 운영 체제 수준 명령을 사용해야 할 때가 있습니다. 이를 수행하는 방법을 살펴보고 개발자 경험을 더 좋게 만들 수 있는지 살펴보겠습니다.
지난 몇 년 동안 저는 코드 작성 방법과 코드 개선 방법의 모든 측면에 집중해 왔습니다. 저는 HTTP와의 통합을 보다 효율적이고 보다 객체 지향적으로 만드는 방법을 조사하는 것부터 시작했습니다. 저는 이것을 달성할 수 있는 방법을 찾았다고 믿으며 이제는 다른 곳에 관심을 집중하고 있습니다. [관련 추천: laravel 비디오 튜토리얼]
어떤 경우에는 애플리케이션에서 OS CLI를 사용하고 싶을 수도 있습니다. 웹 애플리케이션 또는 다른 CLI 애플리케이션에서. 과거에는 exec
, passthru
, shell_exec
및 system
과 같은 메서드를 사용했습니다. 그런 다음 Symfony Process 구성 요소가 등장했고 우리는 구원을 받았습니다. exec
或 passthru
或 shell_exec
和 system
的方法。然后出现了 Symfony Process 组件,我们得救了。
Symfony 进程组件使得与操作系统进程集成并获得输出变得非常容易。但是我们如何与这个库集成仍然有点令人沮丧。我们创建一个新进程,传入一个参数数组,使我们希望运行的命令。让我们来看看:
$command = new Process( command: ['git', 'push', 'origin', 'main'], ); $command->run();
这种方法有什么问题?好吧,老实说,什么都没有。但是有没有办法改善开发人员的体验?假设我们从 git 切换到 svn(我不太可能知道)。
为了改善开发人员的体验,首先,我们需要了解逻辑上用于创建 OS 命令的组件。我们可以将它们分解为:
- 可执行的
- 参数
我们的可执行文件是我们直接与之交互的东西,例如 php、git、brew 或我们系统上任何其他已安装的二进制文件。然后争论是我们如何互动;这些可以是子命令、选项、标志或参数。
因此,如果我们稍微抽象一下,我们就会有一个process
和一个command
, 它接受参数。我们将使用接口/契约来定义我们的组件来控制我们的工作流程应该如何工作。让我们从流程契约开始:
declare(strict_types=1); namespace JustSteveKing\OS\Contracts; use Symfony\Component\Process\Process; interface ProcessContract { public function build(): Process; }
我们这里是说每个进程都必须能够被构建,并且创建的进程的结果应该是一个 Symfony 进程。我们的流程应该构建一个命令供我们运行,所以现在让我们看看我们的命令契约:
declare(strict_types=1); namespace JustSteveKing\OS\Contracts; interface CommandContract { public function toArgs(): array; }
我们希望从命令中得到的主要内容是能够作为参数返回,我们可以将这些参数作为命令传递给 Symfony 进程。
想法已经够多了,让我们来看一个真实的例子。我们将使用 git 作为示例,因为我们大多数人应该能够与 git 命令相关联。
首先,让我们创建一个 Git 进程来实现我们刚刚描述的 Process Contract:
class Git implements ProcessContract { use HandlesGitCommands; private CommandContract $command; }
我们的流程实现了合约,并有一个命令属性,我们将使用它允许我们的流程被流畅地构建和执行。我们有一个特点,可以让我们集中精力为我们的 Git 流程构建和制造事物的方式。让我们看一下:
trait HandlesGitCommands { public function build(): Process { return new Process( command: $this->command->toArgs(), ); } protected function buildCommand(Git $type, array $args = []): void { $this->command = new GitCommand( type: $type, args: $args, ); } }
因此,我们的 trait 展示了流程契约本身的实现,并提供了有关如何构建流程的说明。它还包含一个允许我们抽象构建命令的方法。
到目前为止,我们可以创建一个流程并建立一个潜在的命令。但是,我们还没有下达命令。我们在 trait 中创建一个新的 Git 命令,它使用 Git 类作为类型。让我们看看另一个 Git 类,它是一个枚举。不过,我将展示一个精简版本 - 实际上,你希望它映射到你希望支持的所有 git 子命令:
enum Git: string { case PUSH = 'push'; case COMMIT = 'commit'; }
然后我们将它传递给 Git 命令:
final class GitCommand implements CommandContract { public function __construct( public readonly Git $type, public readonly array $args = [], public readonly null|string $executable = null, ) { } public function toArgs(): array { $executable = (new ExecutableFinder())->find( name: $this->executable ?? 'git', ); if (null === $executable) { throw new InvalidArgumentException( message: "Cannot find executable for [$this->executable].", ); } return array_merge( [$executable], [$this->type->value], $this->args, ); } }
在这个类中,我们接受来自 Process 的参数,当前由我们的 HandledGitCommands trait 处理。然后我们可以把它变成 Symfony 进程可以理解的参数。我们使用 Symfony 包中的 ExecutableFinder
use JustSteveKing\OS\Commands\Types\Git as SubCommand; class Git implements ProcessContract { use HandlesGitCommands; private CommandContract $command; public function push(string $branch): Process { $this->buildCommand( type: SubCommand:PUSH, args: [ 'origin', $branch, ], ); return $this->build(); } }이 접근 방식에 어떤 문제가 있나요? 글쎄요, 솔직히 아무것도 아닙니다. 하지만 개발자 경험을 향상시킬 수 있는 방법이 있을까요? git에서 svn으로 전환한다고 가정해 봅시다(저는 잘 모르겠습니다). 개발자 경험을 향상하려면 먼저 OS 명령을 생성하는 데 논리적으로 사용되는 구성 요소를 이해해야 합니다.
- 실행 파일
- 매개 변수
$git = new Git(); $command = $git->push( branch: 'main', ); $result = $command->run();여기서 말하는 것은 모든 프로세스가 구축 가능해야 하며 생성된 프로세스의 결과는 Symfony 프로세스여야 한다는 것입니다. 우리 프로세스는 우리가 실행할 명령을 작성해야 하므로 이제 명령 계약을 살펴보겠습니다. 🎜rrreee🎜 명령에서 우리가 원하는 가장 중요한 것은 이를 매개변수로 반환할 수 있다는 것입니다. 이를 Symfony에 명령으로 전달할 수 있습니다. 프로세스. 🎜🎜아이디어는 충분하고 실제 사례를 살펴보겠습니다. 우리 대부분은 git 명령과 관련될 수 있어야 하므로 git을 예로 사용하겠습니다. 🎜🎜먼저 방금 설명한 프로세스 계약을 구현하는 Git 프로세스를 만들어 보겠습니다. 🎜rrreee🎜 우리 프로세스는 계약을 구현하고 프로세스가 원활하게 구축되고 실행될 수 있도록 하는 데 사용할 명령 속성을 갖습니다. Git 프로세스를 구축하고 만드는 방식에 집중할 수 있는 기능이 있습니다. 살펴보겠습니다: 🎜rrreee🎜 따라서 우리의 특성은 프로세스 계약 자체의 구현을 보여주고 프로세스를 구축하는 방법에 대한 지침을 제공합니다. 또한 빌드 명령을 추상화할 수 있는 메서드도 포함되어 있습니다. 🎜🎜지금까지 우리는 프로세스를 생성하고 잠재적인 명령을 구축할 수 있습니다. 그러나 우리는 아직 명령을 내리지 않았습니다. Git 클래스를 유형으로 사용하여 특성에 새로운 Git 명령을 만듭니다. 열거형인 또 다른 Git 클래스를 살펴보겠습니다. 그러나 간단한 버전을 보여드리겠습니다. 기본적으로 지원하려는 모든 git 하위 명령에 매핑되기를 원합니다. 🎜rrreee🎜 그런 다음 이를 Git 명령에 전달합니다. 🎜rrreee🎜 이 수업에서는 요청을 수락합니다. 현재 HandledGitCommands 특성에 의해 처리되는 프로세스 매개변수에서. 그런 다음 이를 Symfony 프로세스가 이해할 수 있는 매개변수로 변환할 수 있습니다. 경로 오류를 최소화하기 위해 Symfony 패키지의
ExecutableFinder
를 사용합니다. 그러나 실행 파일을 찾을 수 없는 경우에도 예외를 발생시키고 싶습니다. 🎜🎜Git 프로세스에 넣으면 다음과 같이 보입니다. 🎜rrreee🎜이제 남은 일은 PHP 애플리케이션에서 git을 훌륭하게 사용할 수 있도록 코드 자체를 실행하는 것입니다. 🎜rrreee🎜결과 Push 메소드를 사용하면 심포니 프로세스와 상호 작용할 수 있습니다. 즉, 반대쪽 끝에서 명령을 사용하여 모든 정렬을 수행할 수 있다는 의미입니다. 우리가 변경한 유일한 것은 이 프로세스 생성을 중심으로 객체 지향 래퍼를 구축하는 것이었습니다. 이를 통해 컨텍스트를 잘 개발 및 유지하고 테스트 가능하고 확장 가능한 방식으로 확장할 수 있습니다. 🎜🎜애플리케이션에서 운영 체제 명령을 얼마나 자주 사용하시나요? 사용 사례를 생각해 볼 수 있나요? 여러분이 직접 사용해 보고 OS 통합을 개선할 수 있는지 확인할 수 있도록 GitHub 저장소에 🎜샘플 코드를 게시🎜했습니다. 🎜좋은 예로는 SSH, MySQL, Anable 또는 Terraform이 있습니다! 항상 타사 패키지를 사용할 필요 없이 일정에 따라 Laravel Artisan에서 MySQL 덤프를 효율적으로 실행할 수 있다고 상상해 보십시오!
원본 주소: https://laravel-news.com/working-with-os-process-in-php
번역 주소: https://learnku.com/laravel/t/71422
더 보기 프로그래밍 관련 지식은 프로그래밍 비디오를 방문하세요! !
위 내용은 PHP 애플리케이션에서 시스템 명령을 호출하는 올바른 방법에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

phpsession 실패 이유에는 구성 오류, 쿠키 문제 및 세션 만료가 포함됩니다. 1. 구성 오류 : 올바른 세션을 확인하고 설정합니다. 2. 쿠키 문제 : 쿠키가 올바르게 설정되어 있는지 확인하십시오. 3. 세션 만료 : 세션 시간을 연장하기 위해 세션을 조정합니다 .GC_MAXLIFETIME 값을 조정하십시오.

PHP에서 세션 문제를 디버그하는 방법 : 1. 세션이 올바르게 시작되었는지 확인하십시오. 2. 세션 ID의 전달을 확인하십시오. 3. 세션 데이터의 저장 및 읽기를 확인하십시오. 4. 서버 구성을 확인하십시오. 세션 ID 및 데이터를 출력, 세션 파일 컨텐츠보기 등을 통해 세션 관련 문제를 효과적으로 진단하고 해결할 수 있습니다.

Session_Start ()로 여러 통화를하면 경고 메시지와 가능한 데이터 덮어 쓰기가 발생합니다. 1) PHP는 세션이 시작되었다는 경고를 발행합니다. 2) 세션 데이터의 예상치 못한 덮어 쓰기를 유발할 수 있습니다. 3) Session_status ()를 사용하여 반복 통화를 피하기 위해 세션 상태를 확인하십시오.

SESSION.GC_MAXLIFETIME 및 SESSION.COOKIE_LIFETIME을 설정하여 PHP에서 세션 수명을 구성 할 수 있습니다. 1) SESSION.GC_MAXLIFETIME 서버 측 세션 데이터의 생존 시간을 제어합니다. 2) 세션 .Cookie_Lifetime 클라이언트 쿠키의 수명주기를 제어합니다. 0으로 설정하면 브라우저가 닫히면 쿠키가 만료됩니다.

데이터베이스 스토리지 세션 사용의 주요 장점에는 지속성, 확장 성 및 보안이 포함됩니다. 1. 지속성 : 서버가 다시 시작 되더라도 세션 데이터는 변경되지 않아도됩니다. 2. 확장 성 : 분산 시스템에 적용하여 세션 데이터가 여러 서버간에 동기화되도록합니다. 3. 보안 : 데이터베이스는 민감한 정보를 보호하기 위해 암호화 된 스토리지를 제공합니다.

SessionHandlerInterface 인터페이스를 구현하여 PHP에서 사용자 정의 세션 처리 구현을 수행 할 수 있습니다. 특정 단계에는 다음이 포함됩니다. 1) CustomsessionHandler와 같은 SessionHandlerInterface를 구현하는 클래스 만들기; 2) 인터페이스의 방법 (예 : Open, Close, Read, Write, Despare, GC)의 수명주기 및 세션 데이터의 저장 방법을 정의하기 위해 방법을 다시 작성합니다. 3) PHP 스크립트에 사용자 정의 세션 프로세서를 등록하고 세션을 시작하십시오. 이를 통해 MySQL 및 Redis와 같은 미디어에 데이터를 저장하여 성능, 보안 및 확장 성을 향상시킬 수 있습니다.

SessionId는 웹 애플리케이션에 사용되는 메커니즘으로 사용자 세션 상태를 추적합니다. 1. 사용자와 서버 간의 여러 상호 작용 중에 사용자의 신원 정보를 유지하는 데 사용되는 무작위로 생성 된 문자열입니다. 2. 서버는 쿠키 또는 URL 매개 변수를 통해 클라이언트로 생성하여 보낸다. 3. 생성은 일반적으로 임의의 알고리즘을 사용하여 독창성과 예측 불가능 성을 보장합니다. 4. 실제 개발에서 Redis와 같은 메모리 내 데이터베이스를 사용하여 세션 데이터를 저장하여 성능 및 보안을 향상시킬 수 있습니다.

JWT 또는 쿠키를 사용하여 API와 같은 무국적 환경에서 세션을 관리 할 수 있습니다. 1. JWT는 무국적자 및 확장 성에 적합하지만 빅 데이터와 관련하여 크기가 크다. 2. 쿠키는보다 전통적이고 구현하기 쉽지만 보안을 보장하기 위해주의해서 구성해야합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음
