# Июль 2018 — тройное ревью: таймауты веб-интеграции
Статус: принят в публикационный слой 31 июля 2026 года. Пакет не
перезаписывает web/data/articles.json:
web/data/editorial-revisions.mjs сопоставляет три ревизии только
по стабильным slug.
Партия:
- editorial-2018-07-practice-http-timeouts
- editorial-2018-07-mechanism-http-timeouts
- editorial-2018-07-field-http-timeouts
## Карта покрытия
| Перспектива | Главный вопрос | Основной текст без источников | Артефакт |
| --- | --- | ---: | --- |
| Практика | Как задать бюджет одного PHP cURL-вызова | 7 963 знака | конфигурация cURL, временная шкала и правило повтора |
| Механизм | Чем отличаются connect, total и low speed | 8 813 знаков | матрица стадий, временные поля cURL и условия повторов |
| Поле | Как разобрать зависание по наблюдаемым стадиям | 9 588 знаков | trace, локальный тестовый сервер и дерево диагностики |
У каждой ревизии есть 8, 9 и 9 заголовков второго уровня соответственно,
одна доступная таблица с thead и scope, один рисунок
с непустым alt и подписью, 2–3 блока кода, нумерованный порядок
действий, ограничения и точный заголовок
<h2>Проверяемые источники</h2>.
## 1. Факты и техника — пройдено
### Границы cURL
- Официальная документация libcurl сверена для
CURLOPT_CONNECTTIMEOUT,
CURLOPT_TIMEOUT,
LOW_SPEED_LIMIT,
LOW_SPEED_TIME
и curl_easy_getinfo.
- Текст не называет общий CURLOPT_TIMEOUT «read timeout».
В нём он ограничивает весь перенос; пара LOW_SPEED_LIMIT и LOW_SPEED_TIME
описана как граница средней скорости ниже порога за период.
- Указано, что connect phase включает DNS и протокольные переговоры до
установленного соединения, а connect timeout находится внутри общего
timeout. Бюджеты не складываются.
- CURLE_OPERATION_TIMEDOUT (28)
используется только как итог достижения условия таймаута. Статьи требуют
записывать пороги, HTTP-код и временные отметки, а не угадывают по одному
коду ошибочную стадию.
### Повторы и HTTP
- Для исторической точности сверены
RFC 7231, раздел 4.2.2,
действовавший в 2018 году, и актуальный
RFC 9110, раздел 9.2.2.
- Ни одна статья не советует «просто повторить запрос». GET и HEAD получают
только один ограниченный повтор в остатке бюджета. Изменение состояния
требует постоянного ключа операции и документированной дедупликации у
партнёра либо проверки статуса. Без этого результат обозначается
неопределённым.
- Примеры с локальной задержкой помечены как учебные. В текст не добавлены
вымышленные метрики, пользователи, результаты инструментов или состояние
внешнего сервиса.
### Исполнимость кода
- Примеры используют синхронный PHP cURL, доступный для эпохи 2018 года:
curl_exec, curl_getinfo,
CURLOPT_CONNECTTIMEOUT, CURLOPT_TIMEOUT и
базовые временные поля.
- Код читает диагностику до curl_close, отделяет transport error
от HTTP-кода и не записывает в обязательный trace токен, тело запроса или
ответ партнёра.
Вердикт первого прохода: утверждения о cURL, HTTP и повторах имеют первичную
опору; ложных обещаний и небезопасного автоматического повтора нет.
## 2. Редактура и голос — пройдено
- Первый абзац каждой статьи называет симптом и цену ошибки: занятый пул PHP,
шестидесятисекундное ожидание или неизвестное состояние синхронизации.
- Каждая статья держит один главный вопрос. Практика строит бюджет, механизм
разделяет настройки, поле ведёт расследование по trace. Три текста не
пересказывают друг друга.
- Речь соответствует М1 2018 года: PHP, cURL, HTTP, DNS, TLS, журнал и
локальный тест. Автор ведёт читателя через «сначала проверяем — затем
меняем», без позднего жаргона SLO, распределённой трассировки или
неподтверждённых показателей.
- Технический ход сохраняется в каждом разделе: симптом → граница →
проверка → действие → ограничение. Общие вводные и слова без проверяемого
объекта не использованы.
- В конце есть критерий результата: trace указывает на стадию, одно
ограничение меняется после проверки, а безопасный повтор определяется
контрактом операции.
Вердикт второго прохода: объём находится в интервале 5 000–15 000 знаков,
голос не опережает 2018 год, а плотность текста не держится на общих оценках.
## 3. Визуал и выпуск — пройдено для черновика
- Повторный независимый strict-проход остановил практическую статью: первые
800 знаков содержали конкретный сценарий и цену, но не явный маркер
симптома. Первое предложение исправлено на Симптом: карточка
товара...; сценарий, причина и цена ошибки сохранены.
- Созданы три разные SVG: временной бюджет запроса, границы таймаутов и
дерево полевого разбора. Каждая схема передаёт решение из соответствующей
статьи, а не повторяет заголовок.
- Все SVG прошли xmllint --noout. Затем они были реально
растрированы через sharp в исходном размере и на ширине
343 px. Проверены границы canvas, контраст и читаемость ключевых заголовков.
- В первой визуальной версии длинные строки в схеме механизма заходили на
цветные плашки, а нижние решения в схеме полевого разбора не помещались
в карточки. Перед этим вердиктом подписи разбиты по строкам, карточки
увеличены; повторный рендер не показывает обрезанных элементов.
- На узкой ширине схема остаётся внутри контейнера. Её подробный смысл
продублирован непустыми alt и figcaption;
таблицы имеют существующий контейнер прокрутки
.table-scroll в общих стилях.
- После интеграции основной редактор повторно прогнал strict audit всех трёх
slug и production build. Сборка прошла и сгенерировала 374 статические
страницы.
## Реально выполненные проверки
1. node --check web/scripts/upgrade-2018-07.mjs — успешно.
2. node web/scripts/upgrade-2018-07.mjs --print-revisions —
успешно; в stdout выводится только JSON трёх ревизий, stderr пуст.
3. Безопасный import выполнен отдельной командой; модуль экспортирует
revisions, не печатает Usage и не меняет exit code.
4. Структурная проверка экспортированных HTML подтвердила для всех трёх
ревизий объём, число h2, figure, table, thead, code,
нумерованный список, единый раздел источников, внешние ссылки и
непустой alt.
5. xmllint --noout для трёх SVG — успешно.
6. Растровый рендер SVG через sharp проверен в исходном
размере и на ширине 343 px; после исправления нет визуального выхода за
canvas.
7. git status --short по зоне задачи подтвердил, что до
добавления этого ревью появились только четыре разрешённых июльских
файла; web/data/articles.json и редакционные общие файлы
этой партией не менялись.
Итоговый вердикт: пакет принят к публикации после независимого
интеграционного ревью. Commit и push — отдельный выпускной шаг основного
редактора.