Page 1 sur 1

fopen qui ne se ferme pas

Posté : 08 janv. 2007, 07:52
par daplus
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

Posté : 08 janv. 2007, 08:12
par Ajoloca
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.

Posté : 08 janv. 2007, 10:34
par Ryle
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()

Merci Ajoloca

Posté : 08 janv. 2007, 16:07
par daplus
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

Merci à Ryle

Posté : 08 janv. 2007, 16:19
par daplus
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

Toujours sur clearstatcache

Posté : 08 janv. 2007, 16:26
par daplus
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