Discussion:
une question sur la fonction fopen
(trop ancien pour répondre)
anelor
2007-04-02 15:00:39 UTC
Permalink
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
Olivier Miakinen
2007-04-02 15:22:06 UTC
Permalink
Post by anelor
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
Post by anelor
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);
}
Olivier Miakinen
2007-04-02 15:54:26 UTC
Permalink
Post by Olivier Miakinen
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.
Denis Beauregard
2007-04-02 15:23:20 UTC
Permalink
Post by 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
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
Olivier Miakinen
2007-04-02 15:54:26 UTC
Permalink
Post by Denis Beauregard
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é.
Post by Denis Beauregard
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.
Post by Denis Beauregard
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.
thierry
2007-04-02 18:11:33 UTC
Permalink
Post by anelor
Bonjour à tous,
bonjour,
Post by anelor
Voilà mon petit soucis : j'ouvre des pages avec la fonction fopen. Ces
---------------------------------------^fichiers
Post by anelor
pages sont appelées en http.
-------------------------^ donc tu utilises une version de php
compatible avec la directive allow_url_fopen
Post by anelor
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
Post by anelor
while (!feof($page)) {
$buffer.=fgets($page, 4096) ;
}
ici
http://fr2.php.net/manual/fr/function.file-get-contents.php
me semblerait plus approprié
Post by anelor
}
Malheureusement, toutes les pages ne sont pas appelées
je ne comprends pas bien le sens de cette phrase...
que fais tu de $buffer ?

Continuer la lecture sur narkive:
Loading...