2010-11-28 7 views
1

Selon le fichier d'amorçage de Drupal 7:Est-ce que fread() de PHP lit toujours au moins 4096 octets?

// PHP only performs buffered reads, so in reality it will always read 
// at least 4096 bytes. Thus, it costs nothing extra to read and store 
// much so as to speed any additional invocations. 

PHP va toujours lire 4096, peu importe si vous avez spécifié une valeur inférieure pour le paramètre length. Est-ce vrai? Si oui, n'y a-t-il vraiment aucun moyen de faire des lectures non tamponnées? Edit: Je voudrais lire /dev/urandom sans consommer d'entropie inutilement.

Répondre

1

Ici, j'obtenu une fonction pour vous en PHP - stream_set_read_buffer():

int stream_set_read_buffer (resource $stream , int $buffer) 

tampon: Le nombre d'octets à tampon. Si le tampon est à 0 alors les opérations de lecture sont sans tampon. Cela garantit que toutes les lectures avec fread() sont terminées avant que d'autres processus soient autorisés à écrire dans ce flux de sortie. Donc, si vous voulez changer le comportement par défaut, alors cette fonction devrait être utile pour expérimenter.

3

Si vous avez un fichier de moins de 4096 octets, alors il serait moins, ou rembourré avec des valeurs nulles j'imagine. Ce qui ne va pas avec une mémoire tampon de 4096 octets de toute façon - c'est trop petit pour affecter la consommation de mémoire d'une manière importante, sauf s'il y a quelque chose qui me manque ici.

+0

Merci pour la réponse, voir ma mise à jour. – Tower

+0

Pour vos besoins, je pense que 4096 octets est bien - '/ dev/urandom' continuera à générer de l'entropie pour toujours. Si votre programme prend 4 096 octets (4 Ko), cela prendra des microsecondes à lire, peut-être même moins, ce qui signifie que plus d'entropie peut prendre sa place et être utilisée par d'autres processus presque instantanément. – Bojangles

+0

Je ne pense pas que ce soit bien. Si j'ai besoin, disons, de 16 octets de données pseudo-aléatoires, cela n'a aucun sens de rapprocher la source d'entropie 4096 octets de l'épuisement. Avez-vous des preuves ou des expériences sur vos pensées? – Tower

0

Un travail possible autour de PHP 5.3 < semble être d'utiliser file_get_contents():

$output = file_get_contents('/dev/urandom', FALSE, NULL, -1, $bytes); 

L'invocation est un peu laid. Je ne sais pas comment confirmer qu'il n'est pas tamponné, cependant, autre que la lecture de la source C.

http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/ext/standard/file.c?revision=298881&view=markup

http://svn.php.net/viewvc/php/php-src/branches/PHP_5_2/main/streams/streams.c?revision=293175&view=markup

Il ne ressemble pas à le flux d'entrée se trouve en position d'être unbuffered, il semble que ce lit aussi au moins la taille de la mémoire tampon minimale de PHP sur 5.2.

+0

Il est tamponné, malheureusement. Je viens de le tester avec un flux d'espace utilisateur. – Narf