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