从PHP

时间:2018-05-31 14:54:39

标签: php ruby erubis

我使用system('ruby show.rb filename')从PHP调用Ruby脚本。

show.rb看起来像这样:

require 'erubis'
f = ARGV[0]
puts f
input = File.read(f)
eruby = Erubis::Eruby.new(input)
puts eruby.result(binding())

在控制台中执行命令ruby show.rb filename时,所有内容都会打印出来,但是当从PHP调用它时,它只打印文件名,但不会呈现模板。为了看错误我用管道输入stderr - > PHP调用中的stdout,我得到了这个

/Library/Ruby/Gems/2.3.0/gems/erubis-2.7.0/lib/erubis/converter.rb:132:in 'scan': invalid byte sequence in US-ASCII (ArgumentError) from /Library/Ruby/Gems/2.3.0/gems/erubis-2.7.0/lib/erubis/converter.rb:132:in 'convert_input' from /Library/Ruby/Gems/2.3.0/gems/erubis-2.7.0/lib/erubis/converter.rb:36:in 'convert' from /Library/Ruby/Gems/2.3.0/gems/erubis-2.7.0/lib/erubis/engine.rb:30:in 'initialize' from show.rb:5:in 'new' from show.rb:5:in temp/Newsletter.rb'

我是Ruby的新手。是否有任何选项参数可以解决这个问题?什么是PHP在那里做的不同,错误可能发生?

1 个答案:

答案 0 :(得分:0)

我不知道为什么,但是当在PHP调用的show.rb中打开一个erubis模板文件时,它必须作为二进制文件打开。所以我只需要将show.rb改为:

require 'erubis'
f = ARGV[0]
handle = File.open(f, "rb") # "rb" fixed the issue.
input = handle.read()
handle.close()
eruby = Erubis::Eruby.new(input)
puts eruby.result(binding())