【问题标题】:Communication, Passing Info between PHP App and Ruby App通信,通过PHP应用程序和Ruby应用程序之间的信息
【发布时间】:2011-03-11 16:12:33
【问题描述】:

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

我想知道在两种语言之间传递信息的最佳方式是什么。我曾想过使用 http POST(如 PHP 中的 Curl)来做到这一点,但不确定这是否是最有效的方式.. 任何信息表示赞赏,谢谢

【问题讨论】:

    标签: php ruby integration


    【解决方案1】:

    有两种不同的方法可以做到这一点:

    \1。在 ruby​​ 中,设置一个仅监听 '::' 的非 HTTP 服务器(如果您不喜欢 ipv6,则为 127.0.0.1)。然后,每次您的 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​​ 脚本设为命令行实用程序,并在 PHP 中使用 exec 调用它。

    一个示例命令行脚本:

    require 'mechanize'
    
    def do_mechanize_stuff(command, *args)
      # ... from previous example
    end
    
    do_mechanize_stuff ARGV.shift, ARGV
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 谢谢,我会研究 SOA。我只是在使用 Ruby,而不是 Rails,因为我不需要在 ruby​​ 方面为此提供框架,因为我认为它只会使使用3rd 方库,除非它本身支持它,所以我必须研究一下
      • 我建议使用 Rails(顺便说一下,它不是第 3 方),这将提供一个很好的模型/视图/控制器框架和 HTTP 绑定,因为您的 API 将基于 HTTP。您还可以查看 RESTful APIS。这将简化很多事情(类似于 API 的 CRUD 风格)
      • 我的意思是图书馆是第 3 方,而不是 rails
      猜你喜欢
      • 2015-07-15
      • 2011-10-26
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多