пятница, 14 ноября 2008 г.

Что лучше Ruby или PHP? Или PHP Vs Ruby on Rails

Именно этот вопрос я недавно увидел на каком-то форуме :). Хочу немного помочь в нем разобраться. Впринцыпе хороший сайт, грамотный программист сделает и там и там...
Но..В ПХП есть куча фреймворков, написанных разными людьми с разным уровнем, что выбирать или может написать свой - дело только программиста. В Руби есть замечательный фреймворк, в народе именуемый - Рельсы (Rails), который настолько облегчает разработку, настолько мощный, что скорость разработки увеличивается колосально. Его использует огромное количество програмеров, он отлично оттестирован.
Главные изюминки Ruby on Rails, это:
  1. Сам язык руби, ну уж очень удобный
  2. ActiveRecord - прослойка для работы с любыми БД
  3. MVC архитектура и жесткая привязка кода по папках - искать нужный код просто прелесть
  4. Сильно развитое тестирование (юнит тесты, функциональные, интеграциооные тесты, мок-обьекты, RSpec,...)
Напоследок скажу, человек хоть немного поработав на Ruby on Rails никогда в жизни не задаст вопрос - "А чем это же лучше чем ПХП".

Так что пробуйте товарищи программисты, пробуйте и вы ОЧЕНЬ много для себе откроете нового.

Как итог, сам задам вам вопрос: "Что удобнее, ехать из Киева в Москву велосипедом, или поездом??? Причем неважно на каком уровне вы владеете велосипедом" :)


вторник, 11 ноября 2008 г.

Работающий пример проксирующего скрипта

Реальный работающий прокси-скрипт, для примера из прошлой статьи

include $_SERVER["DOCUMENT_ROOT"]."/common/define.php";
$file=($_GET[file]);
$file = ROOT."/shared".$file;
if(isset($file)){
  $fl = fopen("log_proxy_new.txt","a");
  fwrite($fl,$file."\n");
  $type = substr($file,strlen($file)-3,3);
  if($type=="css"){
      header('Content-type: text/css');
   }else if($type==".js"){
      header('Content-type: application/javascript');
   }
   readfile($file);
}
fclose($fl);
exit;
?>

пятница, 7 ноября 2008 г.

Вынести FCKEditor выше DOCUMENT_ROOT

Для того чтобы вынести FCKEditor выше рута, пришлось немного попотеть, потому хочу облегчить задачу тем кто захочет сделать подобное. Идея вынести редактор возникла по простой причине, допустим, нас есть CMS, на которой настроена туча сайтов. Возникла мысль все общее для всех сайтов вынести наружу, и оформить в отдельном хранилище в форме ядра.

Польза вынесения редактора: вышла новая версия редактора, а старая нас не совсем устраивает (например вылезает баг), а у нас уже есть десяток сайтов на одной основе. В таком случае придется настраивать редактор 10 раз в каждом сайте - согласитесь, трудоемкая задача.

При настройке редактора(FCKEditor), нужно обязательно задать $this->BasePath в файле fckeditor_php5.php. Это путь относоительно которого должен работать редактор, он ОБЯЗАТЕЛЬНО должен быть относительно DOCUMENT_ROOT.

Как же обойти проблему??Самое оптимальное решение было найдено, привожу его вам:

В корне проекта создадим условие фильтра через modrewrite в.httaccess + проксирующий скрипт, который будет обрабатывать все пути доступа к FCKEditor и перенаправлять их куда надо. Причем конфигурационный путь будет вида: $this->BasePath = "http://".$_SERVER[SERVER_NAME].'/tools/fckeditor/' ;
Тоесть, мы не нарушаем идеологию настройки путей редактора.

Пример (работающий) проксирующего скрипта:

--------proxy.php:

";
if(isset($file)){
$file = ROOT."/tools/fckeditor/".$file;
$type = substr($file,strlen($file)-3,3);

if( $type=="php"){
include $file;
}else{
...

}

}

?>

Для того чтобы прокси-скрипт работал, необходимо чтобы все url которые идут к редактору, приходили на прокси посредством Get метода. Для этого в корне сайта положим в файлик httacces следующию дерективу для ModRewrite, который будет вырезать путь после tools/fckeditor/ и передавать в прокси-скрипт.

-----.httacces:

RewriteRule ^tools/fckeditor/(.*)$ /proxy.php?file=$1 [L]


В самом редакторе достаточно поставить "правильный" путь к нему, относительно рута.

---------fckeditor_php5.php

public function CreateFCKeditor($instanceName, $width, $height)
{
$this->InstanceName = $instanceName ;
$this->BasePath = "http://".$_SERVER[SERVER_NAME].'/tools/fckeditor/' ; <-- тут $this->Width = $width ;
$this->Height = $height ;
return $this->CreateHtml() ;
}

Особенности работы $_SERVER[HTTP_REFERER] в IE7

