Aller au contenu

PHP & CURL = HELP !


Alastor

Messages recommandés

Bonjour amis codeurs,

 

pour les besoins d'une mise à disposition d'informations sur un site intranet, j'ai besoin d'intégrer des informations provenant de Kibana (pas de SQL donc, moteur ElasticSearch). Les requêtes se font donc sous la forme de commandes CURL :

 

Exemple :

 

curl -XGET 'XXX -d '{
"facets": {
"terms": {
"terms": {
"field": "app_info2",
"size": 50,
"order": "count",
"exclude": []
},
"facet_filter": {
"fquery": {
"query": {
"filtered": {
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "app_priority: \"2\""
}
}
]
}
},
"filter": {
"bool": {
"must": [
{
"range": {
"@timestamp": {
"from": 1443684216839,
"to": 1443705816839
}
}
},
{
"fquery": {
"query": {
"query_string": {
"query": "host:(XXXX XXXX)"
}
},
"_cache": true
}
},
{
"fquery": {
"query": {
"query_string": {
"query": "_type:(\"syslog\")"
}
},
"_cache": true
}
}
]
}
}
}
}
}
}
}
},
"size": 0
}'

 

J'ai déjà bossé avec CURL et PHP, mais c'était uniquement pour récupérer le code source d'une page, donc relativement plus simple à développer. Là j'ai un peu plus de mal...

Si quelqu'un peut me filer un coup de main, ce serait sympa :)

Lien vers le commentaire
Partager sur d’autres sites

Je veux pouvoir récupérer le résultat de la commande CURL.

 

Et ça ?

 

Après nativement je pense pas que tu puisses récupérer le résultat de curl, Après ce que tu peux faire c'est de voir si tu peux stocker tes résultats de requêtes dans un fichier, json par exemple, ça sera largement plus simple comme ça. (certes c'est chiant, et plus lourd)

Lien vers le commentaire
Partager sur d’autres sites

Je suppose que tu récupère les résultats sous forme d'entête http ou autre ?

 

Tu peux également faire un echo de ces résulats ...

 

J'ai travaillé sur le web client d'hadoop à l'arrache : https://github.com/CamilleGR/Wada/tree/master/uploadOnHdfs

 

Le client en Js contient les commandes curl, les options surtout. Et le fichier php exécute ces commandes.

 

Ensuite faut voir la doc pour interpréter les résultats :fumer:

 

PS : Le truc sur elastic chez nous ne marche pas :transpi:

Lien vers le commentaire
Partager sur d’autres sites

Oui, je pensais récupérer tout le contenu dans une variable PHP et faire le tri ensuite, vu que côté curl ça reste un XGET avec options.

 

Effectivement, j'ai regardé un peu ce matin comment configurer/installer/utiliser leur API et ça a l'air assez usine à gaz, si en plus tu me dis que ça marche pas, je vais ptet essayer de trouver une autre solution :transpi:

 

En fait je pense que je bloque juste sur l'équivalence en PHP de l'option "-d" de curl, je ne sais pas trop quelle option utiliser dans le curl_setopt(), j'ai rien trouvé concernant un paramètre DATA ou SETDATA...

Lien vers le commentaire
Partager sur d’autres sites

Oui, je pensais récupérer tout le contenu dans une variable PHP et faire le tri ensuite, vu que côté curl ça reste un XGET avec options.

 

Effectivement, j'ai regardé un peu ce matin comment configurer/installer/utiliser leur API et ça a l'air assez usine à gaz, si en plus tu me dis que ça marche pas, je vais ptet essayer de trouver une autre solution :transpi:

 

En fait je pense que je bloque juste sur l'équivalence en PHP de l'option "-d" de curl, je ne sais pas trop quelle option utiliser dans le curl_setopt(), j'ai rien trouvé concernant un paramètre DATA ou SETDATA...

 

T'as cherché sur stackoverflow ? 

Lien vers le commentaire
Partager sur d’autres sites

J'ai pas mal avancé grâce à StackOverflow oui :)

 

Bon, pour info, voilà ce que j'ai codé :

 

<?php$json = '{  "facets": {    "terms": {      "terms": {        "field": "app_info2",        "size": 50,        "order": "count",        "exclude": []      },      "facet_filter": {        "fquery": {          "query": {            "filtered": {              "query": {                "bool": {                  "should": [                    {                      "query_string": {                        "query": "app_priority: \"2\""                      }                    }                  ]                }              },              "filter": {                "bool": {                  "must": [                    {                      "range": {                        "@timestamp": {                          "from": 1443757510673,                          "to": 1443779110673                        }                      }                    },                    {                      "fquery": {                        "query": {                          "query_string": {                            "query": "host:(XXXX XXXX)"                          }                        },                        "_cache": true                      }                    },                    {                      "fquery": {                        "query": {                          "query_string": {                            "query": "_type:(\"syslog\")"                          }                        },                        "_cache": true                      }                    }                  ]                }              }            }          }        }      }    }  },  "size": 0}';$url = 'XXX';$jsonDataEncoded = json_encode($json, true);$ch = curl_init();// Définition des paramètres CURL (URL,données POST,retours du CURL,user-agent)curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;	MSIE 6.0; Windows NT 5.1)");curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonDataEncoded);$data = curl_exec($ch);echo $data;curl_close($ch);

 

Et le résultat obtenu :

 

