보일러 플레이트 코드없이 강력하고 안정적인 PHP 멀티 프로세스 데몬을 만듭니다. 코어 데몬 클래스는 기본 루프 및 이벤트를 처리하며 원하는 주파수 (PHP의 한계 내) 에서 실행할 수 있습니다. 선택적으로 백그라운드에서 데몬 프로세스를 실행하려면 단일 메소드 execute 만 구현하면됩니다.
작업과 작업자를 사용하여 데몬은 지게차의 어린이 관리에 대해 걱정하지 않고 배경 프로세스의 방법을 원활하게 호출 할 수 있습니다. 플러그인을 사용하면 데몬에 대한 재사용 가능하고 공유 가능한 코드를 쉽게 만들 수 있습니다. 자세한 내용은 아래 기능 섹션을 참조하십시오.
분명히, PHP에서 강력하고 안정적이며 장기적인 데몬을 쓰는 것은 일반적으로 좋은 생각이 아닙니다. 적어도 매우 어렵고 잘합니다. 나는 주요 백엔드 데몬이 필요한 Symfony에 전체 웹 사이트 프레임 워크가 내장되어 있었기 때문에 개인적으로 PHP에 데몬이 필요했습니다. 리소스 또는 구성을 복제하는 모든 프론트 엔드 종속성 및 엔티티를 재사용 할 수 있기를 원했습니다.
이 라이브러리는 록 견고한 데몬을 만들 수 있도록 최선을 다하고 있지만, 내 안정을 유지하려면 사용자 지구 코드에서주의를 기울여야합니다.
문서는 위키를 참조하십시오.
실행할 수있는 예제는 예제 디렉토리를 참조하십시오.
Main Loop 코어 데몬 클래스에 의해 유지됩니다. 모든 루프 사이클을 호출하는 하나의 메소드 execute 구현하기 만하면됩니다. 루프 주파수는 몇 초 만에 분수 값이 될 수 있습니다. 0으로 설정하면 execute 방법이 가능한 빨리 호출됩니다 ( 루프가 일종의 차단 호출, 즉 소켓 듣기 등을 수행하지 않는 한 일반적으로 권장되지 않습니다 .작업을 통해 배경 프로세스에서 메소드 또는 콜백을 호출 할 수 있습니다. 배경 과정과 부모 사이에 의사 소통이 없습니다. 작업은 예를 들어 이메일을 보내는 것과 같은 간단한 것들을위한 것입니다.
작업자를 사용하면 객체의 모든 메소드 또는 작업과 같은 간단한 콜백을 호출 할 수 있습니다. 근로자는 근로자 방법의 간단한 return 명령문을 통해 부모에게 값을 되돌릴 수 있습니다. 근로자는 자동으로 유지되며 동시에 여러 어린이가 달리면 투명하게 처리됩니다. 작업자가 OS에 의해 사망하거나 사망하더라도 데몬 API는 여전히 코드에 결과 (또는 예외)를 반환합니다. 작업자의 반환 값은 일반적으로 Promise 대상입니다. 그런 then 표준 약속 방법을 사용하여 반품 값에 otherwise 행동 할 수 있습니다. 또는 작업자에게 ON_RETURN 콜백을 등록 할 수 있습니다.
작업자는 중재자 설계 패턴을 사용하고 메시징 큐 및 데이터에 공유 메모리를 사용합니다. 부모와 어린이 사이의 대체 커뮤니케이션 방법을 제공하기 위해 다른 IPC 클래스를 만들 수 있습니다. SHM 대신 소켓을 사용하여 대체 선택을 제공하는 두 번째 IPC 클래스에서 작업 할 수 있습니다 .
Daemon 에는 콜백을 등록하여 쉽게 인터페이스 할 수있는 몇 가지 이벤트 (참조 : 이벤트)가 있습니다. 일부 사건은 데몬의 동작을 바꿀 수있는 수단이 있습니다.ON_SIGNAL 콜백을 등록해야합니다. 콜백에는 잡힌 신호가있는 SignalEvent 전달됩니다.Plugin 아키텍처를 사용하면 데몬에 주입 할 수있는 고유 한 플러그인을 사용하고 만들 수 있습니다. 플러그인을 게으르게로드 할 수 있습니다.FileLock 사용하면 잠금 장치를 추가하여 데몬이 한 번에 하나 이상의 인스턴스를 실행하지 못하게 할 수 있습니다. 데몬에 플러그인을 등록하면 나머지는 자동입니다. ShmLock 은 비슷하지만 공유 메모리를 사용하여 잠금을 얻습니다.Daemon 에는 log , error , debug 세 가지 기본 로깅 방법이 있습니다. 이 모든 것은 로그 파일에 쓸 것입니다 (구성된 경우). 로그 파일이 회전, 덮어 쓰기 또는 삭제되면 데몬은 자동으로이를 감지하고 새 로그 파일에 계속 쓸 것입니다. Daemonevent :: ON_LOG 이벤트를 사용하면 동작을 변경하기 위해 콜백을 등록 할 수 있습니다. 사용자 코드는 로그 라이트를 사용하여 코드에 기본 데몬 로깅을 쉽게 추가 할 수 있습니다.이 도서관의 기초는 Github의 Shane Harter의 PHP-Daemon 라이브러리에서 영감을 얻었습니다. 불행하게도, 그의 도서관은 버려 졌거나 (또는 무기한 hiatus에 있고) PHP v5.3을 위해 작성되었으며, 네임 스케이팅, 패키지 관리 또는 자동 로더 (예 : 작곡가)가 없었습니다.
나는 교육 목적으로 그의 원본 도서관을 포킹하고 수정하는 대신 완전히 새로운 도서관을 만들도록 선택했습니다. 나는 또한 그의 방법론에 동의하지 않았다. 나는 몇 가지 추가 종속성이 필요하지만 작곡가는 이것을 사소한 문제로 만듭니다.
_이 라이브러리는 완전히 작동 상태입니다. 나는 메모리 누출이나 충돌로 몇 달 동안 달리는 매우 복잡한 데몬을 만들었습니다. 더 많은 일을 할 수 있습니다 ...