> ## Documentation Index
> Fetch the complete documentation index at: https://docs.saninternet.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PHP e PHP-FPM da conta

> Define os limites do PHP e o modo como os processos dele rodam, por conta de cliente.

**Caminho no painel:** **Geral** > **Administração do Usuário** > **Adicionar cliente**, ou o **lápis** de uma conta > abas **PHP** e **PHP-FPM**

**Não é preciso abrir nenhuma das duas para criar um cliente.** São **dez rótulos
com asterisco** nas duas abas, e **oito já vêm preenchidos** com valores que
funcionam. Os outros dois só existem se você escolher o modo `dynamic` na
PHP-FPM, e aí eles nascem vazios. Elas são para quem precisa afinar uma conta
específica.

## Aba PHP

![Aba PHP da conta, de memory\_limit até as diretivas adicionais](https://mintcdn.com/san-internet/gD6hsj0ABwoHZHWu/keyhelp-admin/imagens/usuarios-php.png?fit=max\&auto=format\&n=gD6hsj0ABwoHZHWu\&q=85\&s=4d32fac51d1874d2aac93519039ba136)

São **dez campos**, e a imagem mostra a aba inteira. Ela é mais alta que a tela do
painel: para ver tudo sem rolar é preciso descer até o **Salvar**.

| Campo | Padrão | O que faz |
| - | - | - |
| `memory_limit` \* | **128M** | teto de memória de um script |
| `max_execution_time` \* | **60** | segundos até o script ser cortado |
| `post_max_size` \* | **72M** | tamanho máximo de um envio inteiro |
| `upload_max_filesize` \* | **64M** | tamanho máximo de **um arquivo** |
| `open_basedir` \* | ver abaixo | onde o PHP daquela conta pode ler e escrever |
| `disable_functions` | 31 funções | funções proibidas |
| `sendmail_from` | vazio | remetente do `mail()` |
| Variáveis de ambiente | vazio | |
| Diretivas não substituíveis | vazio | o site não consegue sobrescrever |
| Diretivas substituíveis | vazio | o site pode sobrescrever |

### O `max_execution_time` é também o tempo que o site espera

O mesmo número vale para o servidor web: ele espera a página da conta por esse
tempo, e depois desiste. **Medido:** com 60, uma página PHP que demorava 2 minutos
deu ao visitante *"504 Gateway Timeout"* aos 60 segundos. Trocado para 90, a
configuração do site passou a esperar 90, regravada menos de um minuto depois de
salvar.

**O script não para junto.** Na mesma medida, ele continuou rodando no servidor
depois do 504, porque o tempo em que o script fica só esperando, como numa consulta
lenta a outro serviço, não conta no `max_execution_time`.

### O `##DOCROOT##` é substituído por conta

![Campo open\_basedir com o valor padrão](https://mintcdn.com/san-internet/gD6hsj0ABwoHZHWu/keyhelp-admin/imagens/usuarios-php-basedir.png?fit=max\&auto=format\&n=gD6hsj0ABwoHZHWu\&q=85\&s=b6c7e98c6a0fec2e9f978d52c9447e65)

O `open_basedir` vem assim:

```
##DOCROOT##/www:##DOCROOT##/files:##DOCROOT##/tmp
```

O `##DOCROOT##` é um marcador que o painel troca pelo diretório real da conta.
São **três pastas liberadas**, e nada além delas: a do site, a de arquivos e a de
temporários.

### `post_max_size` é maior que `upload_max_filesize`, e isso é de propósito

![Campos post\_max\_size e upload\_max\_filesize](https://mintcdn.com/san-internet/gD6hsj0ABwoHZHWu/keyhelp-admin/imagens/usuarios-php-post-upload.png?fit=max\&auto=format\&n=gD6hsj0ABwoHZHWu\&q=85\&s=4b011018b694debebf966e11b9873467)

64M para um arquivo, 72M para o envio inteiro. A folga de 8M cobre o resto do
formulário que viaja junto com o arquivo. **Aumentar só o `upload_max_filesize`
não resolve** upload grande: o envio inteiro continua limitado pelo outro.

### `disable_functions` já vem com 31 funções

![Campo disable\_functions com a lista de funções desabilitadas](https://mintcdn.com/san-internet/gD6hsj0ABwoHZHWu/keyhelp-admin/imagens/usuarios-php-disable.png?fit=max\&auto=format\&n=gD6hsj0ABwoHZHWu\&q=85\&s=2b8530ea904d1cb3bd25a9e34614c029)

A lista de fábrica bloqueia principalmente o que executa programa e o que mexe em
processo: `exec`, `passthru`, `popen`, a família `proc_*`, a `pcntl_*` e a
`posix_*`. É a linha de base de segurança do painel, e mexer nela afrouxa a conta.

## Aba PHP-FPM

| Campo | Padrão | Quando aparece |
| - | - | - |
| `pm` \* | **static** | sempre |
| `pm.max_children` \* | **3** | sempre |
| `pm.max_requests` \* | **0** | sempre |
| `pm.start_servers` | vazio | **só com `dynamic`** |
| `pm.min_spare_servers` \* | vazio | **só com `dynamic`** |
| `pm.max_spare_servers` \* | vazio | **só com `dynamic`** |
| Ativar página de status | **desligado** | sempre |
| Limitar o acesso ao seguinte IP | vazio, e vazio quer dizer **sem restrição** | sempre |

### Os três modos do `pm`

O `pm` não é uma lista suspensa: são **três opções na tela**, cada uma com a
explicação do painel embaixo.

| Modo | Como se comporta |
| - | - |
| **static** | mantém sempre o mesmo número de processos, o do `max_children` |
| **ondemand** | sobe processo quando chega requisição e derruba depois |
| **dynamic** | mantém uma faixa, entre o mínimo e o máximo de processos ociosos |

**Conta criada agora nasce em `static`.** Contas antigas podem estar em outro modo:
o laboratório tem uma em `ondemand`.

### `dynamic` faz aparecer três campos, e dois deles pedem o que não exigem

![Aba PHP-FPM, com o modo dynamic e os campos de processos](https://mintcdn.com/san-internet/gD6hsj0ABwoHZHWu/keyhelp-admin/imagens/usuarios-php-fpm.png?fit=max\&auto=format\&n=gD6hsj0ABwoHZHWu\&q=85\&s=40c84feb4a14b695f86ab089b0268489)

Com `static` ou `ondemand` os campos de spare **não existem na tela**. Escolher
`dynamic` (**1**) faz aparecer três de uma vez: `pm.start_servers`,
`pm.min_spare_servers` e `pm.max_spare_servers` (**2**).

Os dois de spare aparecem **vazios e com o asterisco de obrigatório no rótulo**,
mas o `required` do HTML neles é falso. É por isso que o navegador deixa enviar
assim, e quem recusa é o servidor:

> Entrada inválida no campo de configurações do PHP-FPM pm.min\_spare\_servers.

A validação é do servidor, não da tela. **Nada é gravado quando isso acontece**, a
conta fica como estava: preencha os dois e salve de novo.

O `pm.start_servers` não tem asterisco, e o painel dá a conta dele ali mesmo:

> pm.min\_spare\_servers + (pm.max\_spare\_servers - pm.min\_spare\_servers) / 2

## O que pode dar errado

| Sintoma | Causa | O que fazer |
| - | - | - |
| **Escolhi `dynamic` e não salva** | os dois campos de spare apareceram vazios e o navegador deixou enviar assim | preencher `pm.min_spare_servers` e `pm.max_spare_servers` e salvar de novo |
| **Upload grande falha mesmo aumentando o `upload_max_filesize`** | o `post_max_size` continua menor que o envio inteiro | subir os dois, mantendo o `post_max_size` maior |
| Script morre no meio sem erro no site | bateu no `max_execution_time` | subir o valor, ou corrigir o script |
| **O visitante vê "504 Gateway Timeout"** | a página passou do `max_execution_time`, e o servidor web desistiu de esperar. O script pode continuar rodando | subir o valor, ou fazer a página responder antes |
| O site diz que não pode ler um caminho | ele está fora das três pastas do `open_basedir` | acrescentar o caminho, sabendo que isso alarga o alcance da conta |
| Uma função do PHP não existe para o cliente | está no `disable_functions` | avaliar antes de tirar: a lista é a linha de base de segurança |

## Ver também

* [Criar uma conta de cliente](/keyhelp-admin/criar-conta-de-cliente), onde estas abas aparecem
* [Limites e permissões do cliente](/keyhelp-admin/limites-e-permissoes-do-cliente), as outras duas abas do formulário


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.