Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

une question sur la fonction fopen

5 réponses
Avatar
anelor
Bonjour à tous,

Voilà mon petit soucis : j'ouvre des pages avec la fonction fopen. Ces
pages sont appelées en http.
J'aimerai que mon script ouvre chacune des pages appelées jusqu'au
bout.

Pour le moment, j'ai
foreach($url_a_regenerer as $url) {
$page = fopen($url., r);
while (!feof($page)) {
$buffer.=fgets($page, 4096) ;
}
}

Malheureusement, toutes les pages ne sont pas appelées

Une idée ?
Merci par avance

5 réponses

Avatar
Olivier Miakinen

Voilà mon petit soucis : j'ouvre des pages avec la fonction fopen. Ces
pages sont appelées en http.
J'aimerai que mon script ouvre chacune des pages appelées jusqu'au
bout.

Pour le moment, j'ai
foreach($url_a_regenerer as $url) {
$page = fopen($url., r);


« $url. » ???
« r » ???


Pour le premier, je suppose qu'il s'agit d'une coquille dans cet article
et que ton code est bon, car sinon il me semble que tu ne pourrais pas
l'exécuter du tout.


Pour le second, en revanche, je soupçonne que tu as vraiment écrit « r »
à la place de « 'r' » ou « "r" », et que tu n'as jamais lancé ton script
en positionnant tous les niveaux de warning.

Tiens, pour rigoler, ne change rien à ton script, mais rajoute juste
« define("r", "w"); » au tout début. Je te conseille quand même de faire
une sauvegarde avant parce que sinon tu vas criser...

Pendant que tu seras en train de restaurer ton système de fichiers, tu
auras peut-être le temps de lire ceci :
http://fr3.php.net/manual/fr/language.types.string.php
http://fr3.php.net/manual/fr/language.constants.php


while (!feof($page)) {
$buffer.=fgets($page, 4096) ;
}
}

Malheureusement, toutes les pages ne sont pas appelées

Une idée ?


Deux idées :
1) $url_a_regenerer est incomplet.
2) Comme tu ne fais jamais de fclose(), tu dépasses le nombre maximum
de ressources simultanées que peut ouvrir un processus.

Suggestion :

foreach($url_a_regenerer as $url) {
$page = fopen($url, 'r');
while (!feof($page)) {
$buffer .= fgets($page, 4096) ;
}
fclose($page);
}

Avatar
Denis Beauregard
Le 02 Apr 2007 15:00:39 GMT, "anelor" écrivait
dans fr.comp.lang.php:

Bonjour à tous,

Voilà mon petit soucis : j'ouvre des pages avec la fonction fopen. Ces
pages sont appelées en http.
J'aimerai que mon script ouvre chacune des pages appelées jusqu'au
bout.

Pour le moment, j'ai
foreach($url_a_regenerer as $url) {
$page = fopen($url., r);
while (!feof($page)) {
$buffer.=fgets($page, 4096) ;
}
}

Malheureusement, toutes les pages ne sont pas appelées

Une idée ?
Merci par avance


Il faut fermer la page, tout simplement.

Je pense que PHP est écrit en C++. Un "fopen" retourne alors un
"handle", un pointeur vers les données du fichier. Le nombre de
handle est limité dans DOS par défaut. Il existe des moyens pour
l'augmenter, mais je doute que cela soit utilisé en PHP car le
nombre de fichiers ouverts est rarement élevé. Après un certain
nombre de fopen, il n'y a tout simplement plus de handle disponible.
Le fclose libère le handle, ce qui permet de le réutiliser.


Denis

Avatar
Olivier Miakinen

Je pense que PHP est écrit en C++.


Euh... je croyais qu'il était écrit en C. Quoi qu'il en soit, on s'en
fiche : qu'il soit écrit en C, en BASIC ou en COBOL, il s'agit de
ressources systèmes dont le nombre n'est pas illimité.

Un "fopen" retourne alors un
"handle", un pointeur vers les données du fichier. Le nombre de
handle est limité dans DOS par défaut.


Oui, et dans Unix aussi.

Il existe des moyens pour
l'augmenter, mais je doute que cela soit utilisé en PHP car le
nombre de fichiers ouverts est rarement élevé. Après un certain
nombre de fopen, il n'y a tout simplement plus de handle disponible.
Le fclose libère le handle, ce qui permet de le réutiliser.


Oui.

Avatar
Olivier Miakinen
Le 02/04/2007 17:22, je répondais à anelor :

Tiens, pour rigoler, ne change rien à ton script, mais rajoute juste
« define("r", "w"); » au tout début. Je te conseille quand même de faire
une sauvegarde avant parce que sinon tu vas criser...


Rhazut, ça ne peut pas marcher car ce sont des URL et pas des fichiers
locaux. Bon, de toute façon je pense que tu n'aurais pas essayé, mais
j'espère que ça t'aura quand même convaincu qu'il ne faut pas confondre
les chaînes de caractères avec des constantes.

Avatar
thierry
Bonjour à tous,
bonjour,



Voilà mon petit soucis : j'ouvre des pages avec la fonction fopen. Ces
---------------------------------------^fichiers


pages sont appelées en http.
-------------------------^ donc tu utilises une version de php

compatible avec la directive allow_url_fopen

J'aimerai que mon script ouvre chacune des pages appelées jusqu'au
bout.

Pour le moment, j'ai
foreach($url_a_regenerer as $url) {
$page = fopen($url., r);
----------------------------------------------------^ pourquoi ce . ?

- tu ne testes pas la valeur de retour de la fonction ?
- ce pourrait être un bon point de départ pour résoudre ton problème.
- tu pourrais même envisager d'utiliser
http://fr2.php.net/manual/fr/function.file-exists.php
while (!feof($page)) {
$buffer.=fgets($page, 4096) ;
}
ici

http://fr2.php.net/manual/fr/function.file-get-contents.php
me semblerait plus approprié
}

Malheureusement, toutes les pages ne sont pas appelées
je ne comprends pas bien le sens de cette phrase...

que fais tu de $buffer ?