Exécution du code php dans un script du serveur socket node.js

Je lance un socket TCP normal dans javascript et utilise le nœud à exécuter. Avant d'envoyer une réponse au client, je souhaite valider les données avec un certain code php (mysql). Comment puis-je exécuter ce code dans ce fichier javascript? Toutes les questions similaires dans STACKOVERFLOW posent des questions sur ce code en HTML. (Ce qui est correct et je comprends cette partie), mais c'est un fichier javascript normal (exécuté dans un nœud). Le code javascript est ci-dessous et j'ai marqué l'appel de la fonction de validation.

var net = require('net'); var HOST = '192.168.0.6'; var PORT = 8765; net.createServer(function(sock) { console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); sock.on('data', function(data) { var output; var validScan; //This is the function call to a php file **validScan = validateScanTag(data);** console.log('DATA ' + sock.remoteAddress + ': ' + data); sock.write(validScan); }); // Closing this instance of socket sock.on('close', function(data) { console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort); }); }).listen(PORT, HOST); console.log('Server listening on ' + HOST +':'+ PORT); 

Le validateScanTag exécute une ligne lke:

 $.post('getperiod.php', {hours:hrs, minutes:mins, seconds:secs, ddd:day}, 

Mais cela ne fonctionne pas. Comment puis-je appeler ce fichier 'geteriod.php' à partir d'un fichier javascript?

Je suis certain que le problème lui-même vaut la peine de repenser (par exemple, signalez votre code mysql de php en nœud) mais voici ma solution:

 var net = require('net'); var PORT = 8765; var Lazy=require('lazy'); var spawn = require('child_process').spawn; // php code runs as a server in external process var validator = spawn('php', ['validator.php']); net.createServer(function(sock) { console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); // on 'data' handler is not enough to read input line by line // you need to buffer data, use some kind of state machine or one of available stream parsers. I use lazy here: npm install lazy // write each line to php validation code new Lazy(sock).lines.forEach(function(line) { console.log('DATA ' + sock.remoteAddress + ': ' + line.toString()); validator.stdin.write(line); validator.stdin.write('\n'); }); // read validation result line by line from validator process new Lazy(validator.stdout).lines.forEach(function(line) { console.log('Validation result:' + line.toString()) // line is Buffer object here, hence toString }); validator.stdout.pipe(process.stdout); // Closing this instance of socket sock.on('close', function() { console.log('CLOSED'); }); }).listen(PORT); 

Validator.php devrait lire de stdin et écrire à stdout

 <? function validatescanTag($l) { // put your validation code here return $l . '!!!!'; } $stdin = fopen('php://stdin', 'r'); do { $line = fgets($stdin); print validateScanTag($line); } while(1); ?> 

Une autre option est d'utiliser le protocole fastcgi pour communiquer le nœud <-> php ou dnode rpc . Ou utilisez simplement http et exécutez php à partir de nginx / apache (ou même node-php )

Une approche pour donner une réponse plus générique pour la clarification et "vous mettre sur les bottes":

Dans la mesure où je comprends, vous essayez d'exécuter votre script php à l'aide d'une requête http post invoquée par le serveur node.js.

Il est probable que vous devez d'abord prendre conscience du fait que l'utilisation de JavaScript côté serveur comporte normalement différentes motivations et possibilités ainsi que des impacts sur votre architecture que l'exécution de JS dans un navigateur – du moins dans un "sens jQuery" classique.

Comme indiqué dans votre commentaire, vous voulez que jQuery fonctionne de façon transparente dans le nœud du serveur. Cela ne fonctionne pas à mesure que le commentaire de ReferenceError: $ is not defined vous montre. Il n'y a pas de jQuery côté serveur disponible dans votre pile node.js en cours d'exécution (la possibilité d'utiliser jQuery server-side doit être discutée séparément et est un autre sujet).

Néanmoins, vous cherchez évidemment un moyen de réutiliser votre script PHP qui gère déjà votre connexion et votre gestion de données mysql en l' utilisant sur le serveur . Faire cela à l' aide de http il existe des possibilités telles que présentées dans ce message stackoverflow ou dans la section http.request de la documentation node.js. Si votre script php réside sur le même serveur (ou un meilleur environnement d'exécution) que votre node.js fonctionne, vous pouvez également exécuter directement le script php en le créant en tant que processus enfant avec l'utilitaire php autonome (ligne de commande).

Last but not least: Oui, il existe plusieurs façons (modules npm, couches ORM) pour connecter mysql directement avec votre application node.js. Mais c'est un autre sujet complexe et est discuté à d'autres endroits.

J'espère que cela m'a aidé à éviter de mélanger des choses qui ne doivent pas être mélangées.

Il existe une extension PHP intégrant le moteur V8 de Chrome en PHP.