如何从PHP调用Ruby脚本?

5
我正在编写一个 WordPress 插件,需要添加一些附加功能。这些功能包括从网站上爬取数据、发送表单等。在我开始考虑 WordPress 插件之前,我已经准备好了这部分内容 - 它是用 Ruby 的 Mechanize 编码的。无论如何,我还没有找到任何类似于 Mechanize 的 PHP 工具。
但我不知道从 WordPress 中调用我的 Ruby 脚本的最佳方法。有些任务将由 cron 管理。那么基于用户请求的任务呢?
以下是一些事项:
- PHP 脚本仅触发 Ruby 脚本。它不会等待或要求 Ruby 输出任何内容。 - WordPress 插件完全可移植和功能齐全,而不需要 Ruby 脚本。Ruby 只是添加了一些额外的功能,如果有人需要的话。 - 所有功能都将在我拥有 root 访问权限的 Linux 服务器上运行。

2
为什么要用Ruby编写PHP WordPress插件? - jcolebrand
1
抱歉造成困惑... WordPress插件使用PHP编写,其上方有一些基于该插件的内容,会使用Ruby进行编码。有时我需要从PHP中运行Ruby。 - Radek
3个回答

7
一个依赖于Ruby的WordPress插件不会是可移植的。如果只有你自己使用,那没关系。
如果Ruby脚本需要立即返回一个结果给调用它的PHP脚本使用,那么exec()是唯一的方式。确保转义传递给Ruby脚本的任何参数;否则,你将容易受到注入攻击。
如果Ruby脚本不需要立即返回结果(例如某些后台处理,例如缩略图生成),那么我认为最好的方法是让PHP脚本插入一行到MySQL数据库或类似的东西中。Ruby脚本可以在后台工作或从cron运行,定期检查新任务的数据库并进行必要的处理。这种方法避免了exec()的性能开销和安全问题,而且也更具可扩展性。(类似的方法是使Ruby脚本侦听Socket,然后你的PHP脚本连接到Socket,但这需要更多的工作来实现正确性。)

我喜欢这个数据库解决方案。(+1)我可能会选择它。如果我想要执行是即时的怎么办?编写某种基于Web的应用服务器? - Radek
1
@Radek 如果你想让执行变得即时而不使用exec(),你应该让Ruby脚本更频繁地检查数据库,比如每3-5秒钟。如果你对服务器有更多的控制权,你可以使用Resque来代替MySQL进行高效的队列处理。Resque - kijin

2
如果我是你,我会通过cron处理所有的ruby相关内容。在数据库中创建一个队列来处理用户请求,然后让脚本(使用ruby?)由cron调用,获取队列中未处理的任务并开始运行,然后从队列中删除该任务(或设置某种标志表示已完成)。这样一来,你就不需要调用exec了,除非用户在运行具有root访问权限的VPS /专用服务器上,否则在大多数情况下将受到限制。
如果必要的话,你也可以将其作为一个单独的任务,并更频繁地轮询未处理的任务。
不过,这引出了一个问题......为什么在php博客/ CMS应用程序中使用ruby???

那么每分钟或者每隔一段时间从cron运行Ruby脚本是可以的吗?这样看起来就像是从WordPress插件触发的一样? - Radek
每隔几分钟一次应该没问题...无论您选择什么间隔-请记住,每次都会向数据库发出查询,因此它将成为数据库总负载的一部分。 - prodigitalson
好的,那么还有一个问题。我应该使用WordPress数据库来处理作业队列,还是使用其他东西?也许有一些成本更低的选择。 - Radek
这要取决于用途... 如果你让人们调用某种工作,以便该 'rb' 脚本可以接管它,那么最好使用相同的数据库,因为添加工作的功能将来自 WP 接口。另一方面,如果这是完全分开的东西,则可以使用不同的数据库。此外,根据您的设置和网站统计数据,增加的数据库流量可能完全没有问题。 - prodigitalson

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接