2010-07-04 6 views
3

Je travaille principalement en PHP et préfère le faire car il semble qu'il y ait plus d'emplois dans cette langue, du moins dans ma région (et je suis encore relativement nouveau) Je veux continuer à apprendre le langage mieux) .. mais pour certaines choses que je veux faire j'ai besoin d'utiliser la bibliothèque WWW Mechanize qui ne fonctionne pas avec PHP mais avec Ruby (oui je sais que PHP a des alternatives mais j'ai Je les ai essayés et ils ne fonctionnent pas pour moi, donc je dois le faire), donc je voudrais écrire la plupart de mon application en PHP et ensuite appeler Ruby quand j'ai besoin d'utiliser cette bibliothèque, puis transmettre l'information à PHP, oui je sais que ce serait "lent" mais ce n'est pas un problème dans ce cas car ce n'est pas une application web publique, c'est juste pour une utilisation professionnelle ..Communication, transmission d'informations entre l'application PHP et l'application Ruby

Je me demande ce que la meilleure façon serait Haut ass info entre les 2 langues .. J'ai pensé à utiliser http POST (comme avec Curl en PHP) pour le faire mais je ne sais pas si c'est le moyen le plus efficace tout .. toute info est appréciée, merci

Répondre

4

Il y a deux manières différentes de faire ceci:

\ 1. Dans ruby, configurez un serveur non-HTTP qui écoute seulement sur '::' (ou 127.0.0.1 si vous n'aimez pas ipv6). Ensuite, chaque fois que votre script PHP doit faire quelque chose, il peut se connecter au serveur et lui transmettre des données. Ce serait la solution la plus rapide car le script ruby ​​n'a pas besoin de démarrer chaque fois que PHP a besoin de faire quelque chose.

Exemple Ruby:

require 'mechanize' 
require 'socket' 

def do_mechanize_stuff(command, *args) 
    case command 
    when 'search_google' 
    # search google with args.join(' ') 
    when 'answer_questions_on_stackoverflow' 
    # answer questions on stackoverflow 
    # with mechanize 
    end 
    'the result to pass to PHP' 
end 

srv = TCPServer.new '::', 3000 

loop do 
    Thread.new(srv.accept) do |sock| 
    sock.write(
     do_mechanize_stuff *sock.gets.split(' ') 
    ) 
    sock.close 
    end 
end 

Exemple client Ruby: (vous devrez traduire en PHP)

require 'socket' 

# This is a script that searches google 
# and writes the results to stdout. 

s = TCPSocket.new 'localhost', 3000 

s.puts 'search_google how to use a keyboard' 

until (r = s.gets).nil? 
    print r # a search result. 
end 

Vous pouvez utiliser des outils d'observation des processus comme http://god.rubyforge.org/ pour maintenir le fonctionnement du serveur.

\ 2. Faites du script ruby ​​un utilitaire de ligne de commande et utilisez exec en PHP pour l'appeler.

Un exemple de script de ligne de commande:

require 'mechanize' 

def do_mechanize_stuff(command, *args) 
    # ... from previous example 
end 

do_mechanize_stuff ARGV.shift, ARGV 
+0

merci, je vais essayer – Rick

1

Je voudrais suggérer de suivre un Software as a Service Architect (SOA) et d'exécuter une application Ruby/Rails en tant que processus séparé. Vous devrez développer une API entre les deux (une très simple fonctionnera): utiliser POST/GET comme vous l'avez d'abord pensé est une bonne façon d'y aller.

+0

Merci, je vais étudier la SOA .. Je suis juste en utilisant Ruby, Rails pas car je ne suis pas besoin d'un cadre pour cela sur le côté rubis comme Je pense que cela ne ferait que compliquer l'utilisation de la bibliothèque tierce, à moins qu'elle ne le supporte nativement, donc je vais devoir regarder dans ce – Rick

+0

Je suggère d'utiliser Rails (qui n'est pas une tierce partie d'ailleurs), ce qui donnera un joli modèle/view/controller framework et les liaisons HTTP, puisque votre API sera basée sur HTTP. Vous pouvez également regarder dans APIS RESTful. Ce qui va simplifier beaucoup de choses (style CRUD comme API) – Zepplock

+0

Je veux dire que la bibliothèque est la 3ème partie, pas de rails – Rick

Questions connexes