如何从ruby脚本将$ _POST值传递给php脚本

时间:2011-05-18 14:00:35

标签: php ruby redmine

我需要运行一个cron作业,使用reposman.rb为Redmine添加一个svn存储库。但是我们还有一个PHP脚本(带有接口),使我们能够自动创建存储库。

php脚本接收$ _POST值,创建repos,设置权限,分配一些组以便对新创建的repos进行读写访问。

我的问题是:

  1. 我怎样才能执行php脚本,而不是reposman.rb中的svnadmin create命令?
  2. 如何为PHP脚本提供$ _POST参数,这样就可以使用php脚本正确设置我的svn repos。
  3. 由于

    修改 以下是两个脚本的一些示例。

    Ruby脚本:

    ...
    // Add the repos
    system "svnadmin create #{path}"
    ...
    

    Php脚本:

    // Receive the name of the repos to add
    $dir= $_POST["dir"]; 
    // Do all the stuff with the permissions
    $cmd= "sudo /usr/local/bin/createsvnrepo $dir";
    system("$cmd", $retval);
    ...
    

6 个答案:

答案 0 :(得分:1)

如果可以更改脚本,则应该通过文件或标准输入获取其输入数据。如果不是,您可以编写一个包装脚本,从文件/ stdin中选择数据,用它填充$_POST(是的,PHP超级全局可写)并通过require调用原始脚本。

答案 1 :(得分:0)

向您的脚本发送http请求 - $ _POST不打算从命令行初始化。

答案 2 :(得分:0)

您可以使用以下方法伪造对PHP脚本的POST请求:
 (好吧,它实际上比“假”更“实施”)

exec "echo 'var=123_&data=...' | "
 " REQUEST_METHOD=POST CONTENT_TYPE=application/x-www-form-urlencoded "
 " php-cgi"

请注意,它确实需要php-cgi二进制文件,而不是正常的-cli版本。您需要复制CGI environment变量的所有。因此,仅修改现有脚本以接受$ argv参数可能更容易。

答案 3 :(得分:0)

您可以从命令行运行脚本。 像这样:


params = {'foo' => 'bar'} #etc
param_str = params.collect {|k,v| "#{CGI.escape(k)}=#{CGI.escape(v)}"}.join('&')
popen("/usr/bin/php /path/to/script.php", "w+") do |pipe|
  pipe.puts(param_str)
  pipe.close_write
  res = pipe.read
end

答案 4 :(得分:0)

你需要在这里使用php命令行界面(php_cli)。你没有$ _POST,但你可以提供传递给php脚本的参数。从ruby执行系统调用以执行php脚本(我dunno ruby​​所以我只发布了php部分)。在你的php脚本中,从正确的shabang开始:

#!/usr/bin/php
<?php

电话应该是这样的: ./myscript.php -v = value1 -b = value2

检查$ _SERVER ['argv']是否传递了值

答案 5 :(得分:0)

因为@Richard Knop的评论比任何答案都更有帮助,我会回答我自己的问题来帮助别人。

我使用curb向php脚本发送帖子。

reposman.rb

...
# Added at start of file.
require 'rubygems'
require 'curb'
...

# Replace the creation of repos from 
module SCM
    module Subversion
        def self.create(path)
            system_or_raise "svnadmin create #{path}"
        end
    end
    ...
end

# to 
module SCM
    module Subversion
        def self.create(path)
            Curl::Easy.http_post(
                "http://example.com/customCreaterepos.php", # Url to the php script
                Curl::PostField.content('reposName', path)) # Index of php $_POST in script
        end
    end
    ...
end