Autofaucets.ru - автоматический сборщик криптовалюты с кранов!

SAPE ON RAILS. Интеграция PHP-кода SAPE.RU в Ruby on Rails приложение.

Posted by Cooper Mon, 23 Apr 2007 12:52:00 GMT

Наверняка уже многие счастливые обладатели сайтов, разработанных на php или html, установили и с удовольствием пользуются системой купли-продажи ссылок sape.ru. Поскольку мой блог использует Typo движок, написанный на Ruby on Rails, то конкретных инструкций по размещению sape-кода мне найти не удалось ни на форуме sape.ru, ни в Интернет. Поэтому пришлось провести небольшое исследование по способам интеграции Rails и PHP и затем реализовать на основе собранного материала Typo sidebar plug-in.

Первое, что я сделал, это вынес php-код для отображения ссылок, в отдельный файл с именем sape1.php. Этот файл был сохранен в директории /var/www/websites/mysite/public

Как показали первые эксперименты с sape, большая часть проблем с отображением ссылок продавцов была связана с тем, что невозможно определить внутри php-скрипта текущую страницу сайта или доменное имя. Поэтому далее в этом скрипте явно были прописаны параметры, в обычных условиях получаемые из контекста web-сервера: ‘request_uri’, ’host’. А также изменён параметр ’charset’ на UTF-8 в соответствии с используемой кодировкой страниц моего сайта. Значение ‘request_uri’ дополнительно преобразовывалось функцией urlencode() для корректной интерпретации символов кириллицы в URL.


<?php
    define('_SAPE_USER', '999999999999999999999999999999999');
    require_once('/var/www/websites/mysite/'._SAPE_USER.'/sape.php');
    $o['request_uri'] = $_GET['uri'];
    $o['request_uri'] = str_replace('%2F', '/', urlencode($o['request_uri']) );
    $o['host']    = 'cooper.ezlibrary.com';
    $o['charset'] = 'UTF-8';
    $sape = new SAPE_client($o);
    unset($o);
    echo $sape->return_links();
?> 

После изменений в php-коде остается создать Sape sidebar plugin , где основная концепция реализована в файле content.rhtml:

<% command = '/usr/local/bin/php -q /var/www/websites/mysite/public/sape1.php uri=' + request.env["REQUEST_URI"].to_s %>
<%= `#{command}` %>

Через административный интерфейс добавляем новый plug-in на sidebar. С появлением новых запросов на размещение в sape.ru:

… они появляются в sidebar области Typo блога:

Так что те, кто ещё не присоединился, могут попробовать в действии систему купли-продажи ссылок Sape.ru теперь и на Ruby On Rails сайтах.

* * UPDATE * *

описанная выше методика была протестирована на системе RedHat EL3 c PHP 4.3.2 Позже возникла необходимость перейти на PHP 5.1 и оказалось, что подход к интеграции php-sape клиента в этом случае немного отличается.

При запуске php-скрипта public/sape1.php из typo-окружения элемент массива $_GET[‘uri’] не инициализируется значением, в результате ссылки на странице не видны. Для исправления ситуации вместо $_GET[‘uri’] нужно использовать $argv[1], также uri имеет уже закодированный вид, так что убираем строку с функцией urlencode():


<?php
    define('_SAPE_USER', '999999999999999999999999999999999');
    require_once('/var/www/websites/mysite/'._SAPE_USER.'/sape.php');
    // replace $_GET[‘uri’] with $argv[1]
    $o['request_uri'] = $argv[1];
    // remove uri encoding
    $o['host']    = 'cooper.ezlibrary.com';
    $o['charset'] = 'UTF-8';
    $sape = new SAPE_client($o);
    unset($o);
    echo $sape->return_links();
?> 

А в typo-плагине откорректировать файл views/content.rhtml опустив название параметра uri и убрав ключ -q:


<% command = '/usr/local/bin/php /var/www/websites/mysite/public/sape1.php ' + request.env["REQUEST_URI"].to_s %>
<%= `#{command}` %>

Posted in , , ,  | Tags , , , , ,  | 9 comments

