Depuis peu de temps, j'ai un souci avec mes scripts php que je fais tourner en local. Si j'appelle dans mon navigateur: [localhost] et que le script doit effectuer une tâche qui est très longue à effectuer, et bien désormais, mon navigateur ne m'affichera plus la page générée par wamp, si la page met trop de temps à être générée. A la place, j'aurais comme message indiqué par mon navigateur:
"Impossible d'afficher la page Web, car le serveur n'a envoyé aucune donnée"
c'est la première fois depuis 4 ans que j'ai ce problème, alors que je souvent fais tourner des longs scripts
Pour l'instant, je n'ai aucune idée d'où cela pourrait venir.
ok, je vais essayer de voir ça. je n'avais pas pensé à cela d'une part parceque j'ai installé pour la dernière fois wampserver depuis un an au moins et n'ai fait aucune modification depuis et pendant longtemps je n'ai pas eu de problème. et d'autre part, parce que le script php ne s'arrête pas ! ! je vois que les tables que je remplis avec le script continuent à se remplir, même si le navigateur dit qu'il ne peut charger la page...
Modifie 1 fois. Derniere modification le 28/10/2013 à 03:50 par fludbis.
N'avez-vous pas un moyen simple d'éviter un long chargement de votre page HTML ? Coté internaute, attendre trop longtemps peu en rebuté plus d'un ! Est-ce que vous avez beaucoup d'images en chargement ?
Bien sûr qu'une solution consiste à modifier le timeout du php. Mais la raison première ne vient-elle d'une mauvaise conception de votre site ?
Rien ne dit qu'il s'agisse d'un site destiné aux utilisateurs du web. Il existe des "applications" en PHP pour gérer des données et les organiser.
Cependant, il est vrai qu'à moins d'un script mal conçu, ou d'une énorme quantité de données (à découper dans ce cas) il n'est pas normal d'atteindre le timeout.
Une des premières choses à faire, c'est de vérifier le fichier de logs PHP
A moins de me tromper, le langage php n'est pas destiné à faire du traitement de masse mais bien à la mise en forme des pages html.
S'il s'agit d'un traitement de masse concernant, par exemple, la réorganisation de la base de données MySql, on peut très bien le faire en 'C' ou 'C++'. Je nomme cela de la maintenance et doit se faire en hors ligne !
Je pense qu'à la base de ce genre de problème, l'utilisateur en question s'est trompé de langage et devrait, pour des questions de performances, se diriger vers un langage compilé !
J'aimerai connaitre la réponse de fludbis à ce sujet ?
Bonjour, Je suis le webmaster du Guide Rapide, qui est un site où j'ai environ 6000 fiches de films actuellement. Pour presque chacune de ses fiches de films, j'ai une bande annonce, en général chez Dailymotion ou Youtube. Mais la plupart du temps, ces bandes annonces n'étant pas à moi ( je veux dire : sur un compte Youtube ou Dailymotion qui ne m'appartient pas ), je suis confronté au problème suivant:
-> les possesseurs des comptes youtube ou dailymotion où sont stockées ces bandes annonces sont susceptibles de: - clôturer leur compte - supprimer la vidéo - la rendre privée
Je dois donc faire des vérifications pour voir si la bande annonce est toujours disponible. Pour cela j'essaie d'ouvrir la page de la bande annonce avec la méthode curl de php. Le script que j'ai écrit prend environ 3 heures pour faire le tour des 6000 films.
Ensuite il affiche sur la page générée (html), les identifiants des bandes annonces fautives.
Jusqu'à présent, des scripts de ce genre ne me posaient aucun problème.
( je dis "de ce genre", car j'en ai d'autres, par exemple des scripts qui vont vérifier dans l'API de iTunes si il y a des nouveautés VOD chez itunes ... )
mais depuis quelques semaines, subitement, chaque fois que je lance un script long, je me retrouve au bout de peut-être 20 minutes ou une demi-heure, avec mon navigateur qui m'annonce qu'il ne va pas charger la page, et ceci quelque soit le navigateur que j'utilise.
C'est vraiment hyper strange: ça marchait avant, et ça a même marché pendant des années et puis subitement, ça foire.
Ce qui est très embêtant, parce que sur la page html, je génère des liens vers les pages internet qui m'intéresse ( par exemple, si je détecte une nouveauté chez iTunes, je fais un lien vers la page internet de iTunes, et je fais un lien vers la fiche de film de mon site pour pouvoir faire une vérification visuelle que mon programme a bien déterminé une concordance entre deux films qui soient effectivement identiques ! ! ).
Donc pour l'instant j'ai tenu compte de ce que m'a répondu "bagu", et j'ai mis dans mon php.ini de wamp:
max_input_time = 60 000 au lieu de 60 default socket_timeout = 60 000 au lieu de 60 mysql_connect_timeout = 60 000 au lieu de 60
et dans la config de apache, j'ai du mettre session-gc_maxlifetime à 60 000 au lieu de 1440
La aujourd'hui je viens de relancer mon script d'analyse des bandes annonces et Google Chrome m'annonce à nouveau "Echec de chargement".
Ce qui est "rigolo", c'est que je vois que wamp contine d'exécuter mon script php, puisque la table mysql ou je stocke les infos que naguère je lisais sur ma page html générée, est en train de se remplir.
Donc j'aurai tout de même les identifiants des bandes annonces disparues.
Mais je n'ai plus la page html générées avec dessus les liens qui me permettent de travailler beaucoup plus vite.
Voilà, je crois vous avoir tout dit cette fois-ci ! ! !
j'ai oublié de préciser pour que ce soit bien clair: je lance mes scripts d'analyse sur mon propre PC. je suis en local donc. j'ai installé wamp sur ma machine pour pouvoir faire tourner mes scripts php.
> mais depuis quelques semaines, subitement, chaque fois que je lance un script long...
Si vous n'avez rien changé dans la configuration Apache, PHP et MySQL, c'est qu'il y a eu quelque chose de changé dans le système et/ou dans les configurations réseau, car, bien que vos scripts tournent en local, il vont interroger des url externes.
D'autre part il vous faut aussi vérifier TOUTES les demandes de connexion vers l'extérieur, par exemple, les vérifications automatiques de mise à jour, non seulement du système, mais également de tous vos logiciels installés, des navigateurs et de leurs extensions, également les mises à jour de l'antivirus. La réponse « Échec de chargement » peut très bien être une réponse à un téléchargement de mise à jour du navigateur, des extensions ou d'un logiciel, d'autant plus que le script continue de tourner.
De plus, et à mon humble avis, ce genre de traitement est à faire à partir d'un navigateur sans aucune extension, sans mise à jour automatique et surtout pas à partir de Google Chrome, bourré de liens et de chargements de pleins de trucs et d'espions.
Certes, sur le fond, vous n'avez pas tord. Cependant, pour plusieurs raisons, cela peut arriver de faire du traitement de masse avec php hors ligne. Que ce soit pour tester la résistance d'un site web à une montée en charge, tester le serveur, ou tout simplement parce que l'utilisateur ne connait que php, et pas C++. (ajoutez à cela un manque de temps et ou d'argent pour se former à c++)
Donc même s'il est préférable d'utiliser c++ pour les usages offline, ce n'est pas toujours possible.
Pour en revenir au sujet initial, il est tout à fait possible que l'un, au moins, des sites visités par curl ai mis en plus une protection contre les accès trop nombreux. Du coup, le script local peut très bien continuer, mais ne gérant pas les échec, afficher un échec de chargement.
En somme, ajoutez des contrôles d'erreurs. En l'état, il est difficile de savoir d’où vient le problème. Et si effectivement vous n'avez rien changé, il est peu probable que le problème soit lié à wamp.
je retiens du message d'Otomatic que cela pourrait par exemple venir de mon antivirus. Or cela me rappelle maintenant que Avast a fait une mise majeure il y a quelques temps et que cela pourrait bien coïncider avec le début de mes problèmes, je ne me rappelle plus. Je vais voir dans cette direction. Déjà en arrêtant Avast lors d'un script long. Merci pour vos messages
Il y a un autre sujet sur le forum parlant d'un problème avec avast 2014. Ce dernier pose effectivement problème, et j'avoue ne pas avoir cherché de solution pour le moment.
@bagu : j'ai cru, à tort, que le traitement se faisant en mode offline, du genre une réorganisation de la base de données.
@ fludbis : je comprends mieux la nature de votre problème. Vous avez mal conçu votre traitement d'un point de vue organisation.
Au départ, vous devriez avoir qu'un seule tâche, concernant une seule fiche. Cette tâche cherche le paramétrage directement dans une table MySql, et indique les informations suivantes : --> Date + heure de début de la tâche. --> Date + heure de fin de la tâche. -> Une variable qui vous indique l'état de votre tâche : 0 : tâche non effectuée. 1 : en cours d'exécution. 2 : tâche terminée normalement et fiche disponible. 3 : tâche terminée normalement et fiche non disponible.
Le résultat sera stocké dans la même table MySql et non à l'affichage dans un document HTML. Donc aucune perte d'information en cas d'arrêt inopportun de votre ordinateur.
Et vous faites un enchainement de toutes vos tâches. Si l'une ne se termine pas correctement, ce n'est pas grave et vous enchainez sur la suivante et ainsi de suite. En tant que vérification, il suffit de lister celles qui ont la variable booléenne correspondante à ce que vous recherchez. Exemple : quelles sont celles qui se sont plantées --> testé si booléenne = 1.
Ne pas oubliez de libérer les ressources utilisées par la tâche lorsqu'elle se termine. Même si le temps d'exécution dure 3 heures, en cas de plantage, le traitement reprendra que sur les tâches non traitées (booléen = 0).
En fait, je fais déjà ce que vous dites: tous les résultats de mes scripts sont stockées dans une table (MySQL).
Je vais simplement devoir désormais faire un script pour pouvoir utiliser les données dans ma table plus facilement que en ouvrant la table et en regardant dedans.
( notamment j'aimais bien sur mes pages html générées par mes scripts avoir des liens qui me permettaient d'ouvrir directement les pages internet concernées sur mon navigateur, sans devoir faire du copié collé d'url de ma table de résultats à mon navigateur).
/
pour assurer la fin de cette conversation je vous donne l'info qui répond à mon problème initial:
LE SOUCI c'est AVAST, mon anti-virus.
Si je le désactive, et bien je n'ai plus aucun problème...
par contre, j'ai essayé de configurer les paramètres d'avast pour ne pas avoir à le désactiver, mais je n'arrive pas à trouver une configuration où il ne vient pas déranger mes scripts (lorsqu'ils sont longs).
J'ai notamment mis des exceptions sur les pages [localhost] et [127.0.0.1] , mais cela ne marche pas.
A NOTER: actuellement, si je laisse AVAST branché, il fait quelque chose de très curieux: si mon script php est long a exécuter, au bout d'un quart d'heure après que j'ai lancé le script, AVAST RELANCE Lui-Même le script. Donc mon script tourne DEUX FOIX. je vois donc dans ma table sql ou je stocke les résultats générés par mon script, voir apparaitre les résultats DEUX FOIS, à un quart d'heure d'interval.
par exemple, je vais voir dans ma table quelque chose de se genre :
film 445 | video X123456 chez youtube | ne s'ouvre pas | erreur détectée à 12h15
film 578 | video YYYY chez dailymotion | ne s'ouvre pas | erreur détectée à 12h25
film 445 | video X123456 chez youtube | ne s'ouvre pas | erreur détectée à 12h30
film 600 | video 012hjk chez youtube | ne s'ouvre pas | erreur détectée à 12h31
la troisième ligne est une aberration si on ne comprend pas que le script est en train de tourner DEUX FOIS ( a un quart d'heure d'intervale ). si le script ne tournait qu'une seule fois, il serait strictement impossible qu'un film soit traité deux fois. Ma requete SQL est archi simple et ne peut retourner deux fois le meme film.
$requete = SELECT * FROM ma_table_des_films ORDER BY identifiant_bien_sur_unique_des_films ASC
Citation Fludbis En fait, je fais déjà ce que vous dites: tous les résultats de mes scripts sont stockées dans une table (MySQL).
Pas exactement ! Je vous ai indiqué l'astuce du booléen qui donne l'état de votre traitement sur un film en particulier. S'il est à '0', il est prêt pour un nouveau traitement ! S'il est à '1', il est en cours de traitement. s'il est à '2', il a fini son traitement.
L’aberration dont vous parlez ne peut pas se produire avec mon booléen, car si vous lancez deux fois le traitement, la première chose à faire est de vérifiez l'état de ce booléen. S'il est à '0' alors vous le mettez tout de suite à '1' et vous le traitez. S'il est à '1'ou à '2', vous l'ignorez !
De plus, le fait de faire des traitements unitaires, permet en cas de plantage de lancer ce que l'on nomme un point de reprise, ce qui n'est pas le cas chez vous. Vous devez aussi paramétrer ce point de reprise afin de sélectionner ce que vous désirez faire. Exemple : suite à un plantage, je fais une reprise, en ne traitant que ceux qui sont à '0'. C'est normal, car vous terminez le traitement qui a été interrompu !
Ensuite, vous pouvez avec une page HTML très simple, visualiser que ceux qui ont comme booléen la valeur '1'. Cette valeur sera celle du film qui ne se sera pas terminé correctement.
Le but recherché par ces modifications est de faire en sorte de déclencher chaque traitement sur un film d'une manière unitaire. Cela vous évitera d'avoir justement une erreur dans la longueur de votre traitement.
Je pense que vous ne comprenez pas ce que j'essaye de vous dire !?!? Un traitement qui dure 2 minutes passe très bien ! Pour ce faire, il suffit du coté apache de modifier les paramètres concernant les temps de réponses.
Lorsque votre traitement unitaire est terminé, vous enchainé sur le suivant. Oui, mais comment ? Grâce à un timer ! Disons que toutes les secondes, vous vérifiez l'état de votre booléen. Si le traitement en cours passe à '2', vous pouvez enchainer sur le suivant. S'il dépasse disons 10 minutes, sachant que le traitement dure normalement 2 minutes, vous pouvez enchainer sur le suivant, car ce traitement est planté !
Votre problème est ce que j'appelle un goulot d'étranglement. C'est exactement le même problème que les files d'attentes. Quand il y a trop de monde, ça bouchonne ! Faites en sorte qu'il n'existe aucune files d'attente.
je comprends l'idée de noter dans une table si un film a été traité ou pas et commet s'est passé le traitement, mais là où je bloque c'est dans les concepts de "traitement de manière unitaire" et de "timer".
je me demande si il ne s'agirait pas d'un type de programmation que je ne connaîtrais pas.
moi j'écris un script php unique, et dedans je mets une boucle while qui passe de film en film.
c'est vrai que ce serait bien que je puisse lancer de façon répétitive un script php, qui lui ne traiterait qu'un seul film ( donc sans boucle while ). et dès que le script serait fini, il se relancerait automatiquement ?
c'est sur que je n'aurais plus ce problème de scripts longs.
mais comment faire pour qu'un script se relance tout seul ?
j'ai fait des recherches dans google avec les mots clé "timer php" et ça ne m'éclaire pas plus...