Как передать значение $ _POST в скрипт php из скрипта ruby - PullRequest
3 голосов
/ 18 мая 2011

Мне нужно запустить задание cron, чтобы добавить svn-репозиторий, используя reposman.rb для Redmine.Но у нас также есть скрипт php (с интерфейсом), который позволяет нам автоматически создавать репозитории.

Скрипт php получает значение $ _POST, создает репозитории, устанавливает разрешения, назначает некоторую группу для чтения и записи.к вновь созданным репозиториям.

У меня такой вопрос:

  1. как я могу выполнить скрипт php вместо команды svnadmin create в reposman.rb?
  2. Как я могу дать параметр $ _POST скрипту php, чтобы он мог правильно настроить мои репозитории svn, используя скрипт php.

Спасибо

Редактировать: Вот несколько примеров того, что делают оба скрипта.

Рубиновый скрипт:

...
// 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 ]

1 голос
/ 18 мая 2011

Если возможно изменить скрипт, он должен получать свои входные данные через файл или стандартный ввод.Если это не так, вы можете написать скрипт-обертку, который выбирает данные из файла / stdin, заполняет им $_POST (да, PHP-суперглобальные значения доступны для записи) и вызывает исходный скрипт через require.

0 голосов
/ 02 июня 2011

Поскольку комментарий @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

0 голосов
/ 18 мая 2011

Вам необходимо использовать интерфейс командной строки php здесь (php_cli).У вас нет $ _POST, но вы можете предоставить аргументы для передачи в скрипт php.Выполните системный вызов от ruby ​​для выполнения сценария php (я не знаю ruby, поэтому я публикую только часть php).В вашем php-скрипте начните с правильного шабанга:

#!/usr/bin/php
<?php

Вызов должен быть примерно таким: ./myscript.php -v = value1 -b = value2

Проверьте $ _SERVER ['argv'] для переданных значений

0 голосов
/ 18 мая 2011

Вы можете запустить скрипт из командной строки. Примерно так:


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
0 голосов
/ 18 мая 2011

Вы можете подделать POST-запрос к PHP-скрипту с помощью:
(ну, это на самом деле более "реализовать", чем "подделка")

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

Обратите внимание, что для этого требуется двоичный файл php-cgi, а не обычная версия -cli. И вам необходимо скопировать все переменных CGI . Поэтому может быть проще просто изменить существующий скрипт, чтобы он принимал параметры $ argv.

0 голосов
/ 18 мая 2011

Отправьте http-запрос вашему сценарию - $ _POST не предназначен для инициализации из командной строки.

...