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 блога:
Так что те, кто ещё не присоединился,
* * 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}` %>
За sape on rails огромное спасибо - у меня блог на Ruby on Rail ( Mephisto + Dreamhost.com ) крутится :-) надо потестировать …
А в чем может быть проблема если по описанному методу я получаю следующее сообщение:
Это приложение не typo, но все сделан точно как описано.
хотелось бы узнать побольше деталей, а именно - какая версия ruby (ruby -v), используемая операционная система, используемая конфигурация http-сервера (apache+lighttpd, Mongrel, etc…).
Также интересно посмотреть на файл config/environment.rb
Приложение работает на виртуальном хостинге или stand alone server?
environment выглядит следующим образом:
Приложение работает на виртуальном хостинге от dreamhost. Связанных с этим проблем не было. Версия руби: ruby 1.8.5 (2006-08-25) [i386-linux]. Сервак, думаю, стандартный apache. Версия Rails 1.2.3.
spacer, когда я апгрейдил php до версии 5.1 наблюдал нечто похожее. Помогла перезагрузка httpd. Кроме этого пришлось несколько модифицировать rails и php скрипты. Подробности в это посте, внизу, в подразделе UPDATE
Думаю проблема у меня всетаки не в этом. PHP у меня 4.4.7, а проблема вообще с любым пхпшным кодом, даже если просто echo.
Spacer, на 100% ничего не обещаю (всё-таки в dreamhost могут существовать какие-то ограничения), но могу предложить помочь разобраться.
Для моего стимула :) я Вас попрошу присоединится к партнерской программе по этой ссылке Если согласны, пишите мне на e-mail (cooper AT zmail.ru) после присоединения.
Видел на ror.ru что-то про php on trax (framework для php - аналог ror).
А как именно отличается интеграция php-sape’а в разных версиях?