Swisslinux.org

− Le carrefour GNU/Linux en Suisse −

 

Langue

 

Le Forum

Vous n'êtes pas identifié.

#1 26 Apr 2011 15:26:10

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

[Résolu] Problème Ajax dans une tache cron

Bonjour à tous,

J'ai effectué un script en php + ajax, et lorsque je l'exécute avec mon navigateur, le script fonctionne parfaitement.
J'ai ensuite rajouté ce script dans une tache cron comme ceci:

* * * * * php -f /usr/share/.../www/script.php

lorsque j'exécute la commande en ssh ou en cron comme ci-dessus, l'ajax ne s'exécute pas,

mon script ajax appelle une page et lui fournit des données en POST.

Avez-vous une idée? Est ce que php -f peut exécuter de l'ajax normalement?

Dernière modification par ksone (27 Apr 2011 15:09:53)

Hors ligne

 

#2 26 Apr 2011 15:34:06

Tengu
Gourou(e) du libre
Lieu: La Tour-de-Peilz
Date d'inscription: 17 Nov 2004
Messages: 493
Site web

Re: [Résolu] Problème Ajax dans une tache cron

hello,

sans avoir le code de ton script, c'est un poil dur....

Ajax, à la base, c'est un truc javascript. rien à voir avec php wink.


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Hors ligne

 

#3 26 Apr 2011 15:37:23

BOFH
Admin
Lieu: Ecublens, VD
Date d'inscription: 03 Feb 2005
Messages: 862
Site web

Re: [Résolu] Problème Ajax dans une tache cron

Hello,
 
  Effectivement, comme le dit Tengu, dans un scénario ajax typique, le code php exécuté côté serveur se contente de produire des fragments de javascript que le navigateur va exécuter. Si tu appelles l'interpréteur php comme ceci, le javascript sera produit, mais il n'y a rien pour l'exécuter.

  Pour déclencher ta requête POST, le plus simple serait d'utiliser un outil comme curl. Sinon, j'imagine qu'il doit être possible de passer le résultat de l'interpréteur php à un interpréteur javascript comme spidermonkey, mais sans garantie de résultat.

  Exemple avec curl, pour envoyer du json (mais ca se traduit bien au xml):

Code:

curl -X POST -H "Content-Type: application/json" -d '{"hello":"world", "this":["is","my","message"]}' http://host/service.php

Hors ligne

 

#4 26 Apr 2011 22:33:01

jean@adimp.ch
Illuminé(e)
Lieu: Marly
Date d'inscription: 10 Mar 2005
Messages: 1228
Site web

Re: [Résolu] Problème Ajax dans une tache cron

Salut,
Il existe de nombreux "javascript engine" qui te permettrons d'interpréter le code javascript. Est-ce que la partie PHP est vraiment importante?
Meilleures salutations.


--------------------------------------------------------
Jean Tinguely Awais
Ma vie sur twitter : http://www.twitter.com/tservi

Hors ligne

 

#5 27 Apr 2011 06:28:08

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Bonjour à tous, merci pour vos réponses,

Je peux séparer mon code php et mon code javascript, je lancerais le php avec php -f mais comment puis-je exécuter le javascript tout seul?

je vais toujours me renseigner sur les javascript engines en attendant vos réponses.

Hors ligne

 

#6 27 Apr 2011 09:49:27

BOFH
Admin
Lieu: Ecublens, VD
Date d'inscription: 03 Feb 2005
Messages: 862
Site web

Re: [Résolu] Problème Ajax dans une tache cron

