Связь, передача информации между приложением PHP и приложением Ruby - PullRequest
3 голосов
/ 04 июля 2010

Я в основном работаю на PHP и предпочитаю это делать, так как на этом языке, кажется, есть больше рабочих мест, по крайней мере, в моей области (и я все еще довольно новичок в этом, поэтому я хочу продолжать изучать язык лучше)... но для некоторых вещей, которые я хочу сделать, мне нужно использовать библиотеку WWW Mechanize, которая не работает с PHP, но работает с Ruby (да, я знаю, что у PHP есть некоторые альтернативы, но я пробовал их, и они не работают для менятак что мне нужно сделать это), поэтому я хотел бы написать большую часть своего приложения на PHP, а затем просто вызвать Ruby, когда мне нужно использовать эту библиотеку, а затем передать информацию обратно в PHP, да, я знаю, что это будет "медленно"но в данном случае это не проблема, поскольку это не общедоступное веб-приложение, оно предназначено только для использования в бизнесе.

Мне интересно, как лучше всего передавать информацию между двумя языками.Я думал об использовании http POST (как с Curl в PHP), чтобы сделать это, но не уверен, что это самый эффективный способ, какой-либо .. любая информация приветствуется, спасибо

Ответы [ 2 ]

4 голосов
/ 04 июля 2010

Есть два разных способа сделать это:

\ 1. В ruby ​​настройте не HTTP-сервер, который слушает только '::' (или 127.0.0.1, если вам не нравится ipv6). Затем каждый раз, когда ваш PHP-скрипт должен что-то делать, он может подключиться к серверу и передать ему данные. Это было бы самым быстрым решением, потому что скрипт ruby ​​не нужно запускать каждый раз, когда PHP должен что-то делать.

Пример 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

Пример клиента Ruby: (вам нужно будет перевести это на 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

Вы можете использовать инструменты наблюдения за процессом, такие как http://god.rubyforge.org/, чтобы сервер работал.

\ 2. Сделайте скрипт ruby ​​утилитой командной строки и используйте exec в PHP для его вызова.

Пример сценария командной строки:

require 'mechanize'

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

do_mechanize_stuff ARGV.shift, ARGV
1 голос
/ 04 июля 2010

Я бы предложил следовать архитектуре Software as Service Architectire (SOA) и запускать приложение Ruby / Rails в качестве отдельного процесса. Вам придется разработать API между ними (очень простой будет работать): использование POST / GET, как вы сначала подумали, является правильным путем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...