OVH Community, votre nouvel espace communautaire.

Commande EXEC() ne marche pas


cassiopee
30/03/2013, 17h31
Citation Envoyé par Sax76
Le "planificateur de tache" fonctionne a merveille enfin !!!!

mon script est activé toutes les heures et l'index rame plus

un GRAND merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii à casiopee pour le coup de main
Cool, content pour toi

cassiopee
30/03/2013, 17h30
Citation Envoyé par Sax76
oui cassiopee mais le exec() change rien ca fais ramer le page index comme si le script etait dans la page index.php
Il faut sans doute revoir le paramétrage de redirection du canal de sortie et
des erreurs ; sans cela effectivement le programme ne sera pas lancé en tâche de fond
et cela reviendra au même que d'exécuter direcement le code PHP.

Cf là : http://php.net/manual/fr/function.exec.php

Extrait :

Si vous démarrez un programme en utilisant cette fonction et que vous voulez le laisser
tourner en arrière plan, vous devez vous assurer que la sortie du programme est redirigée
vers un fichier, ou un autre flux de sortie, sinon PHP attendra jusqu'à la fin de l'exécution
du programme.

Sax76
30/03/2013, 16h58
Le "planificateur de tache" fonctionne a merveille enfin !!!!

mon script est activé toutes les heures et l'index rame plus

un GRAND merciiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii à casiopee pour le coup de main

Sax76
30/03/2013, 16h09
oui cassiopee mais le exec() change rien ca fais ramer le page index comme si le script etait dans la page index.php

cassiopee
30/03/2013, 15h41
Citation Envoyé par Sax76
ca devrait marcher ?
Normalement oui, c'est facile à tester

Edit: nos messages se sont croisés

Sax76
30/03/2013, 15h39
ca marche le EXEC('/usr/local/bin/php.ORIG.5 ................')

mais ca rame toujours
je comprends pas , normalement ça devrait tourner en fond et pas me bloquer l'affichage j'ai tjrs le petit lag de 2 sec
que ce soit exec() ou le script dans la page direct ca va pas plus vite !!

j'ai pourtant mis le exec() a la fin du code mais rien change

edit :

j'ai reactivé le CRON



j'ai pas fais d'erreur ?

sinon depuis putty je peux pas lancer moi meme le cron ?

* * * * * * /usr/local/bin/php.ORIG.5 /homez.xxx/i****/www/compteur.php

normalement la si je me trompe pas j'ai activation du code toute les minutes tous les jours (limite flood)
je suis sur la bonne route ou pas ?

Sax76
30/03/2013, 15h15
i***@ssh1.start.ha.ovh.net :~$ /usr/local/bin/php.ORIG.5 /homez.xxx/i*****/www/compteur.php
X-Powered-By: PHP/5.2.17
Content-type: text/html

on dirait que la ca marche

pour faire fonctionner le cron je dois faire quoi alors ?

ou est ce que je peux mettre une commande EXEC() avec ces parametre la ? dans ma page index pour qu'il tourne en tache de fond ?


exec('/usr/local/bin/php.ORIG.5 /homez.xxx/i****/www/compteur.php >/dev/null 2>&1');

ca devrait marcher ?

cassiopee
30/03/2013, 14h38
Bien, ça progresse dans le bon sens