Hello,

  Il nous faudrait vraiment plus de détails sur l'architecture de ton système. S'il t'est possible de séparer le js et le php, pourquoi sont-ils ensemble au départ ? Quel est le rôle du php si le js n'est pas dynamique ? (bien qu'en soi, ça soit plutôt une bonne chose)

  Qu'est-ce qui ne convient pas avec l'utilisation de curl ? c'est la manière la plus fiable, et du point de vue système, probablement la plus correcte, d'exécuter une requête http a la volée, et c'est bien plus simple de le faire directement comme ça que de le faire en javascript.

  Avec spidermonkey, tu peux exécuter un script js avec

Code:

js -f script.js

mais attention, l'environnement ne sera pas forcément cohérent avec celui d'un navigateur.

  Il y a également www.envjs.com, un wrapper qui simule l'environnement d'un navigateur, qui a de meilleures chances de marcher.

  Et dernièrement,  si envjs ne marche pas, tu peux peut-être t'en sortir avec un navigateur en CLI comme elinks ?

Hors ligne

 

#7 27 Apr 2011 10:06:28

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Je suis sur un centOS,

j'ai pas le web sur ma machine, je peux me débrouiller pour le mettre mais ça fout le bordel, c'est un serveur de supervision.
j'aimerais bien utiliser curl, mais je comprends pas trop comment ça se passe

les variables post que je veux envoyer sont tout le temps fixe c'est à dire que je souhaite exécuter:

http://localhost/centreon/main.php?p=607 avec les variables POST suivantes:
debug = "1"
gen    = "1"
host = "1"
level = "1"
move = "1"
restart = "1"
restart_mode = "2"

Je vais toujours installer curl.


Mon php est indépendant de mon javascript, mais il doit etre executer juste avant mon javascript.

Hors ligne

 

#8 27 Apr 2011 10:17:54

Tengu
Gourou(e) du libre
Lieu: La Tour-de-Peilz
Date d'inscription: 17 Nov 2004
Messages: 493
Site web

Re: [Résolu] Problème Ajax dans une tache cron

Re-moi.

NOTA:
le javascript ne s'exécute QUE côté navigateur. Par des appels dit "ajax" (Asynchron-machin-truc), il peut appeler des scripts côté serveur, en lui transmettant des infos par les méthodes GET ou POST permettant d'enregistrer des infos sur le serveur et/ou modifier des affichages de manière dynamique côté client.

J'ai donc un peu de peine à voir la corrélation entre ton php """qui doit s'exécuter avant le javascript"""... Ce sont deux mondes séparés, qu'on a tenté de lier avec ces appels asynchrones.

De plus, et je me répète, sans le moindre bout de code, c'est un poil compliqué de comprendre ton problème.

De plus, appeler par un job CRON une page du site relève de l'absurdité complète (génération d'output inutile etc) - il est nettement plus profitable de faire un script dédié, que tu pourrais même placer en dehors de la racine de ton site de manière à avoir un tant soit peu de sécurité.

Du moins, c'est mon avis, cela n'engage donc que moi.... mais, pour avoir dû faire ce genre de trucs (que je trouve extrêmement moche en passant), j'avais fait un script dédié, et pas forcément en php, préférant le Perl à l'époque...

my two cents.

T.


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Hors ligne

 

#9 27 Apr 2011 10:52:15

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Voilà le code ajax :

Code:

<script type="text/javascript">
function loadXHR()
{
    var xhr = false;
    // Si le navigateur possède l'objet XMLHttpRequest en natif
    if(window.XMLHttpRequest) {
    try {
        xhr = new XMLHttpRequest();
    } catch(e) {
        xhr = false;
    }
    // Pour IE 6 et moins
    } else if(window.ActiveXObject) {
        try {
            xhr = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            try {
                xhr = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                xhr = false;
            }
        }
    }
    return xhr ;
}



function restart_nagios(){
    var xhr = loadXHR(); // Initialise l'objet XMLHttpRequest

    var method   = "POST";
    var filename = "http://localhost/centreon/main.php?p=607";
    var debug = "1";
    var gen    = "1";
    var host = "1";
    var level = "1";
    var move = "1";
    var o;
    var restart = "1";
    var restart_mode = "2";
    var submit = "Export";
    var data = "level="+level+"&host="+host+"&gen="+gen+"&debug="+debug+"&move="+move+"&restart="+restart+"&restart_mode="+restart_mode+"&submit="+submit+"&o=";

    xhr.open(method, filename, true);
    
    xhr.onreadystatechange = function anonymous() {
        if(xhr.readyState == 4) {
            var good = '1';
        }
    }

    if(method == "POST")
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");

    xhr.send(data);
}

restart_nagios();
</script>

Avec le php, je récupère une donnée dans une base de donnée X pour la mettre dans une base de donnée Y,

le code ajax (notamment l'appel à la page main.php avec ses arguments) permet de générer des fichiers de conf nagios avec la nouvelle donnée de la base de donnée Y, et permet de restarter le daemon nagios.

Je fais une tache cron parce que je veux mettre à jour la donnée dans la base tous les vendredi à 12h.

Je veux bien lâcher mon code ajax si c'est nettement plus facile en curl.

Je mets pas le code php, je pense pas qu'il soit utile pour résoudre mon problème car ce que je veux c'est pouvoir exécuter le main.php avec ses paramètres et ce tous les vendredis.

Hors ligne

 

#10 27 Apr 2011 11:00:26

Tengu
Gourou(e) du libre
Lieu: La Tour-de-Peilz
Date d'inscription: 17 Nov 2004
Messages: 493
Site web

Re: [Résolu] Problème Ajax dans une tache cron

bah simple pour le curl:

curl -I -d @args "http://localhost/.../main.php"
le -I te sortira le response-header du serveur, ainsi que le code d'erreur si présent/géré par ton application (200 OK, 500 internal server error, etc)
le -d @args : "args" est un fichier dans lequel tu mets tes données sous la forme "toto=titi&tutu=tata".

En passant, jette un oeil aux librairies javascript existantes, notamment jquery... ça simplifie la vie, quand on développe des trucs avec de l'ajax (et du JS de manière générale).

++

C.


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Hors ligne

 

#11 27 Apr 2011 11:10:02

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Merci je vais essayer ça,
Ouais je connais jQuery, d'ailleurs j'ai fait un site en corrélation avec tous ça en jQuery, un gain de temps incroyable pour des superbes effets.

Hors ligne

 

#12 27 Apr 2011 12:59:47

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Désolé je vais encore vous embêter,
donc j'ai testé la commande curl -I -d @args "http://localhost/.../main.php"
plus précisément :

Code:

curl -I -d @/usr/share/fichier "http://localhost/centreon/main.php?p=607"

J'obtenais une erreur Warning : You can only select one http request

J'ai vu alors sur internet qu'il faut remplacer -I par -i, le résultat était mieux.

Néanmoins mes fichiers ne sont pas générées et mon daemon pas restarté.

Actuellement je tape la commande suivante :

Code:

curl -i "http://localhost/centreon/main.php?p=607" -d level=1&host=1&gen=1&debug=1&move=1&restart=1&restart_mode=2&submit=Export&o=

Et j'obtiens ceci comme résultat :
Est ce une erreur?

Code:

[1] 17579
[2] 17580
[3] 17581
[4] 17582
[5] 17583
[6] 17584
[7] 17585
[8] 17586
[2]   Done                    host=1
[3]   Done                    gen=1
[4]   Done                    debug=1
[5]   Done                    move=1
[6]   Done                    restart=1
[root@nagios_srr /]# HTTP/1.1 302 Found
Date: Wed, 27 Apr 2011 10:48:48 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=26snj6pgr1e423ah462ani4b25; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: index.php?disconnect=1
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8


[1]   Done                    curl -i "http://localhost/centreon/main.php?p=607" -d level=1
[7]-  Done                    restart_mode=2
[8]+  Done                    submit=Export

En sachant que là où il y a un saut de ligne il faut que je fasse entrer pour que la commande affiche le reste.

Autre question:
C'est pas génant le get à la fin de mon url? ou bien il faut que j'utilise -G ?

Hors ligne

 

#13 27 Apr 2011 13:05:07

Tengu
Gourou(e) du libre
Lieu: La Tour-de-Peilz
Date d'inscription: 17 Nov 2004
Messages: 493
Site web

Re: [Résolu] Problème Ajax dans une tache cron

Tu trouveras la réponse ici:
http://hacktux.com/bash/ampersand

faut mettre entre single quote la partie suivant le -d


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Hors ligne

 

#14 27 Apr 2011 13:49:40

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Ah d'accord moi qui pensait que c'était les variables qui s'envoyaient en POST big_smile , j'avais essayé avec les singles quotes mais du coup ça donne ça:

Code:

HTTP/1.1 302 Found
Date: Wed, 27 Apr 2011 10:48:48 GMT
Server: Apache/2.2.3 (CentOS)
X-Powered-By: PHP/5.1.6
Set-Cookie: PHPSESSID=26snj6pgr1e423ah462ani4b25; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: index.php?disconnect=1
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Mais j'ai toujours rien c'est comme si l'exécution ne s'était pas faite sad

Pourquoi j'ai un 302 Found et non pas un 200 OK?

Hors ligne

 

#15 27 Apr 2011 14:03:50

BOFH
Admin
Lieu: Ecublens, VD
Date d'inscription: 03 Feb 2005
Messages: 862
Site web

Re: [Résolu] Problème Ajax dans une tache cron

Code:

Location: index.php?disconnect=1

Probablement parce qu'il faut d'abord se connecter à l'application ?

Tu peux utiliser l'option -c de curl pour sauvegarder les cookies, ce qui te permettra de faire d'abord une première requête pour te connecter, puis une 2e pour lancer la commande.

Une approche moins débile serait effectivement d'invoquer directement php, mais pas la page qui génère l'interface, celle qui exécute la commande. Il me semble que le CLI php obéit a la spec CGI, il faudrait donc lui envoyer les données de la requête sur l'entrée standard.

Hors ligne

 

#16 27 Apr 2011 14:07:17

Tengu
Gourou(e) du libre
Lieu: La Tour-de-Peilz
Date d'inscription: 17 Nov 2004
Messages: 493
Site web

Re: [Résolu] Problème Ajax dans une tache cron

ou faire un script python qui fait le login, stock le cookie le temps de faire l'appel de la page, et supprime le cookie proprement... avec gestion des erreurs, etc...

Ou, comme dit plus haut, faire un script php/python/perl/bash/haskel/... en dehors de l'app web pour l'appeler via le cron...


Science sans conscience n'est que ruine de l'âme

https://twitter.com/swisstengu (compte twitter)
https://blog.tengu.ch/ (un blog parmis tant d'autres)

Hors ligne

 

#17 27 Apr 2011 15:08:50

ksone
Affranchi(e)
 
Date d'inscription: 26 Apr 2011
Messages: 8

Re: [Résolu] Problème Ajax dans une tache cron

Super merci beaucoup à tous les deux, les commandes curl marche nickel (une pour l'authentification et l'autre pour la génération des fichiers), et c'est promis je vais faire un script qui les exécute proprement.

smilesmile

Hors ligne

 

Pied de page des forums

Powered by FluxBB