Pensando nisso mais, a questão é: por que o Apache está colocando um upload em progresso na memória em vez de no disco? Eu deveria poder carregar um arquivo maior do que a memória total disponível para o servidor
O PHP nunca entra na equação, pois o upload nunca termina, e o Apache morre antes de poder passar o arquivo para o PHP.
Muito estranho. Eu estive pesquisando por horas, sem sucesso.
Eu tenho um VPS com 512 MB de RAM e estou tentando fazer upload de arquivos entre 100 e 250 MB. Arquivos de até cerca de 100 MB funcionam bem, mas qualquer coisa além disso e eu me deparo com problemas de memória.
Aqui está a saída de top
enquanto tento fazer o upload de um arquivo de 130 MB, imediatamente antes da morte do PID 18367:
top - 09:43:06 up 6 days, 9:31, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 51 total, 1 running, 50 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.2% us, 0.1% sy, 0.0% ni, 99.8% id, 0.0% wa, 0.0% hi, 0.0% si
Mem: 916144k total, 916144k used, 0k free, 0k buffers
Swap: 0k total, 0k used, 0k free, 0k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
18367 apache 16 0 721m 393m 2288 S 0 44.0 0:01.90 httpd
De alguma forma, ele está usando 393 MB de memória para um arquivo de 130 MB? (Sem mencionar que apenas 80% do arquivo foi carregado.) Não consigo imaginar o que o httpd está fazendo com todo esse espaço.
Olhando no log de erros do apache, vejo:
[Tue Feb 01 09:43:07 2011] [error] (12)Cannot allocate memory: fork: Unable to fork new process
[Tue Feb 01 09:43:17 2011] [notice] child pid 18367 exit signal Segmentation fault (11)
Não tenho certeza se isso é uma limitação da pilha de software (CentOS, Apache e PHP através do mod_fcgid), ou um erro de configuração do Apache ou do PHP.
Eu uso a seguinte diretiva mod_fcgid no meu vhost.conf, mas com pouco efeito:
MaxRequestInMem 1048576
Existem valores semelhantes de configuração do apache que eu deveria ajustar?
Obrigado pela sua consideração.