Вызов PHP кода из rails приложения

Posted on August 26, 2007
Иногда необходимо вызвать PHP код из приложения
Не спрашивайте почему мне этого захотелос. Ответ банальный - лень :)
Итак, в lib/ проекта кидаем файл php_bridge.rb следующего содержания

module PHPBridge
  def self.send_to_php(file,req)
    require 'uri'
    req1 = []
    req.env.each do |name,value|
     req1.push("#{name}[=]#{value}")
    end
    params = URI.escape(req1.join("[|]"))
    req1 = []
    req.parameters.each do |name,value|
     req1.push("#{name}[=]#{value}")
    end
    param = URI.escape(req1.join("[|]"))
    `/usr/bin/php #{RAILS_ROOT}/wrappers/php-wrapper.php #{file} "#{params}" "#{param}"`
    end
end
А в контроллер который должен вызвать необходимо написать что-то похожее на:

class TestController < ApplicationController
    include PHPBridge
    def index
        @output = PHPBridge::send_to_php('test.php',request)
    end
end
После этого при запросе вызовется файл wrappers/php-wrapper.php в который необходимо написать следующий код:

<?
    $file = $argv[1];
    $params = $argv[2];
    $params = urldecode($params);
    $params = explode("[|]",$params);
    $params2 = array();
    foreach($params as $value)
    {
        $tt = explode('[=]',$value);
        $params2[$tt[0]] = $tt[1];
    }
    $_SERVER = $params2;

    $params = $argv[3];
    $params = urldecode($params);
    $params = explode("[|]",$params);
    $params2 = array();
    foreach($params as $value)
    {
        $tt = explode('[=]',$value);
        $params2[$tt[0]] = $tt[1];
    }

    $_GET = $params2;
    $_POST = $params2;

    require_once('php-code/' . $file);
?>
Вот и всё. Для теста я выводил переменные окружения.