Ruby / RoR和许多子进程

时间:2009-11-18 15:08:46

标签: ruby-on-rails ruby multithreading fork popen

我正在尝试使用ruby / rails构建一个免费的Web应用程序它应该能够通过各种移动运营商的在线表单发送短信。 (如this one(俄语))。

所以,我需要

  • 等待想要通过我的网站发送短信的用户。
  • 建立与运营商网站的连接。可能是使用Mechanize。
  • 检索验证码
  • 向用户显示验证码
  • 允许用户输入消息和验证码
  • 在运营商网站上提交表格(包含留言,验证码,电话号码)

在所有这些过程中,与运营商网站的连接应该是活跃的(否则验证码将会改变)。据我所知,每次发送短信时我都需要创建一个(子)进程。 你能否告诉我在rails \ ruby​​中处理这个问题的最佳方法是什么?

我仍然是网络开发的新手...... 我应该使用线程吗?叉? popen方法?使用PTY?一些外部宝石?我应该如何与我的流程沟通?

2 个答案:

答案 0 :(得分:2)

假设运营商的网站没有什么特别之处,不,您不需要在整个过程中保持连接存活。一般来说,网页上的表单的工作方式如下:您访问URL,您的Web浏览器下载带有表单的页面。在你的情况下,它也会有一个< img>标签或类似的显示CAPTCHA。浏览器下载页面后,连接将被切断。填写表单并单击“提交”后,Web浏览器将打开与服务器的新连接并发送数据,服务器将发送其响应(单击“提交”后显示的任何页面)。

您的所有程序都要模仿这种体验。所以:1)下载包含表格的页面。刮掉表单字段(确保你不会错过任何隐藏的字段 - 可能有一些CAPTCHA)和CAPTCHA。 2)构建一个页面,向您的用户显示包含CAPTCHA的表单以及包含他们需要填写的所有字段的表单。如果原始表单中有隐藏字段,请确保包含其值(作为表单中的隐藏字段),因为当用户提交表单时,您将需要它们。 3)然后,当用户提交表单时,将数据(包括隐藏值和用户为CAPTCHA输入的内容)发送给操作员。 4)最后,检查操作员是否表示成功,并建立一个页面告诉用户。

如果你在Rails中这样做,你的控制器中可能有两种方法:一种叫做例如'show'(上面的步骤1和2)将从运营商的网站上抓取CAPTCHA和其他信息,并向用户显示您的表单视图,以及一个名为例如表格将提交给的“发送”(上面的第3步和第4步),将收集他们的数据并将其发送到运营商的网站,收集回复并告诉您的用户是否成功。

注意:在您打扰任何此类操作之前,您需要阅读运营商的服务条款。我相当肯定这种事情会违背他们的TOS,如果他们发现你的服务器以他们的方式发送了很多请求,他们会很快阻止你。

答案 1 :(得分:1)

要回答您的另一个问题,您可以使用DRb或background_job(又名BJ)在后台实际完成发送,以便在您的用户提交验证码后,他们不必等待响应。或者您可以将其包装在ajax中并让DRb / BJ进程在发送短信时通知您,以便您可以通知用户成功或任何问题。

通常在Ruby中打开线程是可以避免的,因为有很多伟大的宝石可以满足我们的需求。并不是说你不应该使用线程,只是在大多数情况下它可能已经做得非常好。