Вызвать PHP-наблюдателя из C и не испортить каталог

Отчёт показывает фактические наблюдения программы. Если создавалась учебная таблица, её удаление проверено отдельно.

Наблюдаемый результат программы
НаблюдениеРезультат
Доступные товарыBOX, LED
Товаров без остатка1
Вызовов первого наблюдателя1
Повторных callback пропущено1
Ошибок необязательного наблюдателя1
Каталог после его ошибкиBOX
Строки и дополнительные наблюдения
{
    "catalog": [
        {
            "sku": "BOX",
            "stock": "5"
        },
        {
            "sku": "LED",
            "stock": "12"
        }
    ],
    "events": [
        {
            "kind": "query",
            "ok": true,
            "connection_id": 1
        }
    ],
    "alerts": [
        {
            "sold_out": "1"
        }
    ],
    "after_watch": {
        "extension_version": "0.1.0",
        "query_attempts": 2,
        "query_failed": 0,
        "stmt_attempts": 0,
        "stmt_failed": 0,
        "tracked_connections": 2,
        "closed_connections": 0,
        "dropped_connections": 0,
        "observer_calls": 1,
        "observer_errors": 0,
        "observer_reentrant_skips": 1,
        "connections": [
            {
                "id": 1,
                "query_attempts": 1,
                "query_failed": 0,
                "stmt_attempts": 0,
                "stmt_failed": 0,
                "closed": false
            },
            {
                "id": 2,
                "query_attempts": 1,
                "query_failed": 0,
                "stmt_attempts": 0,
                "stmt_failed": 0,
                "closed": false
            }
        ]
    },
    "after_observer_error": {
        "sku": "BOX"
    },
    "snapshot": {
        "extension_version": "0.1.0",
        "query_attempts": 3,
        "query_failed": 0,
        "stmt_attempts": 0,
        "stmt_failed": 0,
        "tracked_connections": 2,
        "closed_connections": 0,
        "dropped_connections": 0,
        "observer_calls": 2,
        "observer_errors": 1,
        "observer_reentrant_skips": 1,
        "connections": [
            {
                "id": 1,
                "query_attempts": 2,
                "query_failed": 0,
                "stmt_attempts": 0,
                "stmt_failed": 0,
                "closed": false
            },
            {
                "id": 2,
                "query_attempts": 1,
                "query_failed": 0,
                "stmt_attempts": 0,
                "stmt_failed": 0,
                "closed": false
            }
        ]
    }
}

Полный JSON результата, включая реальные идентификаторы, сохранён рядом в result.json.