D'une manière générale, pour un script appelé par CRON, il ne faut utiliser que des chemins
absolus et pas du tout de chemin relatif (parce que l'environnement de cron n'est pas
le même que celui en vigueur lors de l'exécution du script depuis un navigateur).

Pour la fonction scandir(), c'est une fonction PHP à partir de PHP 5,
or le "/usr/local/bin/php" est un moteur PHP en version 4.x.

Pour avoir un moteur PHP en version 5.x, c'est "/usr/local/bin/php.ORIG.5"
qu'il faut utiliser.

Sax76
30/03/2013, 13h38
non j'ai pas fais ça
j'ai testé que direct via mon navigateur

je viens de tester par putty

-ovh_ssh: /usr/bin/php: No such file or directory

voila reponse du serveur


EDIT:
j'ai testé le meme code mais avec /usr/local/bin/php
et la il me retourne une erreur sur une commande scandir()
pourtant quand je charge le script dans mon navigateur il marche bien
au debut j'avais pas mis le chemin relatif

$files = scandir('mb/');

j'ai donc mis :
$files = scandir('/homez.xxx/i*****/www/mb/');

meme erreur

Fatal error: Call to undefined function: scandir() in /homez.xxx/i*****/www/compteur.php on line 42

cassiopee
30/03/2013, 08h27
Déjà est-ce que ça fonctionne "manuellement" ?

C'est-à-dire que tu te connectes en SSH et que tu tapes la commande :

Code:
/usr/bin/php /homez.XXX/i****/www/compteur.php
est-ce que ça fait le travail prévu ?

(pareil si tu as fais un shell script, essaye de le lancer manuellement afin de voir
s'il fonctionne normalement)

Sax76
30/03/2013, 04h18
bon le cron a pas fonctionner , dans les logs du manager c'est vide
et pas reçu de mail rien , pourtant activé tous les jours / toutes les heures

je sais pas pourquoi ça n'a pas fonctionné en auto

Sax76
29/03/2013, 17h12
Oui le plus gros en a 10.000 mais n'est plus dans la liste du script c'est une $var fiche ajouté pour gagner du temps

pour le moment aucune surcharge le systeme actuel tourne depuis 2 ans environs mais bon, je voulais gagner sur les 3/4 secondes de lag

j'attends de voir si le CRON va marcher c'est toutes les heures , j'ai demandé a recevoir un mail quand il s'active .

apres oui il reste a repenser le code enfin 2 codes
effectivement il s'agit d'upload par les utilisateurs , mais il existe 2 systeme :
-page web
-soft

donc ca risque d'etre chaud a recoder

si vraiment pas le choix ben on passera par cette commande .

cassiopee
29/03/2013, 16h25
Citation Envoyé par Sax76
je change de dossier tous les 7.000 environ
je charge de façon manuel le calcul , le script a juste compter que ce qui se trouve
dans le nouveau dossier , donc au debut ca va aller super vite puis arriver dans les 4500
un petit lag de 1 sec apparait
7000 fichiers dans un seul répertoire ? Oui, ça me parait beaucoup.
Plus il y a de fichiers, plus leur accès sera lent (simplement parce qu'il faut
parcourir davantage de secteurs du disque dur pour y accéder).

Ces fichiers sont uploadés via le web par des utilisateurs ?

Si oui, est-ce que ça ne serait pas plus simple de faire en sorte que le script PHP
d'upload incrémente un compteur (dans un fichier texte, dans une base de données, etc.) à chaque upload ?

faut que je trouve ce texte , tu as un lien ?
Un texte précis sur ce point non mais un exemple des limites là :

http://forum.ovh.com/showthread.php?t=87513

http://forum.ovh.com/showthread.php?t=86975

Okillerd est le programme appelé afin de tuer un process trop long/gourmand.

http://guides.ovh.com/MessageOkillerd

Sax76
29/03/2013, 15h57
je change de dossier tous les 7.000 environ
je charge de façon manuel le calcul , le script a juste compter que ce qui se trouve dans le nouveau dossier , donc au debut ca va aller super vite puis arriver dans les 4500 un petit lag de 1 sec apparait

je pense que le CRON de ovh devrait aller pour le moment

Je te dis tout ça parce que sinon, tôt ou tard, tu vas te heurter aux limites "en dur"
imposées par OVH sur les temps d'exécution des scripts PHP (il me semble 30 secondes).
faut que je trouve ce texte , tu as un lien ?


D'abord, il faut s'assurer que le script fonctionne en mode shell, c'est à dire qu'il est capable de s'exécuter depuis la ligne de commande. Pour cela, il faut placer dans la première ligne #!/usr/local/bin/php s'il s'agit d'un script php, #!/usr/bin/perl si c'est un script perl, ou #!/bin/bash pour un script shell, puis utiliser la commande chmod 700 script.cgi sur le script. Si vous avez l'accès telnet/ssh, vous pouvez tester son exécution avec ./script.cgi Cela est facultatif pour l'exécution d'un script PHP.

N'oubliez pas d'utiliser la commande "cd /home/login" au début de votre script, ou bien d'utiliser des chemins absolus lorsque vous précisez le nom d'un fichier (par exemple /home/login/texte.txt au lieu de texte.txt), car votre script s'exécutera dans le répertoire.
je dois deja tester ça que je viens de voir
pas sur que mon CRON marche pour le moment

cassiopee
29/03/2013, 15h42
Le fait de faire un include/require ne fait pas ramer la page (enfin sauf peut-être pour de très très gros
volumes de PHP, mettons plusieurs dizaines de milliers de lignes).

C'est l'exécution du code PHP qui prend du temps. Là aussi tu pourrais déclencher l'appel
à la fonction de façon pseudo-aléatoire (du genre "1 fois sur 10, on appelle la fonction PHP de compteur").

Ensuite, tu peux peut-être jouer sur la façon de compter : mettons qu'en tout tu aies
100 répertoires avec chacun 1000 fichiers.

Plutôt que de compter ces 100 000 fichiers à chaque appel, tu n'en comptes qu'une partie,
par exemple seulement 10 répertoires, ce qui devrait aller 10 fois plus vite (quitte à jouer
sur la fréquence d'appel (en l'augmentant) si besoin est).

Je te dis tout ça parce que sinon, tôt ou tard, tu vas te heurter aux limites "en dur"
imposées par OVH sur les temps d'exécution des scripts PHP (il me semble 30 secondes).

Sax76
29/03/2013, 15h37
En attendant de trouver plus proche en temps
j'ai activé le script via le "planificateur de tache" de ovh manager

le script sera mis à jour toutes les heures

provisoirement le temps de trouver comment executer le script toutes les 15 minutes ou en auto via l'affichage de la page index.php

Sax76
29/03/2013, 15h06
bonjour cassiopee

ben en fait je fais ca car j'ai énormément de fichiers à compter
donc un include ou integrer le code dans mon index me fait ramer la page complète .
pour ça que j'ai du passer par un fichier txt
le processus comporte 3 etape et prends 3/4 secondes

je dois palier a ce soucis en passant par le exec et faire tourner le script en tache de fond .
en fait le script sera exécuté aléatoirement avec les visiteurs

cassiopee
29/03/2013, 14h12
Est-ce que ça ne serait pas plus simple d'avoir une fonction PHP dans "compteur.php",
de faire un "include/require" du fichier "compteur.php" dans le fichier "index.php"
et dans "index.php", à l'endroit du exec() actuel de faire un appel à la fonction de "compteur.php" ?

Sax76
29/03/2013, 13h58
bonjour à tous ,

voila j'utilise un script php qui compte des images dans un dossier ,
il inscrit ce nombre dans un fichier txt .

je voudrais automatiser le lancement du script

j'ai donc voulu utiliser la commande exec(...) dans ma page index
pour qu'a chaque affichage de la page index.php le fichier txt soit mis à jour .

probleme ca ne fonctionne pas
j'ai l'offre PRO 100Go

voici le code que j'ai mis (apres recherche) au debut de ma page index.php

exec("/usr/bin/php /homez.XXX/i****/www/compteur.php" );

mais rien à faire
comment puis je faire pour utiliser cette fonction , j'ai mis le chemin relatif mais rien ...
cdt