PHP против ASP - В примерах, господа!
Автор: webmastak.com
Привет всем!
Написал несколько проектов на PHP. К сожалению ни один не
дожил до сегодняшнего дня. Был проект Melodyland, написанный на ASP,
www.melodyland.ru , я частично переписал его на ASP.NET (C#) . Сейчас пишу
свой сайт на ASP.NET www.melodyland.ru/goodman (потом переедет, сейчас
только можно посмотреть фотки, там идет выборка по базе данных). Все
работает на связке Win2000+IIS+MS SQLserver2000. Машинка - 500 целерон,
128 памяти, ну да ладно, все равно не моя. Оба АСП на ней
летали при загрузке 30-50 пользователей на сайте (АСП.НЕТ летал после
первичной компиляции).
Ощущения. РНР-скрипт запросто можно написать болкнотом,
открывая книжку. ASP.NET без Studio и MSDN (а также в особо тяжелых
случаях - Инета) бесполезен (видимо, поэтому и компилятор бесплатен...
хех). Большая часть работы в Студио заключается в том, что ты все время
учишься использовать жутко навороченную классовую модель и при этом
лазишь, лазишь и еще раз лазишь по МСДН. Можно сказать, что треть времени
разработчик сидит в МСДНне.
Зато потом... счетчик посещений? - пожалуйста, 5 строчек.
Добавить сюда такую же таблицу? Пожалуста, два щелчка мышкой, 10
строчек. Другой вывод? Пожалуста! Нестим класс, перекрываем процедуру,
отлаживаем 5 минут, готово, привязываем к выводу второй таблицы, смотрим.
Абстрактно ощущения от работы с .NET - что-то среднее между Delphi и C++, все время ищещь компоненты, но, при этом головой тоже
работать приходится, писать самому. Причем держать схему проекта в голове
надо постоянно. Потому что если что забудешь- работа, с того момента, как
забыл, становится бессмысленной и приходится возвращаться к "контрольной"
точке. Сламое главное в .NET - это стадия плаирования, как общего, так и
частного. Без нее все рухнет. Именно поэтому .NET плохо подходит одиноким
программистам или маленьким группам (маньяки типа меня, свято верящие в
светлое будущее M$, не считаются).
Территория .NET - это гигантские, бытро
и постоянно расширяющиеся инет-проекты, где один программист в лучшем
случае отвечает за один модуль. Ну скажите где еще вы найдете, чтобы в
проекте люди писали на разных языках? Только в проектах, которые могут
позволить себе нанять профи, пишущего на языке, отличном от проектного
основного. Производительность? Не хватает ресурсов? Купим еще компьютеров,
лишь бы темпы не падали. Вот в таких проектов РНР-программистам точно
труба дело. Почему: потому что им потребуется куча координаторов, которым
денег платить нада. Координаторов, большую часть работы которых берет на
себя .NET
И, кстати, большинству unix-систем там тоже делать нечего
(не надо плеваться! Stand-alone - это прекрасно, но все знают, что сделать
кластер на юнихе намного сложнее, и соответственно, денег уйдет больше. Я
НЕ говорю о гигантских суперкомпьютерах, я говорю о парке в 20-50 машин),
потому что за то время, пока сисадмины на FreeBSD подключат к
кластер-серверу дополнительные машины, програмисты на Win уже давно будут
писать следующий модуль. Автоматизация взаимодействия между машинами на
WinServ2003 - одна из сильнейших сторон этой системы.
Теперь PHP. Если коротко охарактеризовать ощущения от
работы с ним - это постоянный дебаг. И дело даже не в том, что нормальная
IDE наконец-то выпустили совсем недавно (zend.com),
дело в том, что сам язык так устроен, что в нем очень
легко допускать серьезные логические ошибки. Вот пример, который недавно
прислала мне однокурсница, попросив помочь:
<p>
<?php
$bukvi = "abcdefguihuiy";
$stroka =
"abcdrrrrrrrrrrrrrrr";
echo $stroka[0]; echo
"<br>";
echo $bukvi[0]; echo
"<br>";
if ( $srtoka[0] ==
$bukvi[0] )
echo "совпадают";
else
echo "не совпадают";
?>
</p>
Сценарий работает, но работает неправильно.
Даже примитивная опечатка приводит к логической ошибке,
которой в C# никогда бы не было в принципе. Вообще, в РНР обьявление
переменных отсуствует как класс, что с моей точки зрения, большой минус.
Итак, в РНР, написав скрипт вы обязательно будете сидеть
над ДЕБАГОМ, причем делать его придется руками через вывод чего надо в
промежуточных местах алгоритма.
Порой найти ошибку очень сложно, особенно когда она
появляется только при определенных обстоятельствах, ее можно вообще не
выявить до сдачи проекта. В этом минус РНР, в этом же его плюс.
За то время, пока вы в С# будете реализовывать нужные
классы, сидеть над их документацией и реализацией, приводить типы и писать
всякие интерфейсы для коллекций, чтобы потом одним махом за 5 минут
написать страницу, в РНР вы ту же страницу 10 раз напишете. Только вот
незадача: следущая такая же страница на ASP.NET делается так же за 5
минут, а в РНР приходится затрачивать все то же время. Нужно визуально в
выводе что-то на странице изменить - в АСП.НЕТ 5 минут, а в РНР - придется
искать и править вывод echo. Придет другой программер и, немного
поразбиравшись с вашими классами, и даже не заглядывая в их устройство
сможет создать такую же страницу за 5 минут, а программист на РНР
предпочтет скорее переписать все заново, чем разбираться в вашем коде.
Надеюсь, по принципам программирования все понятно.
Теперь о скорости. Здесь и говорить нечего - РНР летает. Я юзал его через
IIS5, IIS6, РНР 4.3 (Win). Почему не через Apache? Потому что удобнее, когда
дома можешь тестить и ASP и РНР. Потому что виндовый Apache я так и не смог
нормально запустить службой - он активно оставлял различные ворнинги о
нехватке памяти в журнале (хотя и работал). И вообще, потому что IIS
удобнее. Так вот, РНР летает (хотя дотнет после первичной компиляции тоже
не особо тормозит). Одни и те же функции РНР выполняет от 10 до х.з
сколько % быстрее.
Но вот работа с базами данных, отличных от MySQL не
особо порадовала. С MS SQL ASP.NET быстрее, причем намного. Через OLE они
работают одинаково. ODBC - РНР тормозит. А что такое MySQL? Возможно, я
ошибаюсь, но ни для какого БД-сервера я не видел столько багфиксов и
статей про критические уязвимости. Со скоростью мне тоже непонятно, не
удалось, да и не было времени протестить связки PHP+MySQL и
ASP.NET+SQLServer, однако я так понимаю, что в данном случае все очевидно,
т. к. скорость никогда не была сильной стороной Microsoft-a . Впрочем,
слабой тоже (кто не согласен - могут потестить различные проги под,
например Redhat 8 и WinXp. Я точно уверен насчет кваки и пары-других
приложений).
Microsoft SQL - это абсолютно нормальный, выделяющийся достаточно
большой стабильностью работы и хорошими возмоностями масштабирования
сервер, орриетированный на фирмы и небольшие предприятия. Кому нужен ОЧЕНЬ
серьезная СУБД- могут идти к Oracle. А MySQL - это скорее
Stand-alone-ориентированная СУБД, как раз то что нужно для не очень
больших серверов (что отнюдь не означает, что на них не могут выполняться
серьезные приложения...). Все это плюс бесплатность MySQL и РНР, плюс
скорость работы этой связки без сомнения делают их ИДЕАЛЬНЫМИ для
маленьких и средних проектов, в которых участвуют несколько или небольшая
группа (очень желательно, чтобы сработавшихся) программистов. И для
одиночек тоже. У средне-больших или больших-гигантских проектов с РНР
очень вряд ли что-то получится за деньги, меньшие или равные, что придется
выложить за лицензию Microsoft. Тем же, кому нужны гигантские проекты,
просто пойдут и закажут их у HP, IBM или Sun.
А у РНР есть еще один козырь - это система, на которой по
умолчанию все должно запускаться - *nix подобная. Во-первых, большинство
из них бесплатные или стоят меньше Win (хотя админы для них стоят дороже
на 20-50% в месяц; поддержка тоже стоит денег, причем неслабых). Во-вторых, хотя я с пеной у рта буду долго спорить, по поводу того, что
устойчивее в целом Unix ведет себя предсказуемее. В - третьих, в нашей
стране до фига непонятных людей, которые способны ради удовольствия иметь
СВОЮ систему, терпеть различные тормоза, сидеть под риском, что твою ветку
закроют (это я про Linux), без конца копаться в man'ах и говорить, когда к
ним приходишь "а я не могу подключить твой зард, на нем NTFS, приноси комп
с сетевухой" (это я тоже про линукс; почему-то я свои FreeBSD'ные партиции
в конце концов смог подключить к винде). Дабы не спорить насчет
устойчивости могу сказать: в одной компании, где я работал, Win2000, державшая на IIS 250 динамических (ASP)
веб-сайтов за три года упала всего раз, и то на пару часов, потребовалась
лишь переустановка самого IIS. В другой сервер на FreeBSD стабильно падал
пару раз в месяц, причем пару раз насмерть, поэтому я абсолютно уверен,
что стабильность системы зависит вовсе не от типа ОС, а от наличия или
отсутствия кривых рук у сисадмина.
Таким образом, еще раз повторяю, что ASP.NET (и вообще
вся .NET) - система для больших проектов (а каким еще нужно быть ПО
УМОЛЧАНИЮ кроссплатформенными?).
Написав программу на C# ее будет очень легко портировать
на Pocket PC, с небольшими изменениями перенести прямо в Web; для того,
чтобы запустить ее на Linux, вообще уже ничего не нужно кроме Mono
(www.mono-project.com).
Напоследок могу посоветоваь: зайдите на job.ru и
посмотрите на ситуацию с вакансиями. На одну ASP, ASP.NET вакансию
приходится 10-15 РНР - вакансий. Только вот ASP.NET-программеру сходу
предлагают зарплату как минимум в 2 раза больше, чем РНР.
Как и должно быть. Гемморой стоит денег.
На прощание предлагаю вам 2 варианта одной и той же
программы, написанной на ASP.NET и PHP. Обе они написаны "в лоб"
(специально :) и решают одну и ту же задачу: вывод колчиества букв во
введенной строке.
ASP.NET:
using System;
using System.Collections;
using
System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using
System.Web.SessionState;
using System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.HtmlControls;
namespace photos
{
/// <summary>
/// Summary description for
WebForm6.
/// </summary>
public class WebForm6 :
System.Web.UI.Page
{
protected
System.Web.UI.WebControls.TextBox TextBox1;
protected
System.Web.UI.WebControls.Button Button1;
protected
System.Web.UI.WebControls.Label Label1;
private void
Page_Load(object sender, System.EventArgs e)
{
// Put user code to
initialize the page here
}
#region Web Form Designer
generated code
override protected void
OnInit(EventArgs e)
{
//
// CODEGEN: This call is
required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// Required method for
Designer support - do not modify
/// the contents of this
method with the code editor.
/// </summary>
private void
InitializeComponent()
{
this.TextBox1.TextChanged
+= new System.EventHandler(this.TextBox1_TextChanged);
this.Button1.Click += new
System.EventHandler(this.Button1_Click);
this.Load += new
System.EventHandler(this.Page_Load);
}
#endregion
private void
TextBox1_TextChanged(object sender, System.EventArgs e)
{
}
private void
Button1_Click(object sender, System.EventArgs e)
{
string alphabyte=
"ABCDEFGHIJKLMNOPQRSTUVWXYZЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ";
int[] count =new
int[alphabyte.Length];//Массив-счетчик
string
Text=TextBox1.Text;//Забираем данные
Text=Text.ToUpper();//Введенный текст к верхнему регистру
foreach (char t in
Text)//Идем по строке как по массиву
{
for (int i=0;
i<alphabyte.Length;i++)//Идем по массиву-счетчику
{
if
(t==((char)alphabyte[i])) count[i]++;
}
}
//Вывод
for(int i=0;
i<count.Length;i++)
{
if (count[i]!=0)
{
Response.Write("Буква
"+alphabyte[i]+" встречается "+
Convert.ToString(count[i])+" раз <BR>");
}
}
}
}
}
Это только файл с программой; к счастью, большая его
часть сгенерирована Visual Studio и собственно моя программа находится в
обработчике Button1_Click
К нему прилагается еще шаблон HTML-файла, благодаря
именно котрому можно почти мгновенно полностью менять дизайн страницы
(пишушие на РНР оценят:)
Шаблон (вообще другой
файл):
<%@ Page language="c#"
Codebehind="WebForm6.aspx.cs"
AutoEventWireup="false"
Inherits="photos.WebForm6" %>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<meta
name="vs_snapToGrid" content="False">
<title>WebForm6</title>
<meta name="GENERATOR"
Content="Microsoft Visual Studio .NET 7.1">
<meta
name="CODE_LANGUAGE" Content="C#">
<meta
name="vs_defaultClientScript" content="JavaScript">
<meta
name="vs_targetSchema"
content="http://schemas.microsoft.com/intellisense/ie5">
</HEAD>
<body
MS_POSITIONING="GridLayout">
<form id="Form1"
method="post" runat="server">
<asp:TextBox
id="TextBox1" style="Z-INDEX: 101; LEFT: 328px;
POSITION: absolute; TOP:
40px" runat="server"
Width="288px"></asp:TextBox>
<asp:Label id="Label1"
style="Z-INDEX: 102; LEFT: 216px;
POSITION: absolute; TOP:
40px" runat="server"
Width="120px"
Height="24px">Введите слово</asp:Label>
<asp:Button id="Button1"
style="Z-INDEX: 103; LEFT: 632px;
POSITION: absolute; TOP:
40px" runat="server"
Width="128px"
Text="Посчитать!"></asp:Button>
</form>
</body>
</HTML>
Перемещая теги внутри страницы и произвольно помещая
их в любое место, можно в любой момент изменить дизайн, не прибегая к
помощи программиста вообще.
В случае с РНР это практически невозможно
А теперь тот же код на РНР:
<form
action="test_update1.php" method="POST">
Введите слово
<input type="text"
name="str">
<input type="submit"
name="submit" value="Посчитать">
<?php
$quiz_string=$_POST['str'];
if ($_POST['str'])
{
//$alphabyte='QWERTYUIOPASDFGHJKLZXCVBNMЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁ';
$quiz_string=
strtoupper($quiz_string);
for ($i=0;
$i<strlen(quiz_string);$i++)
{
for ($j=0;
$j<strlen($quiz_string);$j++)
{
if
($quiz_string[$j]==$quiz_string[$i]) {$result[$j]+=1;}
}
}
echo '<br>';
for ($j=0;
$j<strlen($quiz_string);$j++)
{
if (strlen($result[$j])!=0)
echo "Буква
$quiz_string[$j] встречается $result[$j] раз<BR>";
//echo $quiz_string;
}
}
?>
</form>
И Все.
Мой общий вывод, не претендующий на обьективность:
скорость разработки при применении ASP.NET вначале должна резко падать,
потом расти и в конце концов остановиться на определенном уровне. В случае
с РНР чем больше код тем больше дебага, поэтому скорость спустя некоторое
время с первоначально большого уровня должна начать падать, причем не
удивлюсь если она будет падать пропорционально квадрату обьема кода.
За сим откланиваюсь.