Столкнулся недавно с проблемкой, которая заняла пару часов мое разработки, так как отлавливалась долго. Если вы имеете сценарии на php где используете глобальную переменную среды $_SERVER[HTTP_REFERER] , то вы поимеете проблемы.

Проверено лично: данная переменная отрабатывает корректно в Мозиле, Опере и возвращает неадекватное значение в ИЕ7. Избегайте ее использование так как часто результатом будет пустая строка.

Для людей не стыкавшихся с проблемой - $_SERVER[HTTP_REFERER] - возвращает адрес страницы с которой мы пришли

понедельник, 27 октября 2008 г.

Задать статус группе радио кнопок в зависимости от перекючателя

Возникла задача сделать доступными/недоступными группу радио-кнопок в зависимости от состояния чекбокса. Мысль использовать jquery пришла сразу, красота код неоспорима (хотя можно было бы просто Джава Сриптом пройтись по элементам формы):

У нас есть checkbox с id="main_default", тогда код будет следующий:

function Select(){
   $(":radio").attr('disabled', $("#main_defalt").attr('checked'));
}

среда, 22 октября 2008 г.

Особенности работы с mysql_fetch_array в PHP

При создании метода в класе доступа к БД, часто необходимо выбрать только первую запись, при этом метод вернет хеш. Но если запрос типа - "SELECT count(*) FROM users", то тут надо вернуть просто переменную.

Решение может быть следующие:

 function select_first($sql){
          $sql.=" LIMIT 1"  ;
          $sth = $this->execute($sql);
          $num = ($sth?mysql_num_rows($sth):0);
          if ($num == 1){
             $row = mysql_fetch_array($sth);
             if(sizeof($row)==2){
                 return $row[0];
             }else{
                return $row;
             }             
          }else{
             return false; 
          }   
        }         

Ключевым будет блок:

 if(sizeof($row)==2){
                 return $row[0];
             }else{
                return $row;
             }             

Здесь мы используем свойство  mysql_fetch_array, зная что возвратится хеш+просто массив. Например если бы мы вызвали метод с таким запросом: 

$res=select_first("SELECT name FROM users WHERE id=1");

то если допустим такой юзер есть и его имя Sergey, то:

$row['name'] = "Sergey" 
$row[0] ="Sergey"

SizeOf($row) = 2 в случае возврата 1 поля. Потому мы всегда при необходимости возвратим хеш или просто переменную.

Это решение не претендует на полноту, так как класы по работе с БД сейчас довольно продвинутые (для ПХП), просто мне пришлось работать с проектом, где работа с БД реализована довольно примитивно. Но может это кому-то понадобится :)


понедельник, 13 октября 2008 г.

Бета-тестирование РНР 5.3

Компания Zend Technologies объявила о выпуске новой бета-версии популярного языка серверных сценариев для написания веб-приложений PHP 5.3 в октябре этого года. В новой версии реализована сборка мусора в памяти, поддержка пространств имен и упаковка PHP-приложений в архивы формата PHAR. Кроме того, серьезно оптимизировано быстродействие технологий PHP на платформе Windows за счет применения современных компиляторов Microsoft, а также современных компонентов других производителей для поддержки XML, операций с графикой и доступа к БД. 


Поддержка пространства имен в PHP 5.3 позволяет компоновать PHP-приложения из кода, полученного из разных источников. Этот механизм помогает сделать PHP-приложения по настоящему модульными, а также применять одновременно несколько технологических платформ, таких, как Zend PHP и PEAR (PHP Extension and Application Repository).

Новый механизм сборки мусора в памяти помогает платформе PHP 5.3 использовать память с максимальной эффективностью. Благодаря этому механизму подолгу работающие PHP-сценарии избавлены от утечек памяти. Упаковка PHP-приложений в архивы формата PHAR (PHP Archive) серьезно облегчит распространение и развертывание приложений. Концепция PHAR полностью аналогичная принципам, заложенным в давно известный формат файлов JAR (Java Application Archive), используемый для распространения Java-приложений.

Также в комплект поставки PHP 5.3 будут включены различные дополнительные компоненты, в том числе клиентская библиотека для интеграции PHP с СУБД MySQL. По заверениям разработчиков, приложения PHP 5.2 должны сохранить работоспособность в среде PHP 5.3. Также расширена поддержка интернационализации приложений – библиотека ICU (International Components for Unicode) поможет создавать полностью многоязычные приложения.

Хотя ранее версию PHP 5.3 планировалось выпустить до конца 2008 года, сейчас сроки выпуска перенесены на первый квартал 2009 г. Вместе с финальной версией PHP 5.3 будет доступна открытая платформа WSF/PHP (Web Services Framework) для полной реализации сервисно-ориентированной архитектуры SOA (Service-Oriented Architecture) в среде PHP. Компания WSO2, которая занимается разработкой и поддержкой WSF/PHP, обещает реализовать полноценные возможности для создания приложений электронной коммерции.