fopen qui ne se ferme pas

Eléphant du PHP | 64 Messages

08 janv. 2007, 07:52

Bonjour à tous et à toutes,

J'ai 2800 URL dans une bdd et je veux lire s'ils sont encore fonctionnel,

j'ai fait un script:
include "include/get_root_da.inc";

$result = mysql_query ("SELECT * FROM w_url ORDER BY wid LIMIT 0,50",$db);


while ($myrow = mysql_fetch_array($result)) {

$url = $myrow["url"];
$wid = $myrow["wid"];

$fh = fopen("$url", "r");

if ( $fh ) {$v_comm='OK'; } else { $v_comm = 'NO'; }


 echo "<a href=\"$url\" target=_blank>wid $wid</a> v_comm $v_comm<br>";

     $sqlup = "UPDATE w_url SET check_url = '$v_comm' WHERE wid=$wid";

    $resultup = mysql_query($sqlup);

}
Le problème est que quand le URL ne marche pas, le fopen ne se ferme pas et j'obtiens

Fatal error: Maximum execution time of 30 seconds exceeded in ....

J'avais de l'espoir avec
checkdnsrr($mailDomain, "MX");
mais j'ai lu que cela ne marchait pas sur les serveurs Windows,

J'ai aussi essayé file_get_contents
qui ouvre tout le fichier mais ce n'est pas ce que je cherche

Je cherche une commande courte qui me dit si mon URL est fonctionnel ou non.

Plus tard quand j'aurais trié les URL je regarderais les meta-description.

Merci de votre aide

ViPHP
ViPHP | 1961 Messages

08 janv. 2007, 08:12

Bonjour,

Concernant la fermeture de ton File descriptor, c'est normal qu'il ne se ferme pas.
Tu ne le demandes pas.

Concernant le message d'erreur, c'est le temps maximum qui est imparti à un script PHP pour l'exécution.

Quand tu as une URL qui ne répond pas, le script lui continue à tourner et les 30 secondes sont atteintes, d'où ton message.

Pour fermer ton File Descriptor, avant l'accolade de fermeture du while
fclose($fh);
Pour augmenter le temps d'exécution d'un script, dans ton fichier php.ini, modifie la valeur de la directive max_execution_time.
N'oublie pas de redémarre ton serveur WEB après la modification.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

08 janv. 2007, 10:34

Tu trouveras également pas mal d'exemples et de suggestions pour tester une url dans les commentaires postés sur la doc de la fonction file_exists()
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 64 Messages

08 janv. 2007, 16:07

J'ai effectué la modification
include "include/get_root_da.inc";

$result = mysql_query ("SELECT * FROM w_url ORDER BY wid LIMIT 0,50",$db);


while ($myrow = mysql_fetch_array($result)) {

$url = $myrow["url"];
$wid = $myrow["wid"];

$fh = fopen("$url", "r");

if ( $fh ) {$v_comm='OK'; } else { $v_comm = 'NO'; }

fclose($fh);

 echo "<a href=\"$url\" target=_blank>wid $wid</a> v_comm $v_comm<br>";

     $sqlup = "UPDATE w_url SET check_url = '$v_comm' WHERE wid=$wid";

    $resultup = mysql_query($sqlup);
ensuite sur ma machine j'ai changé le temps de 30 à 60 sec.

J'ai rebooté ma machine


J'ai toujours les messages d'erreur suivant:

Warning: fopen(): php_network_getaddresses: gethostbyname failed in ...\batch_url_html.php on line 22

Warning: fopen(http://www.kreller.de): failed to open stream: No such file or directory in ..\batch_url_html.php on line 22

Warning: fclose(): supplied argument is not a valid stream resource in ...\batch_url_html.php on line 26

Fatal error: Maximum execution time of 30 seconds exceeded in ...\batch_url_html.php on line 22

Cela me donne une première réponse, à savoir que le php.ini à changer est celui du serveur, auquel je n'ai pas accès. Je n'ai pas de serveur web à moi, ou en colocation.

Si je fais un phpinfo sur le serveur, j'obtiens:

- allow_url_fopen On On
- max_execution_time 30 30

Merci pour ton temps

Eléphant du PHP | 64 Messages

08 janv. 2007, 16:19

J'ai fait
if ( file_exists('$url')){ $v_comm='OK'; } else { $v_comm = 'NO'; }

 echo "<a href=\"$url\" target=_blank>wid $wid</a> v_comm $v_comm<br>";

     $sqlup = "UPDATE w_url SET check_url = '$v_comm' WHERE wid=$wid";

    $resultup = mysql_query($sqlup);

}
cela marche très vite, j'ai juste un problème pour reécupérer la valeur:

cela fait tout le temps v_comm = NO

Dois-je utiliser
clearstatcache()
si oui comment?

Merci de ton temps

Eléphant du PHP | 64 Messages

08 janv. 2007, 16:26

include "include/get_root_da.inc";

$result = mysql_query ("SELECT * FROM w_url ORDER BY wid LIMIT 0,50",$db);


while ($myrow = mysql_fetch_array($result)) {

$url = $myrow["url"];
$wid = $myrow["wid"];

if ( file_exists('$url') ){ $v_comm ='OK'; } else { $v_comm = 'NO'; }

 echo "<a href=\"$url\" target=_blank>wid $wid</a> v_comm $v_comm<br>";

     $sqlup = "UPDATE w_url SET check_url = '$v_comm' WHERE wid=$wid";

    $resultup = mysql_query($sqlup);

clearstatcache();
Ne marche pas plus

Merci pour votre temps