OVH Cloud OVH Cloud

PHP 4.1.2 -> 4.3.10

17 réponses
Avatar
Etienne SOBOLE
Je viens de passer de la version
4.1.2 a la version 4.3.10 et ca merdouille un peu partout.
parmi les choses incompréhensibles :
- le fread qui n'accepte plus de lire 0 octet. Ce qui veut dire que le code
suivant:
$file = '/tmp/file.txt';

if (file_exists($file))
{
$fp = fopen($file, 'r');
$buf = fread($fp, filesize($file);
fclose($fp);
}

n'est plus valide, puisque si le fichier existe mais ne contrient aucun
caractère, et bien ca plante...
Autant dire que j'ai utilisé ce code au moins 1000 fois... donc, et bien
c'est pas cool.

Ils sont un peu a coté de la plaque sur ce coup la je pense...

Etienne

10 réponses

1 2
Avatar
loufoque
Etienne SOBOLE a dit le 13/01/2005 09:31:

- le fread qui n'accepte plus de lire 0 octet. Ce qui veut dire que le code
suivant:
$file = '/tmp/file.txt';

if (file_exists($file))
{
$fp = fopen($file, 'r');
$buf = fread($fp, filesize($file);
fclose($fp);
}



De toutes façons, c'est un peu stupide le fread filesize.
Il faut faire fread avec un buffer statique (genre 512, 1048 ou 2096).

Avatar
Marc

De toutes façons, c'est un peu stupide le fread filesize.
Il faut faire fread avec un buffer statique (genre 512, 1048 ou 2096).


la notion de "buffer", c'est une notion C, C++, en php, l'allocation
est toujours dynamique et completement transparente. Ce qui n'empeche
pas dans ce cas precis d'avoir envie de lire 4 octets et pas tout le
buffer ; ca peut service dans le cas ou on veut faire de la lecture
binaire conjoiintement a unpack().

Sinon, pour la question, il est possible de placer un error-handler
et de masquer cette erreur de facon générique.

le retour de fread($fd, 0) retour false et ca devrait le faire, quelque
soit les contions d'appel.

Mais tu as raison (Etienne), ce n'est pas logique d'autant que c'est
textuellement
l'expemple employé dans la doc fread() qui est indiqué ici.

Avatar
m-e-
"loufoque" a écrit dans
le message de news: 41e6881e$0$29890$
[...]
De toutes façons, c'est un peu stupide le fread filesize.
Il faut faire fread avec un buffer statique (genre 512, 1048
ou 2096).


Pourriez-vous nous expliquer pourquoi ?

Avatar
Cedric Nilly
De toutes façons, c'est un peu stupide le fread filesize.
Il faut faire fread avec un buffer statique (genre 512, 1048
ou 2096).


Pourriez-vous nous expliquer pourquoi ?


Par exemple, pour envoyer un fichier a l'internaute, en lisant le fichier
d'un coup le serveur web va devoir le placer entierement en RAM.
Pour un fichier de 200 megs, 5 utilisateurs qui telechargent, et vlan 1Go de
RAM de pris.
D'où le coup de buffer.


Avatar
m-e-
"Cedric Nilly" a écrit dans le message de
news: 41e7bc1d$0$29451$
[...]
Par exemple, pour envoyer un fichier a l'internaute, en lisant
le fichier
d'un coup le serveur web va devoir le placer entierement en
RAM.
Pour un fichier de 200 megs, 5 utilisateurs qui telechargent,
et vlan 1Go de
RAM de pris.
D'où le coup de buffer.


D'accord. Mais en soit la lecture du fichier en une fois
est-elle stupide ? Je comprends que dans le cas que vous
indiquez il vaille mieux lire par blocs, mais dans d'autres, on
aura besoin de travailler sur une variable contenant l'ensemble
du fichier. A ce moment, la récupération par blocs devient
inutile, n'est-ce pas ?

Avatar
Marc

Par exemple, pour envoyer un fichier a l'internaute, en lisant le fichier
d'un coup le serveur web va devoir le placer entierement en RAM.
Pour un fichier de 200 megs, 5 utilisateurs qui telechargent, et vlan 1Go de
RAM de pris.
D'où le coup de buffer.


dans ce cas, il s'agit plus de flux (facon pipe Unix) que de buffer.

Avatar
Etienne SOBOLE
Mais tu as raison (Etienne), ce n'est pas logique d'autant que c'est
textuellement
l'expemple employé dans la doc fread() qui est indiqué ici.


Surtout qu'on se demande en quoi ca derange de retourner une chaine vide...
ce qui est le comportement logiqu auquel on peut s'attendre

cette modification a eu lieu dans la version 4.3.10
Fixed bug #26752 (Silent unterminated loop when length parameter for
fgets(), fread() and fgetss() is 0). (Ilia)

Mais bon il y a un monde entre corriger un probleme de boucle silencieuse
(mais qu'est ce que ca peut bien etre ;)) et perdre de façon importante la
compatibilté... j'ajouterai SANS RAISON...

Enfin bon. c'est la vie.

foreach($tableau AS $res)
a aussi disparu semble t-il. mais la ca doit dater d'une beaucoup plus
ancienne version du PHP.

Etienne

Avatar
Vincent Lascaux
De toutes façons, c'est un peu stupide le fread filesize.
Il faut faire fread avec un buffer statique (genre 512, 1048
ou 2096).


Pourriez-vous nous expliquer pourquoi ?


Par exemple, pour envoyer un fichier a l'internaute, en lisant le fichier
d'un coup le serveur web va devoir le placer entierement en RAM.
Pour un fichier de 200 megs, 5 utilisateurs qui telechargent, et vlan 1Go
de
RAM de pris.
D'où le coup de buffer.


C'est un peu stupide d'utiliser un buffer pour ca. Il y a la fonction
readfile qui fait exactement ca.
Et puis, tu dis que faire un fread filesize est stupide et pour le prouver
tu prends un cas particulier où c'est stupide. C'est comme si je disais
"c'est stupide d'avoir la marche arrière sur une voiture. Imagines, t'es sur
l'autoroute, t'utilises la marche arrière, à tous les coups tu fait un
accident".

Remarques, il y a la fonction file_get_contents qui doit faire pareil que
fread filesize, mais qui marche même si filesize est à 0...

--
Vincent



Avatar
Cedric Nilly
C'est un peu stupide d'utiliser un buffer pour ca. Il y a la fonction
readfile qui fait exactement ca.


Ce n'est pas stupide, puisque readfile() marche de la meme facon, il faut
splitter le fichier en plusieurs morceaux.

Prends quelques secondes pour lire les commentaires de la fonction sur
http://fr.php.net/readfile

Avatar
Marc Quinton
Etienne SOBOLE wrote:

foreach($tableau AS $res)
a aussi disparu semble t-il. mais la ca doit dater d'une beaucoup plus
ancienne version du PHP.


comment ? plait-il ?

j'utilise regulierement la boucle foreach($un_tableau as $une_variable);
ca marche parfaitement.

1 2