Comments

  1. Avatar RedRoot said about 1 month later:

    За sape on rails огромное спасибо - у меня блог на Ruby on Rail ( Mephisto + Dreamhost.com ) крутится :-) надо потестировать …

  2. Avatar spacer said 3 months later:

    А в чем может быть проблема если по описанному методу я получаю следующее сообщение:

    X-Powered-By: PHP/4.4.7 Content-type: text/html
    require File.dirname(__FILE__) +
    "/../config/environment" unless defined?(RAILS_ROOT)
    # If you're using RubyGems and mod_ruby, 
    this require should be changed 
    to an absolute path one, like:
    # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher"
     -- otherwise performance is severely impaired require 
    "dispatcher" ADDITIONAL_LOAD_PATHS.reverse.each { 
    |dir| $:.unshift(dir) if File.directory?(dir) } if 
    defined?(Apache::RubyRun) Dispatcher.dispatch
    

    Это приложение не typo, но все сделан точно как описано.

  3. Avatar cooper said 3 months later:

    хотелось бы узнать побольше деталей, а именно - какая версия ruby (ruby -v), используемая операционная система, используемая конфигурация http-сервера (apache+lighttpd, Mongrel, etc…).

    Также интересно посмотреть на файл config/environment.rb

    Приложение работает на виртуальном хостинге или stand alone server?

  4. Avatar spacer said 3 months later:

    environment выглядит следующим образом:

    # Be sure to restart your web server when you modify this file.
    
    # Uncomment below to force Rails into production mode when 
    # you don't control web/app server and can't set it the proper way
    ENV['RAILS_ENV'] ||= 'production'
    ENV['RAILS_ROOT'] ||= '/home/spacer/ebookspirate.com'
    
    # Specifies gem version of Rails to use when vendor/rails is not present
    #RAILS_GEM_VERSION = '1.1.2'
    
    # Bootstrap the Rails environment, frameworks, and default configuration
    require File.join(File.dirname(__FILE__), 'boot')
    
    Rails::Initializer.run do |config|
      # Settings in config/environments/* take precedence those specified here
    
      # Skip frameworks you're not going to use
      # config.frameworks -= [ :action_web_service, :action_mailer ]
    
      # Add additional load paths for your own custom dirs
      # config.load_paths += %W( #{RAILS_ROOT}/extras )
    
      # Force all environments to use the same logger level 
      # (by default production uses :info, the others :debug)
      # config.log_level = :debug
    
      # Use the database for sessions instead of the file system
      # (create the session table with 'rake db:sessions:create')
      # config.action_controller.session_store = :active_record_store
    
      # Use SQL instead of Active Record's schema dumper when creating the test database.
      # This is necessary if your schema can't be completely dumped by the schema dumper, 
      # like if you have constraints or database-specific column types
      # config.active_record.schema_format = :sql
    
      # Activate observers that should always be running
      # config.active_record.observers = :cacher, :garbage_collector
    
      # Make Active Record use UTC-base instead of local time
      # config.active_record.default_timezone = :utc
    
      # See Rails::Configuration for more options
    end
    
    # Add new inflection rules using the following format 
    # (all these examples are active by default):
    # Inflector.inflections do |inflect|
    #   inflect.plural /^(ox)$/i, '\1en'
    #   inflect.singular /^(ox)en/i, '\1'
    #   inflect.irregular 'person', 'people'
    #   inflect.uncountable %w( fish sheep )
    # end
    

    Приложение работает на виртуальном хостинге от dreamhost. Связанных с этим проблем не было. Версия руби: ruby 1.8.5 (2006-08-25) [i386-linux]. Сервак, думаю, стандартный apache. Версия Rails 1.2.3.

  5. Avatar cooper said 3 months later:

    spacer, когда я апгрейдил php до версии 5.1 наблюдал нечто похожее. Помогла перезагрузка httpd. Кроме этого пришлось несколько модифицировать rails и php скрипты. Подробности в это посте, внизу, в подразделе UPDATE

  6. Avatar spacer said 3 months later:

    Думаю проблема у меня всетаки не в этом. PHP у меня 4.4.7, а проблема вообще с любым пхпшным кодом, даже если просто echo.

  7. Avatar cooper said 4 months later:

    Spacer, на 100% ничего не обещаю (всё-таки в dreamhost могут существовать какие-то ограничения), но могу предложить помочь разобраться.
    Для моего стимула :) я Вас попрошу присоединится к партнерской программе по этой ссылке Если согласны, пишите мне на e-mail (cooper AT zmail.ru) после присоединения.

  8. Avatar Seeder said 6 months later:

    Видел на ror.ru что-то про php on trax (framework для php - аналог ror).

  9. Avatar linux geek said over 3 years later:

    А как именно отличается интеграция php-sape’а в разных версиях?

(leave url/email »)

   Comment Markup Help Preview comment