通信,在PHP App和Ruby App之间传递信息

时间:2010-07-04 17:43:44

标签: php ruby integration

我主要使用PHP而且更喜欢这样做,因为这种语言似乎有更多的工作,至少在我的领域(我还是很新的,所以我想继续学习更好的语言) ..但是对于我想要做的一些事情,我需要使用WWW Mechanize库,它不能与PHP一起使用但是使用Ruby(是的我知道PHP有一些替代方案,但我已经尝试过它们并且它们对我不起作用所以我需要这样做),所以我想用PHP编写我的大部分应用程序,然后在我需要使用这个库时调用Ruby,然后将信息传递回PHP,是的,我知道这将是“慢“但这不是一个问题,因为这不是一个公共网络应用程序,它只是为了商业用途..

我想知道在两种语言之间传递信息的最佳方式是什么..我曾想过使用http POST(就像在PHP中使用Curl)来做这个但不确定这是否是最有效的方法..感谢任何信息,谢谢

2 个答案:

答案 0 :(得分:4)

我会采用两种不同的方式:

\ 1。在ruby中,设置一个仅侦听'::'的非HTTP服务器(如果你不喜欢ipv6,则设置为127.0.0.1)。然后,每次PHP脚本需要执行某些操作时,它都可以连接到服务器并将数据传递给它。这将是最快的解决方案,因为每次PHP需要执行某些操作时都不需要启动ruby脚本。

示例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脚本成为命令行实用程序,并在PHP中使用exec来调用它。

示例命令行脚本:

require 'mechanize'

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

do_mechanize_stuff ARGV.shift, ARGV

答案 1 :(得分:1)

我建议遵循软件即服务架构(SOA)并将Ruby / Rails应用程序作为单独的进程运行。你必须在两者之间开发一个API(一个非常简单的API可以工作):使用POST / GET,因为你认为这是一个正确的方法。