PHPackages                             digitalstars/daemon - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [CLI &amp; Console](/categories/cli)
4. /
5. digitalstars/daemon

ActiveLibrary[CLI &amp; Console](/categories/cli)

digitalstars/daemon
===================

Library for easy work and create PHP Daemons

v1.0.5(5y ago)33521MITPHPPHP &gt;=7.1

Since Oct 20Pushed 4y ago2 watchersCompare

[ Source](https://github.com/digitalstars/Daemon)[ Packagist](https://packagist.org/packages/digitalstars/daemon)[ RSS](/packages/digitalstars-daemon/feed)WikiDiscussions master Synced 5d ago

READMEChangelog (6)DependenciesVersions (7)Used By (1)

SimpleDaemon
============

[](#simpledaemon)

[![php version](https://camo.githubusercontent.com/a96f4636d1e660d89c29bdbe4e81918e0a60f8b983f283effdf38256c4050144/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6469676974616c73746172732f4461656d6f6e)](https://camo.githubusercontent.com/a96f4636d1e660d89c29bdbe4e81918e0a60f8b983f283effdf38256c4050144/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f6469676974616c73746172732f4461656d6f6e)[![downloads](https://camo.githubusercontent.com/638a57dc413ff581fd55b669ea8ceff19a2d85fafc19d57cdb7248d5190a8636/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6469676974616c73746172732f4461656d6f6e)](https://camo.githubusercontent.com/638a57dc413ff581fd55b669ea8ceff19a2d85fafc19d57cdb7248d5190a8636/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f6469676974616c73746172732f4461656d6f6e)[![repo size](https://camo.githubusercontent.com/680ef048d98c0301b196bf52ffacf76fc26c3b143045e58ebba11fd5ef0cff97/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f6469676974616c73746172732f4461656d6f6e)](https://camo.githubusercontent.com/680ef048d98c0301b196bf52ffacf76fc26c3b143045e58ebba11fd5ef0cff97/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7265706f2d73697a652f6469676974616c73746172732f4461656d6f6e)[![License](https://camo.githubusercontent.com/7ecddc0f5959227649b2a334f49eefbc03c2298ad628affe89e9b0183eaeeefa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6469676974616c73746172732f4461656d6f6e)](https://camo.githubusercontent.com/7ecddc0f5959227649b2a334f49eefbc03c2298ad628affe89e9b0183eaeeefa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f6469676974616c73746172732f4461656d6f6e)

#### Комьюнити:

[](#комьюнити)

[Беседа ВК (Помощь)](https://vk.me/join/AJQ1dzQRUQxtfd7zSm4STOmt)### Почему SimpleDaemon?

[](#почему-simpledaemon)

- Легковесность — Daemon не тянет за собой кучу тяжёлых библиотек, в зависимостях только модули PHP, необходимые для работы
- Универсальность и простота — Несмотря на свою легковесность и простоту, Daemon является универсальным и гибким решением, предоставляющим функционал, которого хватит в большинстве случаев
- Многопоточность — при всём при этом присутствует многопоточная обработка данных (только для Linux)

### Функционал

[](#функционал)

В библиотеке содержится 2 модуля:

- Сервер — Обрабатывает какие-то данные, переданные клиентом, поддерживается также работа в многопоточном режиме (Только для Linux систем)
- Клиент — может быть подключен к любому файлу php для моментальной отправки данных серверу, и вызова методов сервера

### Как это работает и зачем оно нужно

[](#как-это-работает-и-зачем-оно-нужно)

На сервере могут быть реализованы функции, которые требуют достаточно больших вычислений и ничего не возвращают. Клиент может быстро вызывать эти функции и передавать в них данные (если все процессы демона заняты, то вызовы будут копиться в очереди). При этом, после того как функция завершится на сервере, вернуть какое-то значение из неё клиенту обратно не возможно (из-за отсутствия в PHP асинхронности).

Типичный пример когда это может пригодится — логирование чего нибудь или сложные вычисления. Представим, что у вас есть веб сервер, который обрабатывает какие-нибудь запросы, и где-то среди этих запросов нужно провести вычисления сложной функции, а результат записать в базу данных (не возвращая в качестве ответа). В таком случае, вычисление значения и запись его в БД можно перенести в скрипт сервера демона, а внутри скрипта обрабатываемого веб сервером инициализировать клиент демона, который просто вызовет функцию с передачей необходимых параметров, и не дожидаясь её выполнения вернёт пользователю запрошенную информацию. Схематичный пример ниже

[![](https://camo.githubusercontent.com/d39ad2c2142793118fd90f11e3259afd93bf3a57ff83daa517eb864d18a68679/68747470733a2f2f73766773686172652e636f6d2f692f5f5a612e737667)](https://svgshare.com/s/_Za)

### Оглавление

[](#оглавление)

- [Подключение](#%D0%9F%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5)
- [Сервер](#%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80)
    - [Инициализация сервера](#%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0)
    - [Методы настройки сервера](#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0)
        - [isLog($is = true)](#islogis--true) - перенаправление вывода в файл или игнорирование вывода
        - [isMultiThread()](#ismultithread) - включение многопоточности
        - [maxThreads(int $count)](#maxthreadsint-count) - максимальное число дочерних процессов
        - [maxSize(int $size)](#maxsizeint-size) - установка максимального размера сообщения
    - [Основные методы сервера](#%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0)
        - [init($func)](#initfunc) - инициализация сервера
        - [errorHandler($func)](#errorhandlerfunc) - обработка ошибок
        - [module($id, $func)](#moduleid-func) - регистрация функции, которую может вызвать клиент (**Основной функционал сервера демона тут**)
    - [Служебные методы сервера](#%D1%81%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0) - это крайние случаи, у всех этих методов есть аналогичные консольные команды
        - [bool clear()](#bool-clear) - очистка очереди сообщений
        - [stop()](#stop) - остановка сервера
        - [kill()](#kill) - принудительная остановка сервера
        - [int isActive()](#int-isactive) - проверка, запущен ли сейчас демон
        - [run()](#run) - запуск демона
    - [Управление работой сервера](#%D1%83%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BE%D0%B9-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0) - управление работой сервера демона через консольные команды
- [Клиент](#%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82)
    - [Инициализация клиента](#%D0%B8%D0%BD%D0%B8%D1%86%D0%B8%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0)
    - [Методы клиента](#%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0)
        - [errorHandler($func)](#errorhandlerfunc-1) - обработка ошибок клиента
        - [send($module\_id, $msg = \[\])](#sendmodule_id-msg--) - вызов функций сервера и отправка параметров (**Основной функционал клиента демона тут**)

Подключение
-----------

[](#подключение)

### Используя composer

[](#используя-composer)

1. Установить

```
composer require digitalstars/daemon

```

2. Подключить `autoload.php`

```
require_once "vendor/autoload.php";
```

### Вручную

[](#вручную)

1. Скачать последний релиз c [github](https://github.com/digitalstars/Daemon)
2. Подключить `autoload.php`.

> Вот так будет происходить подключение, если ваш скрипт находится в той же папке, что и папка `daemon-master`

```
require_once "daemon-master/autoload.php";
```

Сервер
------

[](#сервер)

Сервер представляет собой отдельный PHP скрипт, в котором реализованы методы для обработки данных. Этот скрипт запускается и работает в фоновом режиме, не зависимо от других скриптов. Для управления состоянием сервера предусмотрены консольные команды. Одновременно может быть запущенно несколько серверов.

> Клиент соединяется с сервером по ID при инициализации. Важно чтобы они совпадали!

Инициализация сервера
---------------------

[](#инициализация-сервера)

```
require_once "vendor/autoload.php"; // Подключаем файлы
use DigitalStars\Daemon\Server; // Подключаем класс Server

$s = new Server(9); // Инициализируем демона с ID = 9
```

Также для удобства поддерживается инициализация через метод `Create`

```
$s = Server::create(9);
```

Методы настройки сервера
------------------------

[](#методы-настройки-сервера)

> Все методы настройки возвращают $this. По этому их можно вызывать цепочкой вызовов сразу после инициализации через метод Server::create()
> Пример: \\
>
> ```
> $s = Server::create(9)->isLog(false)->isMultiThread()->maxThreads(4);
> ```

### isLog($is = true)

[](#islogis--true)

Метод для управления легированием. Если указать `true`, то в директории скрипта создастся новая директория `daemon_logs`, в которой 3 файла с логами:

- error.log - содержит ошибки, возникшие во время работы
- application.log - становится стандартным выводом (все сообщения, которые должны были выводится в консоль при нормальной работе скрипта будут в этом файле)
- daemon.log - тоже ошибки возникшие во время работы, но уже другой тип ошибок

Если выключить логирование, то вывод ошибок и прочих сообщений будет просто игнорироваться.

### isMultiThread()

[](#ismultithread)

Метод активирует многопоточную обработку данных, активировать многопоточность можно только если в php присутствует модуль `ext-pcntl`. Если модуля нет, то будет сгенерировано исключение

### maxThreads(int $count)

[](#maxthreadsint-count)

Устанавливает максимальное количество дочерних процессов, если многопоточность удалось включить.

#### maxSize(int $size)

[](#maxsizeint-size)

Метод для установки максимального размера сообщения. Подробнее об этому можно почитать [тут](https://www.php.net/manual/ru/function.msg-receive.php) (параметр max\_message\_size).

> Если не уверены, то лучше не трогать

Основные методы сервера
-----------------------

[](#основные-методы-сервера)

### init($func)

[](#initfunc)

Устанавливает функцию инициализации переменных, которые должны быть доступны во время обработки данных клиента. Внутри неё можно инициализировать, например, объект для работы с БД

#### Пример

[](#пример)

```
use PDO;
use DigitalStars\Daemon\Server;
$s = Server::create(9);

$db = null;

$s->init(function () use (&$db) {
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'DB_USER', 'DB_PASSWORD');
});
```

### errorHandler($func)

[](#errorhandlerfunc)

Устанавливает функцию для обработки ошибок. При этом, если функция задана, то исключение не будет выкинуто. Информация об ошибках передаётся в функцию в следующем виде:

`$func($error, $message, $file, $line, $e)`

Где:

- $error - Код ошибки, может быть:
    - `ERROR_DAEMON` - Внутренняя ошибка демона (если не найден какой-то модуль php или не удалось что-то выполнить)
    - `ERROR_MODULE` - Ошибка внутри модуля
    - Типы ошибок из PHP (`E_ERROR`, `E_WARNING`, `E_PARSE`, `E_NOTICE`, `E_CORE_ERROR`, `E_CORE_WARNING`, `E_COMPILE_ERROR`, `E_COMPILE_WARNING`, `E_USER_ERROR`, `E_USER_WARNING`, `E_USER_NOTICE`, `E_STRICT`, `E_RECOVERABLE_ERROR`, `E_DEPRECATED`, `E_USER_DEPRECATED`)
- $message - сообщение ошибки
- $file - файл в котором произошла ошибка
- $line - строка
- $e - Экземпляр Throwable (родитель Exception), описывающий ошибку

> **Внимание!** $file, $line, $e будут присутствовать только в том случае, если тип ошибки не `ERROR_DAEMON`, иначе будет просто текстовое описание ошибки на русском языке.

#### Пример

[](#пример-1)

```
use PDO;
use DigitalStars\Daemon\Server;
$s = Server::create(9);

$db = null;

$s->init(function () use (&$db) {
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'DB_USER', 'DB_PASSWORD');
});

$s->errorHandler(function ($error, $error_str, $error_file, $error_line, $e) use ($db) {
    // Составляем текст ошибки
    $text = "Error: $error\n" .
        "Str: $error_str" .
        "File: $error_file ($error_line)\n" . (($e instanceof Throwable) ? "Back Trace:" . $e->getTraceAsString() : "");

    // Записываем ошибку в таблицу логов в БД

    $db->prepare("INSERT INTO error_log (text_error) VALUE (?)")->execute([$text]);
});
```

### module($id, $func)

[](#moduleid-func)

Метод регистрирует новую функцию, которую можно будет вызвать из клиента по ID (первый параметр), и при необходимости передать в неё нужные данные

> По сути этот метод - это основной функционал демона.

#### Пример

[](#пример-2)

Код сервера:

```
use PDO;
use DigitalStars\Daemon\Server;
$s = Server::create(9);

$db = null;

$s->init(function () use (&$db) {
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'DB_USER', 'DB_PASSWORD');
});

$s->module('testFunction', function ($text) use (&$db) {
    $db->prepare("INSERT INTO log_action (text_value) VALUE (?)")->execute([$text]);
});
```

Код клиента:

```
use DigitalStars\Daemon\Client;
$c = Client::create(9);

$c->testFunction('Какое-то тестовое сообщение, которое передастся серверу');
```

> В этом примере клиент отправляет сообщение на сервер демона, он это сообщение принимает и записывает в БД

Служебные методы сервера
------------------------

[](#служебные-методы-сервера)

> Эти методы в основном использовать не нужно. Они вызываются сами внутри библиотеки, но могут пригодиться при обработке каких-то крайних случаев

### bool clear()

[](#bool-clear)

Метод для очистки очереди сообщений. По умолчанию сообщения от клиентов до сервера накапливаются в очереди даже если сервер не запущен. Этот метод очищает эту очередь и возвращает в случае успеха true, в случае ошибки false

### stop()

[](#stop)

Метод останавливает работу демона нормально. Это значит, что при вызове метода демон будет ждать завершения всех дочерних процессов, и как только они завершаться, работа будет завершена

### kill()

[](#kill)

Метод завершает работу демона аварийно. Даже если какой-то из дочерних процессов не завершены, они будут завершены принудительно

### int isActive()

[](#int-isactive)

Проверяет, запущен ли демон. Если да, то вернёт PID главного (родительского) процесса. Если нет, то вернёт false.

### run()

[](#run)

Запускает работу демона

Управление работой сервера
--------------------------

[](#управление-работой-сервера)

Обычно методы из секции `Служебные методы` не используются, а управлять состоянием демона можно непосредственно из консоли. Демон поддерживает следующие консольные команды:

- `start` - запустить демона
- `stop` - завершить работу демона
- `kill` - завершить работу демона принудительно (не завершённые процессы будут убиты)
- `status` - получить статус (запущен демон сейчас или нет)
- `restart` - перезапустить демона (при этом будет использоваться `stop` для завершения работы). Может быть полезно при правках в код сервер
- `clear` - очистить очередь сообщений

### Пример

[](#пример-3)

Создадим скрипт сервера демона под названием `test_daemon.php` со следующим содержимым:

```
use PDO;
use DigitalStars\Daemon\Server;
$s = Server::create(9)->isMultiThread()->maxThreads(2);

$db = null;

$s->init(function () use (&$db) {
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'DB_USER', 'DB_PASSWORD');
});

$s->module('testFunction', function ($text) use (&$db) {
    $db->prepare("INSERT INTO log_action (text_value) VALUE (?)")->execute([$text]);
});
```

Чтобы заставить его работать, нужно выполнить команду: `php test_daemon.php start`.

Для завершения работы нужно вызвать команду: `php test_daemon.php stop`

Клиент
------

[](#клиент)

Клиент может быть инициализирован в любом php скрипте, с помощью экземпляра клиента можно вызывать функции реализованные в модуле сервера с передачей в них параметров. Параметрами могут быть любые атомарные переменные, массивы и некоторые объекты (подробнее об этом можно почитать [тут](https://www.php.net/manual/ru/function.msg-send.php), параметр `message`, `serialize` задан в `true`)

> Клиент соединяется с сервером по ID при инициализации. Важно чтобы они совпадали!

Инициализация клиента
---------------------

[](#инициализация-клиента)

```
require_once "vendor/autoload.php"; // Подключаем файлы
use DigitalStars\Daemon\Client; // Подключаем класс Server

$c = new Client(9); // Инициализируем клиент демона с ID = 9 (ID должен совпадать у клиента и сервера)
```

Также для удобства поддерживается инициализация через метод `Create`

```
$c = Client::create(9);
```

Методы клиента
--------------

[](#методы-клиента)

### errorHandler($func)

[](#errorhandlerfunc-1)

Метод обработки ошибок клиента. Он упрощён если сравнивать его с аналогичным методом сервера. в функцию `$func` просто передаётся экземпляр ошибки `Exception`. При этом, если функция задана, то исключение не будет выкинуто

### send($module\_id, $msg = \[\])

[](#sendmodule_id-msg--)

Метод вызывает функцию сервера с id = $module\_id. При этом, в функцию будут переданы параметры из массива $msg.

Этот метод также реализован в виде магического метода. То есть, можно вызывать несуществующие методы клиента, которые реализованы на сервере, и тогда клиент вызовет соответствующий метод на сервере с передачей в него параметров.

#### Пример

[](#пример-4)

Код сервера:

```
use PDO;
use DigitalStars\Daemon\Server;
$s = Server::create(9);

$db = null;

$s->init(function () use (&$db) {
    $db = new PDO('mysql:dbname=testdb;host=127.0.0.1', 'DB_USER', 'DB_PASSWORD');
});

$s->module('testFunctionTwoArguments', function ($val1, $val2) use (&$db) {
    $db->prepare("INSERT INTO log_action_two_field (field_1, field_2) VALUE (?, ?)")->execute([$val1, $val2]);
});

$s->module('testFunctionOneArguments', function ($text) use (&$db) {
    $db->prepare("INSERT INTO log_action (text_value) VALUE (?)")->execute([$text]);
});
```

Код клиента:

```
use DigitalStars\Daemon\Client;
$c = Client::create(9);

// Следующие 2 строки равносильны. Они вызовут функцию testFunctionTwoArguments на сервере и передадут в неё 2 параметра
$c->testFunctionTwoArguments('Значение 1', 'Значение 2');
$c->send('testFunctionTwoArguments', ['Значение 1', 'Значение 2']);

// Следующие 3 строки равносильны. Они вызовут функцию testFunctionOneArguments на сервере и передадут в неё 1 параметр
$c->testFunctionOneArguments('Одно значение');
$c->send('testFunctionOneArguments', ['Одно значение']);
$c->send('testFunctionOneArguments', 'Одно значение');
```

> В этом примере клиент отправляет сообщение на сервер демона, он это сообщение принимает и записывает в БД

###  Health Score

26

—

LowBetter than 43% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity12

Limited adoption so far

Community12

Small or concentrated contributor base

Maturity53

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~0 days

Total

6

Last Release

2033d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/f44e3174e7941f909b990f66bf9e345cedc106001c7eecd45907f6bd659b2ae8?d=identicon)[digitalstar-company](/maintainers/digitalstar-company)

---

Top Contributors

[![zerox-k](https://avatars.githubusercontent.com/u/67025914?v=4)](https://github.com/zerox-k "zerox-k (21 commits)")

### Embed Badge

![Health badge](/badges/digitalstars-daemon/health.svg)

```
[![Health](https://phpackages.com/badges/digitalstars-daemon/health.svg)](https://phpackages.com/packages/digitalstars-daemon)
```

###  Alternatives

[wp-cli/wp-cli

WP-CLI framework

5.0k17.2M320](/packages/wp-cli-wp-cli)[consolidation/annotated-command

Initialize Symfony Console commands from annotated command class methods.

22569.8M19](/packages/consolidation-annotated-command)[chi-teck/drupal-code-generator

Drupal code generator

26947.8M5](/packages/chi-teck-drupal-code-generator)[seld/cli-prompt

Allows you to prompt for user input on the command line, and optionally hide the characters they type

24725.8M17](/packages/seld-cli-prompt)[illuminate/console

The Illuminate Console package.

12944.1M5.1k](/packages/illuminate-console)[php-tui/php-tui

Comprehensive TUI library heavily influenced by Ratatui

589747.0k6](/packages/php-tui-php-tui)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
