Данная статья является комментарием к статье «PHP против ASP - делайте
ставки, господа!». Из-за его объема и полноты мы решили вынести этот комментарий
в отдельную статью.
Goodman, goodman@melodyland.ru
Ну привет всем.
Написал несколько проектов на 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>
<?
$bukvi = "abcdefguihuiy";
$stroka = "abcdrrrrrrrrrrrrrrr";
echo $stroka[0]; echo "<br>";
echo $bukvi[0]; echo "<br>";
Даже примитивная опечатка приводит к логической ошибке, которой в C# никогда бы
не было в принципе. Вообще, в РНР обьявление переменных отсуствует как класс,
что с моей точки зрения, большой минус.
Итак, в РНР, написав скрипт вы обязательно будете сидеть над ДЕБАГОМ, причем
делать его придется руками через вывод чего надо в промежуточных местах
алгоритма.
Порой найти ошибку очень сложно, особенно когда она появляется только при
определенных обстоятельствах, ее можно вообще не выявить до сдачи проекта. В
этом минус РНР, в этом же его плюс.
За то время, пока вы в С# будете реализовывать нужные классы, сидеть над их
документацией и реализацией, приводить типы и писать всякие интерфейсы для
коллекций, чтобы потом одним махом за 5 минут написать страницу,в РНР вы ту же
страницу 10 раз напишете. Только вот незадача: следущая такая же страница на
ASP.NET делается так же за 5 минут, а в РНР приходится затрачивать все то же
время. Нужно визуально в выводе что-то на странице изменить - в АСП.НЕТ 5 минут,
а в РНР - придется искать и править вывод echo. Придет другой программер и,
немного поразбиравшись с вашими классами, и даже не заглядывая в их устройство
сможет создать такую же страницу за 5 минут, а программист на РНР предпочтет
скорее переписать все заново, чем разбираться в вашем коде.
Надеюсь, по принципам программирования все понятно. Теперь о скорости. Здесь и
говорить нечего - РНР летает. Я юзал его через IIS5, IIS6, РНР 4.3 (Win). Почему
не через Апач? Потому что удобнее, когда дома можешь тестить и асп и РНР. Потому
что виндовый апач я так и не смог нормально запустить службой - он активно
оставлял различные ворнинги о нехватке памяти в журнале (хотя и работал). И
вообще, потому что ИИС удобнее. Так вот, РНР летает (хотя дотнет после первичной
компиляции тоже не особо тормозит). Одни и те же функции РНР выполняет от 10 до
х.з сколько % быстрее. Но вот работа с базами данных, отличных от MySQL не особо
порадовала. С MS SQL ASP.NET быстрее, причем намного. Через OLE они работают
одинаково. ODBC - РНР тормозит. А что такое MySQL? Возможно, я ошибаюсь, но ни
для какого БД-сервера я не видел столько багфиксов и статей про критические
уязвимости. Со скоростью мне тоже непонятно, не удалось, да и не было времени
протестить связки PHP+MySQL и ASP.NET+SQLServer, однако я так понимаю, что в
данном случае все очевидно, т. к. скорость никогда не была сильной стороной
Микрософта . Впрочем, слабой тоже (кто не согласен - могут потестить различные
проги под, например Redhat 8 и WinXp. Я точно уверен насчет кваки и пары-других
приложений).
MSSql - это абсолютно нормальный, выделяющийся достаточно большой стабильностью
работы и хорошими возмоностями масштабирования сервер, орриетированный на фирмы
и небольшие предприятия. Кому нужен ОЧЕНЬ серьезная СУБД- могут идти к Ораклу. А
MySQL - это скорее Stand-alone-ориентированная СУБД, как раз то что нужно для не
очень больших серверов (что отнюдь не означает, что на них не могут выполняться
серьезные приложения...). Все это плюс бесплатность MySQL и РНР, плюс скорость
работы этой связки без сомнения делают их ИДЕАЛЬНЫМИ для маленьких и средних
проектов, в которых участвуют несколько или небольшая группа (очень желательно,
чтобы сработавшихся) программистов. И для одиночек тоже. У средне-больших или
больших-гигантских проектов с РНР очень вряд ли что-то получится за деньги,
меньшие или равные, что придется выложить за лицензию Microsoft. Тем же, кому
нужны гигантские проекты, просто пойдут и закажут их у HP, IBM или Sun.
А у РНР есть еще один козырь - это система, на которой по умолчанию все должно
запускаться - *nix подобная. Во-первых, большинство из них бесплатные или стоят
меньше Win (хотя админы для них стоят дороже на 20-50% в месяц; поддержка тоже
стоит денег, причем неслабых). Во- вторых, хотя я с пеной у рта буду долго
спорить, по поводу того, что устойчивее в целом Unix ведет себя предсказуемее. В
- третьих, в нашей стране до фига непонятных людей, которые способны ради
удовольствия иметь СВОЮ систему терпеть различные тормоза, сидеть под риском,
что твою ветку закроют (это я про Linux), без конца копаться в man'ах и
говорить, когда к ним приходишь "а я не могу подключить твой зард, на нем NTFS,
приноси комп с сетевухой" (это я тоже про линукс; почему-то я свои FreeBSD'ные
партиции в конце концов смог подключить к винде). Дабы не спорить насчет
устойчивости могу сказать: в одной компании, где я работал, Wi
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);
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-файла, благодаря именно котрому можно почти
мгновенно полностью менять дизайн страницы (пишушие на РНР оценят:)
Перемещая теги <asp: ...> внутри страницы и произвольно помещая их в любое
место, можно в любой момент изменить дизайн, не прибегая к помощи программиста
вообще. В случае с РНР это практически невозм
В случае с РНР это практически невозможно
А теперь тот же код на РНР:
<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 вначале должна резко падать, потом расти и в конце концов
остановиться на определенном уровне. В случае с РНР чем больше код тем больше
дебага, поэтому скорость спустя некоторое время с первоначально большого уровня
должна начать падать, причем не удивлюсь если она будет падать пропорционально
квадрату обьема кода.
За сим откланиваюсь. Кто хочет продолжить дискуссию - пишите на
goodman@melodyland.ru
Post Scriptum: Вот и пример багов, прямо на этом сайте. Человек, который
разработаl
Опубликовал Kest
November 06 2008 15:52:28 ·
0 Комментариев ·
9158 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.