{ "error" : "SearchPhaseExecutionException[Failed to execute phase [query_fetch], all shards failed; shardFailures {[yMpf2sP6QFe_hnXU2JglNA][trz-traceo-2015.10.02][0]: SearchParseException[[trz-traceo-2015.10.02][0]: from[-1],size[-1]: Parse Failure [Failed to parse source [\"{\\r\\n \\\"facets\\\": {\\r\\n \\\"terms\\\": {\\r\\n \\\"terms\\\": {\\r\\n \\\"field\\\": \\\"app_info2\\\",\\r\\n \\\"size\\\": 50,\\r\\n \\\"order\\\": \\\"count\\\",\\r\\n \\\"exclude\\\": []\\r\\n },\\r\\n \\\"facet_filter\\\": {\\r\\n \\\"fquery\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"filtered\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"bool\\\": {\\r\\n \\\"should\\\": [\\r\\n {\\r\\n \\\"query_string\\\": {\\r\\n \\\"query\\\": \\\"app_priority: \\\\\\\"2\\\\\\\"\\\"\\r\\n }\\r\\n }\\r\\n ]\\r\\n }\\r\\n },\\r\\n \\\"filter\\\": {\\r\\n \\\"bool\\\": {\\r\\n \\\"must\\\": [\\r\\n {\\r\\n \\\"range\\\": {\\r\\n \\\"@timestamp\\\": {\\r\\n \\\"from\\\": 1443757510673,\\r\\n \\\"to\\\": 1443779110673\\r\\n }\\r\\n }\\r\\n },\\r\\n {\\r\\n \\\"fquery\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"query_string\\\": {\\r\\n \\\"query\\\": \\\"host:(CPY00702 CPY00718)\\\"\\r\\n }\\r\\n },\\r\\n \\\"_cache\\\": true\\r\\n }\\r\\n },\\r\\n {\\r\\n \\\"fquery\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"query_string\\\": {\\r\\n \\\"query\\\": \\\"_type:(\\\\\\\"syslog\\\\\\\")\\\"\\r\\n }\\r\\n },\\r\\n \\\"_cache\\\": true\\r\\n }\\r\\n }\\r\\n ]\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n },\\r\\n \\\"size\\\": 0\\r\\n}\"]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }]", "status" : 400 } 

 

Je pense que je suis pas loin, un problème d'encodage ?

Lien vers le commentaire
Partager sur d’autres sites

Toutes tes valeurs sont en UTF8 ? car le json_encode retourne false si c'est pas de l'utf8.

 

Ensuite je pense que tu confond les choses (facile a dire quand on écrit pas le code hein :) )

$jsonDataEncoded = json_encode($json, true);

Ton erreur viens du fait que tu lui passe une chaîne de caractère, alors que tu peux très bien lui passer un Array, la tu encode un Json en Json d'ou ton problème au final de l'encodage de tes sauts de ligne \r\n en \\r\\n 

Parse Failure [Failed to parse source [\"{\\r\\n \\\"facets\\\": {\\r\\n \\\"terms\\\": {\\r\\n \\\"terms\\\": {\\r\\n \\\"field\\\": \\\"app_info2\\\",\\r\\n \\\"size\\\": 50,\\r\\n \\\"order\\\": \\\"count\\\",\\r\\n \\\"exclude\\\": []\\r\\n },\\r\\n \\\"facet_filter\\\": {\\r\\n \\\"fquery\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"filtered\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"bool\\\": {\\r\\n \\\"should\\\": [\\r\\n {\\r\\n \\\"query_string\\\": {\\r\\n \\\"query\\\": \\\"app_priority: \\\\\\\"2\\\\\\\"\\\"\\r\\n }\\r\\n }\\r\\n ]\\r\\n }\\r\\n },\\r\\n \\\"filter\\\": {\\r\\n \\\"bool\\\": {\\r\\n \\\"must\\\": [\\r\\n {\\r\\n \\\"range\\\": {\\r\\n \\\"@timestamp\\\": {\\r\\n \\\"from\\\": 1443757510673,\\r\\n \\\"to\\\": 1443779110673\\r\\n }\\r\\n }\\r\\n },\\r\\n {\\r\\n \\\"fquery\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"query_string\\\": {\\r\\n \\\"query\\\": \\\"host:(CPY00702 CPY00718)\\\"\\r\\n }\\r\\n },\\r\\n \\\"_cache\\\": true\\r\\n }\\r\\n },\\r\\n {\\r\\n \\\"fquery\\\": {\\r\\n \\\"query\\\": {\\r\\n \\\"query_string\\\": {\\r\\n \\\"query\\\": \\\"_type:(\\\\\\\"syslog\\\\\\\")\\\"\\r\\n }\\r\\n },\\r\\n \\\"_cache\\\": true\\r\\n }\\r\\n }\\r\\n ]\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n },\\r\\n \\\"size\\\": 0\\r\\n}\"]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }]", "status" : 400 } 

Tranforme ton $Json en array et sa va marcher du tonnerre :)

Lien vers le commentaire
Partager sur d’autres sites

Oula, j'ai un peu la tête dans le guidon, le weekend va faire du bien... :oops:

 

Je teste ça lundi, merci pour le coup de main !

 

Edit :

Bon du coup, avec les idées claires, ça va mieux !

J'ai juste retiré le json_encode comme me l'a préconisé maximeK et effectivement ça fonctionne beaucoup mieux. Merci à toi !

 

Il ne me reste plus qu'à modifier la partie Timestamp de la requête pour que ça ne me renvoie les données que sur la période de temps que je veux et j'aurais plus qu'à mettre en forme les résultats.

 

Je passe le topic en résolu du coup, merci à tous ! :inpactitude:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...