2009-09-23 7 views
8

J'ai un site Web construit avec PHP. J'ai une application Erlang exécutée en tant que démon sur le même serveur. J'ai besoin d'appeler des fonctions sur l'application Erlang de PHP et de récupérer le résultat.interface erlang application avec php

J'ai trouvé PHP/Erlang et plus de modules PHP mais je ne peux pas installer un module PHP sur ce serveur, je ne peux utiliser que du code PHP. Le seul moyen que je connaisse pour le résoudre est de lancer localement un serveur web Erlang auquel le PHP pourra parler.

Y a-t-il une meilleure façon de le résoudre? Si utiliser un serveur httpd est le meilleur moyen, quel serveur Erlang dois-je utiliser? Il devrait être aussi léger que possible et n'a pas besoin de fonctionnalités comme SSL et n'a pas besoin de gérer une charge importante.

Merci

Répondre

-2

Je ne pense pas qu'il y ait une meilleure solution. J'ai besoin du serveur web Erlang pour l'exécuter sur le web. voici quelques PHP info + Erlang liés

http://yaws.hyber.org/cgi.yaws

+0

Je n'ai pas besoin de servir php en utilisant le serveur erlang (pian). Je sers mon php en utilisant apache, mais je veux être capable d'appeler des fonctions erlang à partir de scripts php. –

2

Erlang est excellent sur la prise E/S: vous pourriez peut-être utiliser un tuyau de quelque sorte?

Ce serait plus direct que par le biais d'une autre couche de serveur WEB à coup sûr.

Utilisez les fonctions Erlang: open_port et Erlang: port_command fonctions pour obtenir des données dans/sur Erlang via un port système.

+0

Pouvez-vous expliquer ce que vous entendez par "un tuyau de quelque sorte"? Que dois-je faire du côté erlang et comment l'appeler php? –

+0

Vous écrivez vous-même un gen_server du côté Erlang qui ouvre un socket et du côté PHP vous utilisez aussi un socket (http://ca.php.net/sockets). En termes de format d'échange de données, vous pouvez utiliser XML ou JSON. – jldupont

+0

Le socket sera-t-il thread-safe, ce qui signifie que deux processus erlang peuvent envoyer des messages à la même socket que le serveur gen écoute? Le http://code.google.com/apis/protocolbuffers/docs/overview.html tampon lié au protocole google est-il un moyen plus efficace de transmettre les données? Dans mon cas, la simplicité est beaucoup plus importante que l'efficacité. merci –

2

$ cat erl.erl

#!/usr/bin/env escript 

main(Args) -> 
    io:format("~p\n", [Args]), 
    io:format("~p\n", [(catch test(Args))]). 

test([N1,N2|_]) -> 
    lists:seq(list_to_integer(N1),list_to_integer(N2)). 

$ chmod + x erl.erl

php.php $ cat

?php 
var_dump(exec("./erl.erl 1 5")); 
?> 

$ php php.php

chaîne

(11) "[1,2,3,4,5]"

+0

vous devriez utiliser http://php.net/proc_open en php et la communication la plus probable avec d'autres nœuds erlang dans erl.erl mais je pense que vous pouvez le faire par vous-même :) – JLarky

+0

Ceci est beaucoup plus lent que l'escript doit être compilé chaque temps. En outre, une commande shell doit être générée à chaque fois. – jldupont

+0

vous pouvez remplacer l'escript par l'application erlang compilé, juste "erl -run module fonction args". Et le programme sera engendré une fois par script PHP, pas tellement. – JLarky

3

Je courrais aw ebserver tel que mochiweb hébergeant le code erlang. Le code PHP utiliserait curl pour envoyer des requêtes http codées en JSON à mochiweb. Mochiweb a un codeur/décodeur JSON et PHP a un support JSON natif.

Même si tout est sur le même serveur, utilisez simplement HTTP. Gère toutes les choses de bas niveau et si vous avez besoin d'évoluer, ce sera plus facile, car la mise à l'échelle avec HTTP est un problème résolu. Mochiweb est léger et a de hautes performances.

1

Jetez un oeil à erl_call. http://www.erlang.org/doc/man/erl_call.html

C'est un programme unix qui est utilisé pour appeler une fonction en erlang. Il va démarrer un noeud erl factice, exécuter la ou les commandes et renvoyer le résultat. Vous pouvez utiliser PHP pour appeler erl_call et ensuite utiliser les résultats qu'il renvoie.