fread()

Enviada por edison goncalez 
edison goncalez
fread()
06 de March de 2003 às 05:42PM
Bom , vou reescrever minha duvida , pois a original tinha erro de digitacao...
----------------
Srs.
Tenho bastante experiencia em asp e asp.net, mas como todo bom programador resolvi conhecer o outro lado, o PHP.
Comecei tentando fazer o uebimiau funcionar no meu RedHat 7.3 e/ou 8.0 .
Quando atacho arquivos muito grande meu browser da erro, pagina nao encontrada (ie), ou connection Broken (kde) (sem nenhuma mensagem de erro!)
depois de espalhar um monte de die() no codigo achei a linha de da erro. eh quando o uebimiau vai ler o arquivo para atachar na mensagem.
--------------
fread($fd, filesize($path));
---------------
entao pergunto:
1. se esta dando erro na leitura do arquivo. cade a mensagem do erro.
2. como eu testo se deu erro? O processo simplesmente eh interrompido e no browser da conection broken. nao tem jeito de rodar de uma forma segura, informando ao usario ou ao programador e tem algo de errado ??
<b>Re: fread()</b>
06 de March de 2003 às 07:22PM
<HTML>Seu problema esta relacionado com o tamanho máximo de upload do arquivo.

Este problema tem diversas origens mas, para começar... você usa um proxy???

Se utilizar, inicie desligando seu proxy pois ele tem um tamanho máximo de segmento a ser gravado o que impede que arquivos maiores que este segmento acusem este tipo de erro.

Seu erro deve estar ai pois, caso contrario você teira um erro qualquer no upload do arquivo que o webmiau cerca muito bem.</HTML>
edison goncalez
Re: fread()
07 de March de 2003 às 05:07AM
Obrigado pelo retorno.
Bom , eu nao uso proxy , pois estou em uma intranet com as maquinas em questao na mesma rede, sem nenhuma configuracao de proxy.
Acho que nao fui claro no meu problema. Esta dando erro quando o SERVIDOR php le um arquivo que esta no SERVIDOR e salva em uma variavel que tambem esta no SERVIDOR. Assim como pode ser uma configuracao que esta no browser do CLIENTE se na hora do erro tudo esta ocorrendo no SERVIDOR?
O que voce esta me dizendo eh que o "segmento a ser gravado ..." (na estacao eu suponho), mas o problema nao esta na linha que manda o arquivo ou o dado para a estacao. Alias o dado sai do php e vai para o sendmail (que tb esta no SERVIDOR). Para a estacao so vai uma mensagem de 100 bytes , "email enviado com sucesso", e isso nao pode dar overflow em segmento nenhum ..
De qualquer forma, conection Broken , para mim quer dizer, "DEU ERRO NO SERVIDOR E ELE NAO SABE O QUE FAZER E NEM CONSEGUIU ENVIAR UMA MENSAGEM DE ERRO", estou certo ou errado?
<b>Re: fread()</b>
07 de March de 2003 às 12:47PM
<HTML>Ai eu não entendí.

Primeiro, você falou de uso do webmiau e a anexação de arquivos. Depois você falou que os arquivos estão no servidor.

Bom, se você esta enviando um arquivo anexo, você esta trabalhando como cliente e os arquivos estão no CLIENTE, e não no servidor. O WebMiau, ao anexar um arquivo, faz seu upload para o servidor e, nesta hora esta dando pau???

Se este segmento for muito grande, o que vai acontecer é que a conexão entre cliente e servidor será quebrada e você terá um erro de página não encontrada. Quebrei a cabeça por muitos dias com um problema similar e, no final de quase um mês, vim a descobrir dois erros distintos que me provocavam isso.

O primeiro, já falei. Funciona assim: Você tenta dar um upload de arquivo (ou anexa-lo a uma mensagem que, no final, é a mesma coisa). Se houver um proxy setado, ele primeiro vai receber o arquivo para ele e depois o colocará no servidor. Se o tamanho do arquivo for maior que o segmento do proxy, você terá um erro de página não encontrada.

O segundo diz respeito a diversas configurações do PHP que são:

no php.ini, verifique as configurações abaixo:

memory_limit = 128M
post_max_size = 64M
upload_max_filesize = 32M

- Memory, apesar de parecer nada ter a ver com a tarefa, pode causar um overflow no upload de arquivos maiores.

