PHPackages                             pavel\_agarkov/speed-hunter - 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. pavel\_agarkov/speed-hunter

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

pavel\_agarkov/speed-hunter
===========================

Managing php-cli processes from under php-cgi and waiting for a response from the last process. (Only for \* nix systems with shared memory support).

v0.4(5y ago)49[1 issues](https://github.com/PavelAgarkov/speed-hunter/issues)MITPHPPHP &gt;=7.4.8CI failing

Since Aug 1Pushed 5y ago1 watchersCompare

[ Source](https://github.com/PavelAgarkov/speed-hunter)[ Packagist](https://packagist.org/packages/pavel_agarkov/speed-hunter)[ Docs](https://github.com/PavelAgarkov/speed-hunter)[ RSS](/packages/pavel-agarkov-speed-hunter/feed)WikiDiscussions master Synced 3d ago

READMEChangelog (9)DependenciesVersions (16)Used By (0)

Введение
========

[](#введение)

Можно скачать пакет из :

`composer require pavel_agarkov/speed-hunter`

Запуск многозадачной обработки во время обработки запроса на сервере.Пакет является встраиваемым. Работает только на unix подобных OC. Пакет работает с разделяемой памятью unix.

Пакетом предусмотрены 3 варианта работы:
----------------------------------------

[](#пакетом-предусмотрены-3-варианта-работы)

```
- запуск одиночного процесса, отвязывающегося от основного потока вывода(т.е. не требует ожидания,
    в дальнейшем "асинхронным");
- запуск множества асинхронных процессов;
- запуск множества процессов, удерживающих поток вывода за управляющим процессом (необходимо для получения данных,
    записанных каждым отдельным процессом в разделяемую память).

```

Перечисленные варианты работы применимы как к cgi так и к cli режимам php. Инициализация приложения выполняется однотипно, за исключением передаваемых параметров. Приложение принимает одним из параметров конфигурации имя файла php(в котором необходимо расположить логику работы данного процесса) относительно положения инициализирующего файла.

### Инициализация и запуск одиночного асинхронного процесса

[](#инициализация-и-запуск-одиночного-асинхронного-процесса)

#### *Пример*:

[](#пример)

```
Starting::singleAsyncProcess(
    array(
        "jobName" => 'jobs/async_1',
        "shSizeForOneJob" => 300,
        "data" => array(1, 2, 3)
    )
);
```

Starting::singleAsyncProcess принимает массив где:

```
"jobName"            - относительный пусть до файла процесса,
"shSizeForOneJob"    - объем разделяемой памяти в байтах для процесса,
"data"               - массив с данными передаваемыми в процесс.

```

Логика процесса "jobName" =&gt; 'jobs/async\_1' находится в файле jobs/async\_1.php

```
require __DIR__ . './vendor/autoload.php';

Job::runSingleAsyncJob(
    $argv,
    function (&$Job, $read) {
        sleep(1);
        $id = posix_getpid();
        $fp = fopen("t{$id}.txt", "w");
        $str = implode(',', $read);
        fwrite($fp, " {$str} \r\n");
        fclose($fp);
    }
);
```

где:

```
$argv                       - массив переданных в процесс параметров(является необходимым),
function (&$Job, $read) {}  - анонимная функция содержащую логику работы процесса c параметрами:
    &$Job - ссылка на объект обработчика задания,
    $read - передаваемые данные из основного процесса.

```

Указанный пример работает следующим образом:

```
1. В основном процессе инициализируется объект для работы с параллельными заданиями.
2. Для указанного процесса резервируется разделяемая память.
3. Поток вывода процесса перенаправляется, освобождая поток вывода для основного процесса.
4. В создавшемся процессе выполняется анонимная функция переданная в Job::runSingleAsyncJob().
5. По окончанию выполнения основной логики очищается ячейка разделяемой памяти для процесса.

```

### Инициализация и запуск нескольких асинхронных процессов

[](#инициализация-и-запуск-нескольких-асинхронных-процессов)

#### *Пример*:

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

```
Starting::multipleAsyncProcesses(
    array(
        array(
            "jobName" => 'jobs/async_1',
            "numberJobs" => 3,
            "shSizeForOneJob" => 300,
            "dataPartitioning" => array(
                "flagPartitioning" => 1,
                "dataToPartitioning" => array(1, 2, 3)
            )
        ),
        array(
            "jobName" => 'jobs/async_2',
            "numberJobs" => 1,
            "shSizeForOneJob" => 300,
            "dataPartitioning" => array(
                "flagPartitioning" => 0,
                "dataToPartitioning" => array('Hi')
            )
        )
    )
);
```

Starting::multipleAsyncProcesses() принимает массив из массивов конфигураций определенного набора процессов, где:

```
"jobName" - относительный пусть до файла процесса,
"numberJobs" - количество одинаковых процессов "jobName" для запуска,
"shSizeForOneJob"    - объем разделяемой памяти в байтах для каждого процесса,
"dataPartitioning" - массив определяющий передаваемые данных в каждый процесс:
    параметр "flagPartitioning" - 0 или 1, если "flagPartitioning" = 0, то данные
    поставляются в каждый процесс в указанном виде, иначе если "flagPartitioning" = 1,
    то данные указанные разделяются для количества процессов поровну,
    т.е. если указано "numberJobs" => 3 и "flagPartitioning" => 1,
    то "dataToPartitioning" => array(1, 2, 3) разделится на 3 массива,
    в каждом из которых будет по 1 элементу по порядку и массива array(1, 2, 3).
    Число элементов массива не может быть меньше чем количество процессов.

```

### Инициализация и запуск нескольких процессов, удерживающих поток вывода за управляющим процессом

[](#инициализация-и-запуск-нескольких-процессов-удерживающих-поток-вывода-за-управляющим-процессом)

#### *Пример*:

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

```
$parallel =
    Starting::parallel(
        array(
            array(
                "jobName" => 'jobs/job_1',
                "numberJobs" => 1,
                "shSizeForOneJob" => 300,
            ),
            array(
                "jobName" => 'jobs/job_2',
                "numberJobs" => 5,
                "shSizeForOneJob" => 90000,
                "dataPartitioning" => array(
                    "flagPartitioning" => 0,
                    "dataToPartitioning" => ['commit', 'sin']
                )
            ),
            array(
                "jobName" => 'jobs/job_4',
                "numberJobs" => 2,
                "shSizeForOneJob" => 300,
                "dataPartitioning" => array(
                    "flagPartitioning" => 1,
                    "dataToPartitioning" => ['commit', 'sin']
                )
            )
        )
    );

$output = $parallel->getOutput();
```

Starting::parallel() использует такой же набор параметров для инициализации, как и Starting::multipleAsyncProcesses().

Основным отличием Starting::parallel() от Starting::multipleAsyncProcesses() является удержание управления за основным процессом с ожиданием выполнения дочерних процессов, что позволяет разделять работу "одного процесса" на "большее число процессов" с дальнейшим получением данных из каждого параллельного процесса. Получение данных для основного процесса происходит в строке:

```
 $output = $parallel->getOutput();
```

Отладка
-------

[](#отладка)

Отладка параллельной работы процессов лучше всего доступна в IDE поддерживающей несколько одновременных подключений отладчика.

Рекомендации
------------

[](#рекомендации)

Для контроля разделяемой памяти и открытых процессов в debian системах можно использовать стоковые утилиты - `ipcs` и `ps` или любые, имеющие схожий функционал. Для использования в режиме cgi предпочтительно иметь фоновый процесс, следящий за заполнением разделяемой памяти, а так же процесс для контроля открытых процессов - на случай переполнения оперативной памяти.

###  Health Score

23

—

LowBetter than 27% of packages

Maintenance15

Infrequent updates — may be unmaintained

Popularity9

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity52

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 ~5 days

Total

9

Last Release

2068d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/6a613140a280ba50d1ecb8f2478fedae1d9847abde0bbecbfbbe211214744b3a?d=identicon)[Pavel\_Agarkov](/maintainers/Pavel_Agarkov)

---

Top Contributors

[![PavelAgarkov](https://avatars.githubusercontent.com/u/48478319?v=4)](https://github.com/PavelAgarkov "PavelAgarkov (91 commits)")

---

Tags

cgi-processcli-processesjobsmultiprocessmultiprocessingmultitasking-workparallel-programmingphpphp-clipiping-processesshared-memoryunixworkersjobsmultiprocessingcgi processcli processesprocess poolmultitasking workunix shared memorypiping processesmutilprocess

### Embed Badge

![Health badge](/badges/pavel-agarkov-speed-hunter/health.svg)

```
[![Health](https://phpackages.com/badges/pavel-agarkov-speed-hunter/health.svg)](https://phpackages.com/packages/pavel-agarkov-speed-hunter)
```

###  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)
