# Correção: adoção de `php.ini` de produção canônico na conta (base do repo)

- **Branch:** grupo de correções `infra-update` (camada L0 — performance + segurança de conta)
- **Stack:** Laravel 5.5.50 / PHP 7.2.34 (cPanel/AlmaLinux/Apache 2.4 + EasyApache4)
- **Arquivos:**
  - `php.ini.recomended` (novo, raiz do repo — template canônico de produção da conta)
  - `_pesquisa/security/php.ini` (cópia de pesquisa, mesma base)
  - `wiki/infra-update/WHM.md` (itens de escopo SYSTEM: OPcache, realpath, APCu)
  - `plan/2026-08-09-infra-update.epic.md` (L0.1/L0.2)
- **Categoria:** performance + endurecimento de conta / `php.ini` (tarefa #23410)

---

## 1. Problema

No servidor, as contas **não tinham um `php.ini` próprio** — ou seja, rodavam com os
*defaults* do EasyApache4 (php.ini de sistema do EA4), sem nenhum ajuste de conta. Consequências:

- **Sem padronização:** cada ambiente/contra herdava valores globais que não são os ideais
  para produção (ex.: `expose_php` exposto, superfície de sessão sem `cookie_secure`/
  `httponly`, limites sem ajuste, sem `pcre.jit`/`zend.assertions`).
- **Inconsistência entre dev/homol/prod:** como nada estava versionado, cada pessoa ajustava
  "na mão" e as contas divergiam.
- **Performance de conta deixada de lado:** chaves `PHP_INI_PERDIR`/`USER` (que a conta *pode*
  mudar) estavam nos defaults, sem o ganho de `pcre.jit`/`zend.assertions`.

## 2. Causa real

O EasyApache4 **só cria o `php.ini` da conta** depois que ela é editada via *MultiPHP INI
Editor* (modo "Editor"/avançado) no cPanel/WHM. Enquanto a conta não edita nada, ela herda
**silenciosamente** o php.ini de sistema do EA4 (`/opt/cpanel/ea-php72/root/etc/php.ini`).

Além disso, descobriu-se na pesquisa de segurança que:

- `opcache.*` e `realpath_cache_*` são **`PHP_INI_SYSTEM`** → qualquer valor colocado no
  `php.ini` da conta é **ignorado**. Eles pertencem ao WHM (php.ini de sistema).
- O `php.ini` da conta **só vale para chaves `PHP_INI_PERDIR`/`USER`** (ex.: `pcre.jit`,
  `zend.assertions`, `auto_globals_jit`, sessão, limites, `error_*`).

Ou seja: o arquivo da conta serve para endurecimento + performance de escopo USER/PERDIR;
o servidor (WHM) é quem governa OPcache/realpath/APCu.

## 3. Correção real

### 3.1 Template canônico versionado (`php.ini.recomended`)

Criou-se na **raiz do repo** o arquivo `php.ini.recomended` como fonte única de verdade para
o `php.ini` de produção da conta. Ele é aplicado (colado) por conta, via cPanel. Seções:

- **Erro e log:** `display_errors=Off`, `log_errors=On`, `error_reporting` sem deprecated/strict,
  `error_log` por conta (placeholder `__USUARIO_DO_CPANEL__`).
- **Superfície:** `expose_php=Off`, `enable_dl=Off`, `cgi.fix_pathinfo=0`.
- **Wrappers:** `allow_url_include=Off`, `allow_url_fopen=On`.
- **Sessão (endurecimento):** `use_strict_mode=1`, `cookie_httponly=1`, `cookie_secure=On`,
  `sid_bits_per_char=5`, `save_path` no socket de sessões do EA4, GC ajustado.
  (`cookie_samesite` fica comentado — só PHP 7.3+; SameSite via `.htaccess` H7.)
- **Limites operacionais:** `max_execution_time=300`, `memory_limit=512M`, `post_max_size=105M`,
  `upload_max_filesize=100M`, etc.
- **OPcache / realpath:** bloco **mantido só como referência visual** — são `PHP_INI_SYSTEM`
  e não surtem efeito na conta (ver `wiki/infra-update/WHM.md` P0‑B).
- **I/O e localidade:** `zlib.output_compression=Off` (compressão é server-side via Optimize
  Website — ligar aqui duplicaria/conflictaria), `date.timezone` definido.
- **Performance USER/PERDIR (APLICA na conta):** `pcre.jit=On`, `zend.assertions=-1`,
  `auto_globals_jit=On`.

> A cópia de pesquisa `_pesquisa/security/php.ini` tem o mesmo conteúdo; o arquivo oficial
> para deploy é `php.ini.recomended` (raiz).

### 3.2 Restrição de escopo (não regredir)

Ao aplicar, tenha clareza do que vale e do que não vale na conta:

| Chave | Escopo | Vale na conta? | Onde de fato atua |
|---|---|---|---|
| `pcre.jit`, `zend.assertions`, `auto_globals_jit` | PERDIR/USER | **sim** | conta |
| `session.*`, `display_*`, `error_*`, `max_*` | PERDIR/USER | **sim** | conta |
| `zlib.output_compression` | PERDIR | **sim** (Off p/ não conflitar) | conta |
| `opcache.*`, `realpath_cache_*` | **SYSTEM** | **não** (ignorado) | WHM (`wiki/infra-update/WHM.md` P0‑B) |
| `apcu.enabled` / `apcu.enable_cli` | **SYSTEM** | **não** | WHM (P0‑C) |

### 3.3 Como aplicar por conta

1. No repo, copie `php.ini.recomended` e substitua o placeholder do caminho do log:
   ```bash
   sed 's#__USUARIO_DO_CPANEL__#SEU_USUARIO#' php.ini.recomended > /tmp/php.ini.conta
   ```
2. cPanel da conta » **Software » MultiPHP INI Editor** » modo **"Editor"** (avançado).
3. Cole o conteúdo (ou aplique via `.user.ini` na raiz `public/` — mesma eficácia para
   chaves PERDIR; `.user.ini` é lido pelo PHP-FPM/CGI do EA4).
4. **Não** inclua esperança de OPcache/realpath aqui — eles são WHM (P0‑B).
5. Opcional: versionar o mesmo conteúdo como `.user.ini` no deploy (`deploy.sh`) para
   idempotência entre contas.

## 4. Retrocompatibilidade

- Nenhuma alteração de código da aplicação; só configuração de conta.
- `allow_url_fopen=On` é mantido (Laravel/Gu horizontalmente dependem de wrappers HTTP);
  `allow_url_include=Off` blinda contra `include` remoto.
- `session.save_path` aponta para o diretório de sessões do EA4 — inofensivo (Laravel com
  driver `file` usa `storage/framework/sessions`; afeta só driver `native`).
- Chaves SYSTEM no arquivo são inertes, não quebram nada.

## 5. Verificação

```bash
# na conta (contexto do PHP em uso):
php -i | grep -E 'expose_php|display_errors|pcre.jit|zend.assertions|session.cookie_secure'
# esperado:
#   expose_php => Off
#   display_errors => Off
#   pcre.jit => On
#   zend.assertions => -1
#   session.cookie_secure => On

# opcache/realpath NAO aparecem aqui com valor da conta (sao SYSTEM):
php -i | grep -E 'opcache.validate_timestamps'   # reflete o WHM, nao este arquivo

# via web (info da aplicacao) — confirma que o ini da conta pegou:
curl -s https://infra-update.devs.maxima.inf.br/ | grep -i 'X-Hardening-Version'
```

## 6. Notas de deploy

- `php.ini.recomended` é o template; aplicar **por conta** (cPanel MultiPHP INI Editor ou
  `.user.ini` em `public/`). Não é o php.ini de sistema do WHM.
- Itens `PHP_INI_SYSTEM` (OPcache, realpath, APCu) são feitos no WHM — ver
  `wiki/infra-update/WHM.md` (P0‑B / P0‑C). Não duplique expectativa no `php.ini` da conta.
- Substituir `__USUARIO_DO_CPANEL__` pelo usuário real antes de aplicar.
- Medir no canário após aplicar (performance PERDIR: autoload/regex) e garantir que os headers
  de segurança e `X-Hardening-Version` permanecem.