- post_max_size e upload_max_size são diretamento o maior tamanho de arquivos transferidos (mas não é esse seu problema - aproveite e olhe)

Existe porém uma configuração BEM escondida que estraga tudo. va em /etc/httpd/conf.d/php.conf. este é o arquivo que configura a relação entre o apache e o php. Lá existe a cláusula limitRequestBody 8o default é 512 k - em bytes). Altere para valores maiores. no meu caso, coloquei em 64M (65536000).

DETALHE... Você estar em uma intranet, nada tem a ver com não usar proxy mas você é experiente o suficiente para saber disso, apenas fiz essa ressalva para usuários menos experiêntes que leiam isso.</HTML>
edison goncalez
Re: fread()
07 de March de 2003 às 01:03PM
Quando voce manda um atachado pelo webmail, voce primeiro faz upload, isso funciona, depois o webmail atacha o arquivo que esta no servidor a mensagem. Entaum neste momento o arquivo ja esta no servidor.
fread() eh uma funcao que le o arquivo que esta no servidor , certo ?
edison goncalez
Re: fread()
07 de March de 2003 às 01:18PM
Jayr, obrigado pela resposta,
como disse na segunda resposta, acho que nao expliquei direito na primeira
As opcoes :
post_max_size = 64M
upload_max_filesize = 32M
limitRequestBody = 65536000
ja estam ok, como eh ja disse , o upload funciona .
a opcao:
memory_limit = 128M
era a melhor dica, pois o fread le o arquivo que esta no diretorio /tmp para uma variavel, entaum isso tem muito a ver.
No caso estou trabalhando com
memory_limit = 32M
Posso ate aumentar.
Quanto ao proxy, ao dizer que estou em intranet, diz dizer que nao tenho necessidade de usar o proxy e disse tambem que nao estou usando o proxy.
Mas a minha pergunta eh:
Nao tem como o PHP ao inves de dar CONECTION BROKEN ou PAGINA NAO ENCONTRADA (que no fundo eh a mesma coisa). dizer tal qual no pearl , jps e outras linguagens ... DEU ERRO AO LER O ARQUIVO ...
Isso eh muito importante para que o usuario tenha a impressao que esta usando um webmail que sabe o que esta fazendo com seu email.
Pois sempre vai haver alguem usando proxy, sempre vai haver alguem tentando fazer upload de arquivo muito grande ...
edison goncalez
Re: fread()
07 de March de 2003 às 01:25PM
digo .. nao eh jps eh jsp ...
Nao estou querendo comparar, so quero saber como usar direito, quero saber se tem como fazer mais ou menos isso:
<%
On Error Resume Next
f.read()
if err <> 0 Then
Response.Write("ih deu erro!")
end if
On Error Goto 0
%>
<b>Re: fread()</b>
07 de March de 2003 às 07:31PM
<HTML>Agora entendi o que você esta querendo.

Sim, ha essa possibilidade. O que você vai ter de fazer é fazer rotinas de tratamento de erros, como a que você explicou acima porém, como server side, para cercar um erro como página não existente, você terá de testar a página antes de exibila o que vai dar muiiiiiiito trabalho e não vai ficar 100%.

Veja bem, a solução de tratamento de arquivos grandes é bem simples (ao contrário do que parece). O único problema vai ficar mesmo no proxy mas, você pode, antes de mais nada testar se seu cliente usa proxy e tomar uma atitude.

A solução php é ótima porque permite ser mescladas com outras linguagens então, se você domina java e pearl, use-as dentro do seu código.</HTML>
edison goncalez
Re: fread()
07 de March de 2003 às 09:24PM
Jayr ,
Muito obrigado pelos seus esclarecimentos.
realmente , quando aumentei o
memory_limit de 8M para 32M , continuou com o problema (vamos dizer , melhoror um pouco)
Mas quando aumentei de
32M para 128M , parece que nao deu mais erro.
coloquei um if antes de abrir o arquivo.
--------------
if (filesize($path) > 12000000) {
die("Arquivo muito grande");
}
-------------
com isso resolvi em parte o problema, pois nao deve ocorrer mais o connection broken neste trecho do codigo.
Valeu mesmo !
Você precisa estar logado no PHPBrasil.com para poder enviar mensagens para os nossos fóruns.

Faça o login aqui.