Re[3]: Медленнее? Ну чтоже вы, как
От: Cyberax Марс  
Дата: 17.10.06 14:57
Оценка:
Sheridan wrote:
> C>А как сам язык — PHP намного медленнее C# или Java, тут даже спорить
> глупо.
> Ну запусти на такойже машине с такойже нагрузкой на ИИС подобные выборки
> и покажи результат.
> Кстати версии апача пхп и файрберда у меня из последних. Так что прошу
> также использовать в тестовом забеге последние версии асп, иис и БД на
> выбор.
Давай конкретные SQLи и скрипты.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[5]: PHP умирает
От: Sinclair Россия https://github.com/evilguest/
Дата: 17.10.06 17:59
Оценка: +1
Здравствуйте, Cyberax, Вы писали:
C>Есть такое. Еще оно вообще не любит работать с небольшим объемом памяти.
И ровно по тем же причинам. Ну не предназначены Java/Net GC для работы через своп.
C>Ну да, Java для очень-бюджетного-хостинга подходит плохо. Но сейчас
C>виртуальные серверы очень дешевы.
Виртуальный сервер — это оксюморон. В том смысле, что он работает ничуть не лучше шаред хостинга на той же железке.
Вся фишка виртуального сервера — в том, что он предоставляет на всех столько памяти, сколько есть RAM+Swap. Это работает в предположении, что не всем VE память потребуется одновременно. Для JVM/Net ситуация как раз в том, что они могут отожрать ровно все ресурсы. Тогда реальная производительность виртуального сервера упадет ниже плинтуса.
А это означает, что денсити виртуальных джава-хостингов будет ниже, чем у PHP.
А стоимость подсчитывается грубо говоря именно как стоимость дедикейтед поделить на денсити. Я доступно излагаю?
Мы сейчас думаем над тем, как обеспечить повышение производительности ASP.NET на виртуальном хостинге.

C>Да это я шучу так. Если исключительно PHP-программисты, то ни на что

C>кроме VB их лучше не выпускать — уровень обычно у них ниже плинтуса.
А-а
На самом деле это проблема. Парадоксальная причем: с одной стороны, хорошей замены PHP на рынке не видно. С другой стороны, квалифицированные кадры предпочитают из PHP уходить.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[6]: PHP умирает
От: Cyberax Марс  
Дата: 17.10.06 18:27
Оценка:
Sinclair wrote:
> C>Ну да, Java для очень-бюджетного-хостинга подходит плохо. Но сейчас
> C>виртуальные серверы очень дешевы.
> Виртуальный сервер — это оксюморон. В том смысле, что он работает ничуть
> не лучше шаред хостинга на той же железке.
> Вся фишка виртуального сервера — в том, что он предоставляет на всех
> столько памяти, сколько есть RAM+Swap. Это работает в предположении, что
> не всем VE память потребуется /одновременно/.
Виртуальные серверы бывают разные. Например, на нашем хостинге
гарантируется наличие 256Мб памяти и 400Mhz процессора.
Естественно, это стоит несколько дороже, но неточтобы запредельно дорого.

> Для JVM/Net ситуация как

> раз в том, что они могут отожрать ровно все ресурсы. Тогда реальная
> производительность виртуального сервера упадет ниже плинтуса.
Ну так есть же квоты. И они везде стоят.

> А стоимость подсчитывается грубо говоря именно как стоимость дедикейтед

> поделить на денсити. Я доступно излагаю?
Ну естественно, никто с этим вроде не спорит.

> C>Да это я шучу так. Если исключительно PHP-программисты, то ни на что

> C>кроме VB их лучше не выпускать — уровень обычно у них ниже плинтуса.
> А-а
> На самом деле это проблема. Парадоксальная причем: с одной стороны,
> хорошей замены PHP на рынке не видно. С другой стороны,
> квалифицированные кадры предпочитают из PHP уходить.
Ну есть еще Ruby с RoR, он хотя и требует больше ресурсов, но не слишком
сильно больше. Ну и он покрасивее PHP все же будет.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[11]: PHP5 vs ASP.NET
От: WolfHound  
Дата: 17.10.06 18:41
Оценка:
Здравствуйте, Horror_Infinity, Вы писали:

H_I>А вот когда оно же работало на ASP — вот это было нечто! При числе коннектов 15-20 машина была практически в дауне. Загрузка процессоров под 100%, делать ничего невозможно.

ASP или ASP.NET? Это всеже разные вещи. Если ASP.NET то ты точно чтото не так делал. На RSDN нагрузка на порядки больше и ASP.NET близко не узкое место.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: Медленнее? Ну чтоже вы, как
От: Sheridan Россия  
Дата: 17.10.06 19:18
Оценка: -1 :)
Здравствуйте, Cyberax, Вы писали:

C>Ну а ближе к практике — где мне для PHP взять аналог Hibernate? А что у

C>нас там с транзакциями? Руками расставлять begin-end я не собираюсь. А
C>как насчет компонентной модели страниц?

Компонентная модель?
Не пожалею даже код.

<?php
if (!defined("FORNBUILDER.INC"))
{
define("FORNBUILDER.INC",0);
//---------------------------------------------
//
// Copyrights by Gorlow Maksim [Sheridan] 2005
//
//---------------------------------------------

class CFormBuilder
{
    private $hiddens;
    private $frames;
    private $current_frame;

    function __construct()
    {
        $this->clean();
    }

    public function clean()
    {
        $this->hiddens = array();
        $this->frames = array();
        $this->current_frame = null;
        $this->commit_frame();
    }
    //--------------------------------------------------------------------------------------------------------------
    private function get_date_select($name_prefix,$m_day="",$m_month="",$m_year="")
    {
        echo '<table width="100%"><tr>';
        $this->get_date_select_option(1,31,$name_prefix . "day",2, $m_day);
        $this->get_date_select_option(1,12,$name_prefix . "month",2, $m_month);
        $this->get_date_select_option(2000,2100,$name_prefix . "year",4, $m_year);
        echo '</tr></table>';
    }

    private function get_date_select_option($from, $to, $name, $numbers, $default)
    {
        echo "<td><select name='{$name}'>";
        for ($i = $from; $i<=$to; $i++)
        {
            $num = sprintf("%0".$numbers."d", $i);
            if($num != $default) {
                echo "<option value='{$num}'>{$num}</option>"; }
            else {
                echo "<option selected value='{$num}'>{$num}</option>"; }
        }
        echo "</select></td>";
    }
    //--------------------------------------------------------------------------------------------------------------
    private function get_db_select($name, $table, $caption_field, $id_field, $null_id, $condition, $default_id, $caption_prefix)
    {
        global $st;
        if($condition != '') {
        $condition = "WHERE {$condition}"; }
        $db_data = $st->db()->query("SELECT {$id_field} as ID_DBS_FLD, {$caption_field} as CPT_DBS_FLD FROM {$table} {$condition} ORDER BY {$caption_field}");
        echo "<select name='{$name}'>";
        if($null_id != $default_id) {
                echo "<option value='{$null_id}'>---</option>"; }
            else {
                echo "<option selected value='{$null_id}'>---</option>"; }
        while($row = $st->db()->fetch_assoc($db_data))
        {
            if($row['ID_DBS_FLD'] != $default_id) {
                echo "<option value='{$row['ID_DBS_FLD']}'>{$caption_prefix}{$row['CPT_DBS_FLD']}</option>"; }
            else {
                echo "<option selected value='{$row['ID_DBS_FLD']}'>{$caption_prefix}{$row['CPT_DBS_FLD']}</option>"; }
        }
        $st->db()->close_query($db_data);
        echo "</select>";
    }
    //--------------------------------------------------------------------------------------------------------------

    public function make_form($caption, $post_url, $into_table = true, $form_name = 'default_form')
    {
        echo <<<eod
        <pre>
        <form enctype="multipart/form-data" action='{$post_url}' method='post' name='{$form_name}'>
        <input type='hidden' name='action' value='post' />
eod;
        foreach($this->hiddens as $i => $control) {
            echo "<input type='hidden' name='{$control['name']}' value='{$control['value']}' />"; }

        if($into_table) {
            echo '<table align="center" class="form">'; }

        if($caption != "") {
            if($into_table) {
                echo "<tr><th class='form_title'>{$caption}</th></tr>"; }
            else {
                echo "<center>{$caption}</center>";
            }}

        $can_empty_hint = false;
        foreach($this->frames as $fi => $frame)
        {
            if($into_table) {
                echo '<tr><td align="center"><table align="center" class="form_cell"><tr>'; }
            else {
                echo '<p>';
            }
            foreach($frame as $ci => $control)
            {
                $can_empty_text = "";
                if(isset($control["can_empty"]) && !$control["can_empty"])
                {
                    $can_empty_text = "<font color='red'>*</font>";
                    $can_empty_hint = true;
                }

                $value = "";
                if(isset($control["value"])) {
                    $value = "value='{$control["value"]}'"; }

                if($into_table) {
                    echo '<td>'; }
                switch($control["type"])
                {
                    case 1: // edit
                    {
                        $type = $control["passwd"] ? "password" : "text";
                        $max_len = $control["max_len"] ? "maxlength='{$control["max_len"]}'" : "";
                        if($control["caption"] != "")
                        {
                            $max_len_text = $control["sh_hint"] ? "<span class='title' title='лЮЙЯХЛЮКЭМЮЪ ДНОСЯРХЛЮЪ ДКХМЮ ЯРПНЙХ ДКЪ ЩРНЦН ОНКЪ'>[{$control["max_len"]}]</span>" : "";
                            echo "<label for='{$control["name"]}'>{$control["caption"]}{$can_empty_text} {$max_len_text}</label><br />";
                        }
                        echo "<input type='{$type}' name='{$control["name"]}' id='{$control["name"]}_id' {$max_len} {$value} />";
                    }
                    break;
                    case 2: // submit
                    {
                        echo "<center><input type='submit' {$value} /></center>";
                    }
                    break;
                    case 3: // select
                    {
                    echo <<<eod
<label for='{$control["name"]}'>{$control["caption"]}{$can_empty_text}</label><br />
<select name='{$control["name"]}'>{$control["options"]}</select>
eod;
                    }
                    break;
                    case 4: // custom
                    {
                        echo $control["content"];
                    }
                    break;
                    case 5: // textarea
                    {
                        echo <<<eod
<label for='{$control["name"]}'>{$control["caption"]}{$can_empty_text}</label><br />
<textarea name='{$control["name"]}' rows='{$control["rows"]}'>{$control["value"]}</textarea>
eod;
                    }
                    break;
                    case 6: // date selection
                    {
                        echo "<label>{$control["caption"]}{$can_empty_text}</label><br />";
                        $this->get_date_select($control["name"],$control["d"],$control["m"],$control["y"]);
                    }
                    break;
                    case 7: // checkbox
                    {
                        $ch = $control["checked"] ? "checked='checked'" : "";
                        echo <<<eod
<input type='checkbox' name='{$control["name"]}' $ch /><label for='{$control["name"]}'>{$control["caption"]}{$can_empty_text}</label>
eod;
                    }
                    break;
                    case 8: // Database select
                    {
                        echo "<label for='{$control["name"]}'>{$control["caption"]}{$can_empty_text}</label><br />";
                        $this->get_db_select($control["name"], $control['table'], $control['cpt_fld'],
                                             $control['id_fld'], $control['id_nul'], $control['where'], $control['def_id'], $control['cpt_prf']);
                    }
                    break;
                    case 9: // File load
                    {
                        echo <<<eod
<label for='{$control["name"]}'>{$control["caption"]}</label><br />
<input type='file' name='{$control["name"]}' />
eod;

                    }
                    break;
                }
                if($into_table) {
                    echo '</td>'; }
            }
            if($into_table) {
                echo '</tr></table></td></tr>'; }
            else {
                echo '</p>';
            }
        }

        if($can_empty_hint)    {
            if($into_table) {
                echo '<tr><td><font color="red">*</font> - оНКЕ НАЪГЮРЕКЭМН ДКЪ ГЮОНКМЕМХЪ</td></tr>'; }
            else {
                echo '<font color="red">*</font> - оНКЕ НАЪГЮРЕКЭМН ДКЪ ГЮОНКМЕМХЪ';
            }}
        if($into_table) {
            echo '</table>'; }
        echo '</form></pre>';
    }

    public function add_edit($name,$caption,$max_len = null,$value = null,$can_empty = true,$password = false)
    {
        $this->current_frame[] = array('type'        => 1,
                                       'name'        => $name,
                                       'caption'    => $caption,
                                       'value'        => $value,
                                       'sh_hint'    => ($max_len > 0),
                                       'max_len'    => abs($max_len),
                                       'can_empty'    => $can_empty,
                                       'passwd'        => $password);
    }

    public function add_submit($caption = "цНРНБН")
    {
        $this->current_frame[] = array('type'    => 2,
                                       'value'    => $caption);
    }

    public function add_select($name,$caption,$options,$can_empty = true)
    {
        $this->current_frame[] = array('type'        => 3,
                                       'caption'    => $caption,
                                       'name'        => $name,
                                       'options'    => $options,
                                       'can_empty'    => $can_empty);
    }

    public function add_custom($content)
    {
        $this->current_frame[] = array('type'        => 4,
                                       'content'    => $content);
    }

    public function add_hidden($name,$value)
    {
        $this->hiddens[] = array("value" => $value, "name" => $name);
    }

    public function add_memo($name,$caption,$rows = 7,$value = null,$can_empty = true)
    {
        $this->current_frame[] = array('type'        => 5,
                                       'name'        => $name,
                                       'caption'    => $caption,
                                       'rows'        => $rows,
                                       'value'        => $value,
                                       'can_empty'    => $can_empty);
    }

    public function add_dateselect($name_prefix,$caption,$d="",$m="",$y="",$can_empty = false)
    {
        $this->current_frame[] = array('type'        => 6,
                                       'name'        => $name_prefix,
                                       'caption'    => $caption,
                                       'can_empty'    => $can_empty,
                                       'd'            => $d,
                                       'm'            => $m,
                                       'y'            => $y);
    }

    public function add_checkbox($name,$caption,$checked = false)
    {
        $this->current_frame[] = array('type'        => 7,
                                       'checked'    => $checked,
                                       'caption'    => $caption,
                                       'name'        => $name);
    }

    public function add_db_select($name, $caption, $table, $caption_field, $id_field, $default_id = null, $caption_prefix = '', $condition = '', $null_id = -1)
    {
        $this->current_frame[] = array('type'        => 8,
                                       'caption'    => $caption,
                                       'name'        => $name,
                                       'table'        => $table,
                                       'cpt_fld'    => $caption_field,
                                       'cpt_prf'    => $caption_prefix,
                                       'id_fld'        => $id_field,
                                       'id_nul'        => $null_id,
                                       'where'        => $condition,
                                       'def_id'        => $default_id == null ? $null_id : $default_id);
    }

    public function add_fileload($name, $caption)
    {
        $this->current_frame[] = array('type'        => 9,
                                       'caption'    => $caption,
                                       'name'        => $name);
    }

    public function commit_frame()
    {
        if($this->current_frame) {
            $this->frames[] = $this->current_frame; }

        $this->current_frame = array();
    }

}
}
?>

Оно?
Пользуйся, если тебе оно так надо. Я же привык не плакаться — ойой, кнопочку нарисовать этоже надо хтмл код выводить... ойой, не умею, ойой долго писать...
Я привык контролировать хтмл.


C>Понимаешь, на bash можно быстро написать скрипт, который будет удалять

C>файлы с буквой P в имено. Этот скрипт будет работать легко и быстро даже
C>на 386 компьютере.

C>Но будешь ли ты на bash писать Quake 5?

нет конечно, не сравнивай пожалуйста несравнимые вещи. Баш и с++ даааааалеко разными вещами занимаются, а вот пхп+апач и асп+иис это из одного ящика софт, и если у меня пхп уверенно обгоняет асп на п300 (а ведь так? ты со мной согласишся?) то я более чем уверен, что он обгонит асп и на п8000. Точка.
Matrix has you...
Re[4]: Медленнее? Ну чтоже вы, как
От: Sheridan Россия  
Дата: 18.10.06 04:00
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Sheridan wrote:

>> C>А как сам язык — PHP намного медленнее C# или Java, тут даже спорить
>> глупо.
>> Ну запусти на такойже машине с такойже нагрузкой на ИИС подобные выборки
>> и покажи результат.
>> Кстати версии апача пхп и файрберда у меня из последних. Так что прошу
>> также использовать в тестовом забеге последние версии асп, иис и БД на
>> выбор.
C>Давай конкретные SQLи и скрипты.

<?php
if (!defined("CMEMBERSBASE.INC"))
{
define("CMEMBERSBASE.INC",0);
/*
* @author Sheridan
*/
class CMembersBase
{
    function __construct()
    {}

    function __destruct()
    {}

    private function get_member_co_phones($STA_NUM, $check_field)
    {
        global $st;
        $_result = '';
        $sql = <<<eod
SELECT PHONE FROM ATC_CO_LINES WHERE LINE_NUM IN (SELECT CO_LINE FROM ATC_CO_STA WHERE {$check_field} > 0 AND STA_NUM = {$STA_NUM})
eod;
        $db_data = $st->db()->query($sql);
        while($row = $st->db()->fetch_assoc($db_data)) {
            $_result .= "{$row['PHONE']} "; }
        $st->db()->close_query($db_data);
        return $_result != '' ? $_result : '&nbsp;';
    }

    protected function get_member_in_co_phones($STA_NUM)
    {
        return $this->get_member_co_phones($STA_NUM, 'IN_DAY_NIGHT');
    }

    protected function get_member_out_co_phones($STA_NUM)
    {
        return $this->get_member_co_phones($STA_NUM, 'OUT_ALLOWED');
    }
}
}
?>


и

<?php
if (!defined("CPHONEBOOK.INC"))
{
define("CPHONEBOOK.INC",0);
/*
* @author Sheridan
*/
include_once 'src/organisation/cmembersbase.inc';
class CPhoneBook extends CMembersBase
{
    function __construct()
    {
        parent::__construct();
    }

    function __destruct()
    {
        parent::__destruct();
    }

    public function get_title()
    {
        return '[Телефонная книга]';
    }

    private function get_select_sql()
    {
        return <<<eod
SELECT
    ORG_MEMBERS.ID, ORG_MEMBERS.F, ORG_MEMBERS.I, ORG_MEMBERS.O, ORG_MEMBERS.STA_NUM, ORG_MEMBERS.JOB,
    ORG_DIVISIONS.NAME AS DIVISIONNAME,
    ATC_STATIONS.PHONE AS STA_PHONE
FROM ORG_MEMBERS
    INNER JOIN ORG_DIVISIONS ON ORG_DIVISIONS.ID=ORG_MEMBERS.DIVISION
    INNER JOIN ATC_STATIONS ON ATC_STATIONS.STA_NUM=ORG_MEMBERS.STA_NUM
WHERE ORG_MEMBERS.STA_NUM != -1
ORDER BY ORG_MEMBERS.F, ORG_MEMBERS.I, ORG_MEMBERS.O
eod;
    }

    public function get_content()
    {
        global $st;
        echo <<<eod
<table class='data'>
<tr>
    <th class='data_title'>ФИО</th>
    <th class='data_title' colspan='2'>Телефоны</th>
</tr>
eod;
        $db_data = $st->db()->query($this->get_select_sql());
        while($row = $st->db()->fetch_assoc($db_data)) {
            $this->make_item($row); }
        $st->db()->close_query($db_data);
        echo <<<eod
</table>
eod;
    }

    private function make_item($row)
    {
        global $st;
        $city_phones = $this->get_member_in_co_phones($row['STA_NUM']);
        $job = $row['JOB'] != -1 ? ', ' . $st->db()->simple_query('ORG_JOBS','NAME',"ID='{$row['JOB']}'") : '';
        echo <<<eod
<tr>
    <td class='data_cell'>{$row['F']} {$row['I']} {$row['O']} <font size='-1'>[{$row['DIVISIONNAME']}{$job}]</font></td>
    <td class='data_cell'>{$row['STA_PHONE']}</td>
    <td class='data_cell'>{$city_phones}</td>
</tr>
eod;
    }

    public function get_control()
    {
        return '&nbsp;';
    }
}
}
?>

Хотя с другой стороны тут полпроекта надо дать дабы видно было картину...

[RSDN@Home][1.2.0][alpha][0]
[Возобновленная рана много хуже противу новой. [К. Прутков]]
Matrix has you...
Re[3]: PHP5 vs ASP.NET
От: denaturat  
Дата: 18.10.06 06:15
Оценка:
Здравствуйте, Mamut, Вы писали:

D>>Народ! А какие аргументы (кроме моего субъективного отношения) можно привести в защиту замены указанной конфигурации на IIS/ASP.NET? Повесомее, пожалуйста.


M>Главный вопрос — стоимость перевода уже существующего на РНР кода на ASP.NET


Пока он не настолько большой, но начальство хочет что-то (правда, само мало представляет, где такое может пригодиться), что потребует по первым прикидкам писать немало. А именно — систему документооборота. И чего они там хотят, это примерно такую же функциональность, как у средних подобных продуктов. Предложил я им купить уже готовую вещь — бесполезно. ТЗ требую. "Ну чего вам надо", спрашиваю. Ответы пока противоречивы, к счастью, ибо пока не скажут, чего надо, делать, естественно, не буду. Но хотят, хоть и расплывчато, но много.

D>>Народ панически боится IIS и .NET. Мол, IIS кривой, а Apache — невзламываемый. А от NET сервак вообще зависнет. Такое мнение, в принципе, весьма распространено. Простой тест — сделайте запросы "Уязвимость Apache" и "Уязвимость IIS". В Яндексе на первый запрос ссылок больше было. Для тех, кто так думает — скажу одну истину, сказанную одним из неизвестных мне хакеров — если программа запускается, значит, ее можно взломать.


M> +1



M>Хм. А что, для C# IDE покупать не надо?


Visual Studio Express Edition, у себя дома в темноте под одеялом, по крайней мере . О приобретении организацией речи вообще не идет.

M>Для редактирования РНР + HTML вполне хватит SciTe.



Для PHP, в принципе, хватает.

ЗЫ. Команды тут нет. Аз есмь один.
Re[3]: PHP5 vs ASP.NET
От: denaturat  
Дата: 18.10.06 06:24
Оценка:
Здравствуйте, Sheridan, Вы писали:

S>Как правило то что дали — это наследство от программера который писал на том что нравится.

Да
S>Что мешает переписать?
Все снес и с нуля переписал. И вообще сделал, чтоб работать меньше.

D>>Что использую — Notepad2 для редактора PHP и Visual Web Developer для структуры каталогов и редактирования HTML (крутое сочетание, не правда ли?). Есть IDE для PHP, но не стану же я покупать сайта организации на свои бабки офигенный редактор PHP.

S>Скачай PSPad.
скачал
Re[4]: PHP5 vs ASP.NET
От: Mamut Швеция http://dmitriid.com
Дата: 18.10.06 06:47
Оценка:
D>Для PHP, в принципе, хватает.

D>ЗЫ. Команды тут нет. Аз есмь один.


Исходя из этого и поскипанного, можно предположить, что C# или Java будут выбором получше, чем РНР. Но это — ИМХО
... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re[3]: PHP5 vs ASP.NET
От: Mamut Швеция http://dmitriid.com
Дата: 18.10.06 06:47
Оценка:
D>>Народ! А какие аргументы (кроме моего субъективного отношения) можно привести в защиту замены указанной конфигурации на IIS/ASP.NET? Повесомее, пожалуйста.
S>А что аналога .htaccess у IIS нету???

В стандартной поставке нет.

Есть ISAPI Rewrite с коммерческой и бесплатной версиями
... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re[4]: Медленнее? Ну чтоже вы, как
От: Mamut Швеция http://dmitriid.com
Дата: 18.10.06 07:02
Оценка:
C>Ну а ближе к практике — где мне для PHP взять аналог Hibernate?

Будет в Zend Framework. B? наверное, есть имплементация в Cake PHP.

Еще есть Propel

C>А что у

C>нас там с транзакциями?

PEAR:Mdb их поддерживает и даже эмулирует, если база данных не поддерживает

C>Руками расставлять begin-end я не собираюсь. А

C>как насчет компонентной модели страниц?

Компонентная модель — см. Prado

... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re[7]: PHP умирает
От: Mamut Швеция http://dmitriid.com
Дата: 18.10.06 07:02
Оценка:
>> На самом деле это проблема. Парадоксальная причем: с одной стороны,
>> хорошей замены PHP на рынке не видно. С другой стороны,
>> квалифицированные кадры предпочитают из PHP уходить.
C>Ну есть еще Ruby с RoR, он хотя и требует больше ресурсов, но не слишком
C>сильно больше. Ну и он покрасивее PHP все же будет.

У RoR есть одна маааленькая проблема Его грамотная настройка на хостере и последующая scalability требуют весьма серьезных плясок с бубном
... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re[5]: Медленнее? Ну чтоже вы, как
От: Cyberax Марс  
Дата: 18.10.06 08:39
Оценка: 5 (3) +2
Sheridan wrote:
> Компонентная модель?
> Не пожалею даже код.
> Оно?
Даже близко не оно. Это как если бы я говорил про виджеты в QT, а ты бы
отвечал: "А у меня есть процедуры рисования линий и квадратов с помощью
SetPixel, так что у меня такие же крутые компоненты!"

Вот неплохой туториал по Tapestry:
http://www.sitepoint.com/article/jakarta-tapestry/2

К примеру, пишем форму для логина:
[html]
<html>
<head>
<title>Login</title>
</head>
<body>
<h1>Login</h1>
<span style="color: red"><span jwcid="errorMsg"/></span>
<form jwcid="loginForm">
<table border="0">
<tr><td>Username:</td><td><input type="text"
jwcid="username"/></td></tr>
<tr><td>Password:</td><td><input type="password"
jwcid="password"/></td></tr>
<tr><td></td><td><input type="submit" value="Login"/></td></tr>
</table>
</form>
</body>
</html>
[/html]

Теперь пишем байндинг полей формы к данным (это можно делать как с
помощью отдельных XML-файлов, так и с помощью аннотаций в коде). Кстати,
с помощью Spindle для Eclipse сразу будут подсвечиваться несоответствия
в XML и HTML:
<?xml version="1.0" encoding="UTF-8"?>
<page-specification>
   <component id="loginForm" type="Form">
     <binding name="listener" value="listener:onLogin"/>
   </component>
   <component id="username" type="TextField">
     <binding name="value" value="username"/>
   </component>
   <component id="password" type="TextField">
     <binding name="value" value="password"/>
     <binding name="hidden" value="true"/>
   </component>
   <component id="errorMsg" type="Delegator">
       <binding name="delegate" value="beans.delegate.firstError"/>
   </component>
</page-specification>


А вот соответствующий код на Java:
...
     @InjectState("mutableUser")
     public abstract MutableUser getMutableUser();

     @Bean
     public abstract ValidationDelegate getDelegate();

     public String onLogin() {
         MutableUser mutableUser = DummyFactory.getMutableUser(username, 
password);
         if (mutableUser != null)
         {
             // remember that this user has logged in.
             getMutableUser().copyFrom(mutableUser);
             return "SomeOtherPage"; //Это пошлет нас на следующую страницу
         } else {
             // display an error and show the Login page again.
             ValidationDelegate delegate = getDelegate();
             delegate.setFormComponent(null);
             delegate.record("Login failed", null);
             return null;
         }
     }
...


Все, страница у нас готова. Теперь Tapestry сама будет выполнять
привязку, обрабатывать кнопки back (с помощью rewinding), рисовать
ошибки, управлять состоянием и т.п.

Для простой страницы с парой полей преимущества могут быть неочевидны.
Но теперь представим, что мы хотим вывести таблицу с поддержкой
сортировки по колонкам и фильтрации (то есть сверху таблицы есть поле
ввода, в котором задается строка фильтрации). Причем мы хотим сделать
так, чтобы листание таблицы и фильтрация работала через AJAX.

Для PHP придется писать горы кода, для Tapestry я просто беру
http://tacos.sourceforge.net/ , добавляю на форму их компонент Grid,
добавляю поле для фильтра и связываю их через binding.

> Пользуйся, если тебе оно так надо. Я же привык не плакаться — ойой,

> кнопочку нарисовать этоже надо хтмл код выводить... ойой, не умею, ойой
> долго писать...
Я умею. Но тратить зря на это время — нафиг.

> Я привык контролировать хтмл.

А кто мешает?

> C>Понимаешь, на bash можно быстро написать скрипт, который будет удалять

> C>файлы с буквой P в имено. Этот скрипт будет работать легко и быстро даже
> C>на 386 компьютере.
> C>Но будешь ли ты на bash писать Quake 5?
> нет конечно, не сравнивай пожалуйста несравнимые вещи.
Нет. ASP.NET — это наааамного более высокий уровень по сравнению с PHP.

> даааааалеко разными вещами занимаются, а вот пхп+апач и асп+иис это из

> одного ящика софт, и если у меня пхп уверенно обгоняет асп на п300 (а
> ведь так? ты со мной согласишся?) то я более чем уверен, что он обгонит
> асп и на п8000. Точка.
Нда... А откуда такая уверенность?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[5]: Медленнее? Ну чтоже вы, как
От: Cyberax Марс  
Дата: 18.10.06 08:46
Оценка:
Mamut wrote:
> C>Ну а ближе к практике — где мне для PHP взять аналог Hibernate?
> Будет в Zend Framework. B? наверное, есть имплементация в Cake PHP.
> Еще есть Propel <http://propel.phpdb.org/trac/&gt;
Вопрос только в том, когда это станет юзабельно Пока что это все на
зачаточном уровне.

> C>А что у нас там с транзакциями?

> PEAR:Mdb их поддерживает и даже эмулирует, если база данных не поддерживает
Просто мне как человеку, измученому нарзаном, хочется декларативного
управления транзакциями, да еще и с поддержкой XA.

> C>Руками расставлять begin-end я не собираюсь. А

> C>как насчет компонентной модели страниц?
> Компонентная модель — см. Prado <http://xisc.com/&gt;
Ну хоть что-то похожее на Tapestry трехлетней давности появилось

Просто у меня есть большие сомнения, что эти проекты уйдут далеко. В
Java, например, Hibernate обычно дает примерно 5% оверхеда. В PHP это
будет все 50% оверхеда за счет отсутствия JIT-компилятора.

А если добавлять в PHP еще и JIT со строгой типизацией, то в итоге
получится Java
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[8]: PHP умирает
От: Cyberax Марс  
Дата: 18.10.06 08:53
Оценка:
Mamut wrote:
>> > На самом деле это проблема. Парадоксальная причем: с одной стороны,
>> > хорошей замены PHP на рынке не видно. С другой стороны,
>> > квалифицированные кадры предпочитают из PHP уходить.
> C>Ну есть еще Ruby с RoR, он хотя и требует больше ресурсов, но не слишком
> C>сильно больше. Ну и он покрасивее PHP все же будет.
> У RoR есть одна маааленькая проблема Его грамотная настройка на хостере
> и последующая scalability требуют весьма серьезных плясок с бубном
Это, в принципе, проблема решаемая (в том числе и коммерческим продуктом).

...Хотя если армия индусов с PHP переедет на Ruby...
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[6]: Медленнее? Ну чтоже вы, как
От: Mamut Швеция http://dmitriid.com
Дата: 18.10.06 09:24
Оценка:
>> C>А что у нас там с транзакциями?
>> PEAR:Mdb их поддерживает и даже эмулирует, если база данных не поддерживает
C>Просто мне как человеку, измученому нарзаном, хочется декларативного
C>управления транзакциями, да еще и с поддержкой XA.

Ха-ха

>> C>Руками расставлять begin-end я не собираюсь. А

>> C>как насчет компонентной модели страниц?
>> Компонентная модель — см. Prado <http://xisc.com/&gt;
C>Ну хоть что-то похожее на Tapestry трехлетней давности появилось

Ну, PRADO тоже немолод Но это скорее попытка эмулировать оведение ASP.NET. Хотя что у них там сейчас твоорится — фиг знает

C>Просто у меня есть большие сомнения, что эти проекты уйдут далеко. В

C>Java, например, Hibernate обычно дает примерно 5% оверхеда. В PHP это
C>будет все 50% оверхеда за счет отсутствия JIT-компилятора.

C>А если добавлять в PHP еще и JIT со строгой типизацией, то в итоге

C>получится Java

... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re[6]: Медленнее? Ну чтоже вы, как
От: Sheridan Россия  
Дата: 18.10.06 10:18
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Все, страница у нас готова. Теперь Tapestry сама будет выполнять

C>привязку, обрабатывать кнопки back (с помощью rewinding), рисовать
C>ошибки, управлять состоянием и т.п.
Вобщем из хорошего только то что оно ошибки само проверяет, да back, а остальное... Вобщем не впечатлило меня почемуто...
И мы наверное поразному воспринимаем понятие "компонент".

C>Для простой страницы с парой полей преимущества могут быть неочевидны.

C>Но теперь представим, что мы хотим вывести таблицу с поддержкой
C>сортировки по колонкам и фильтрации (то есть сверху таблицы есть поле
C>ввода, в котором задается строка фильтрации).
Без проблем писал такое, причем сортировка выполнялась не на уровне построения таблицы а на уровне sql запроса к БД. И поэтому с фильтрацией тоже проблем не вижу.

C>Причем мы хотим сделать так, чтобы листание таблицы и фильтрация работала через AJAX.

Дачтож это за панацея ажакс? Объясни жураку... Чтото все чаще и чаще слышу... Очередной Nemerle?

C>Для PHP придется писать горы кода, для Tapestry я просто беру

C>http://tacos.sourceforge.net/ , добавляю на форму их компонент Grid,
C>добавляю поле для фильтра и связываю их через binding.
Вобщем делфи какоето получается...

>> Пользуйся, если тебе оно так надо. Я же привык не плакаться — ойой,

>> кнопочку нарисовать этоже надо хтмл код выводить... ойой, не умею, ойой
>> долго писать...
C>Я умею. Но тратить зря на это время — нафиг.
Тратить время? О повторном использовании кода слышал?

>> Я привык контролировать хтмл.

C>А кто мешает?
А ты уверен что твои компоненты тебе дадут валидный хтмл в итоге? что </td> нигде не пропустят, что в урлах будет &amp; вместо просто &, что все параметры тегов будут в кавычках, что не пропустит оно alt для картинок и прочее прочее прочее.

>> C>Понимаешь, на bash можно быстро написать скрипт, который будет удалять

>> C>файлы с буквой P в имено. Этот скрипт будет работать легко и быстро даже
>> C>на 386 компьютере.
>> C>Но будешь ли ты на bash писать Quake 5?
>> нет конечно, не сравнивай пожалуйста несравнимые вещи.
C>Нет. ASP.NET — это наааамного более высокий уровень по сравнению с PHP.
Из твоего кода я понял что асп успешно движется в сторону шаблонной писанины, и в конце концов все будет под один гребень причесано...

>> даааааалеко разными вещами занимаются, а вот пхп+апач и асп+иис это из

>> одного ящика софт, и если у меня пхп уверенно обгоняет асп на п300 (а
>> ведь так? ты со мной согласишся?) то я более чем уверен, что он обгонит
>> асп и на п8000. Точка.
C>Нда... А откуда такая уверенность?
Обычная индукция.

[RSDN@Home][1.2.0][alpha][0]
[Все люди хотят жить долго, но никто не хочет быть старым. [Д. Свифт]]
Matrix has you...
Re[7]: Медленнее? Ну чтоже вы, как
От: Cyberax Марс  
Дата: 18.10.06 10:35
Оценка: +1
Sheridan wrote:
> C>Все, страница у нас готова. Теперь Tapestry сама будет выполнять
> C>привязку, обрабатывать кнопки back (с помощью rewinding), рисовать
> C>ошибки, управлять состоянием и т.п.
> Вобщем из хорошего только то что оно ошибки само проверяет, да back, а
> остальное... Вобщем не впечатлило меня почемуто...
Ага, там еще управление потоком (то есть что куда переходит), удобные
сессии, отладчик страниц и еще огромное количество приятных вещей.

> C>Для простой страницы с парой полей преимущества могут быть неочевидны.

> C>Но теперь представим, что мы хотим вывести таблицу с поддержкой
> C>сортировки по колонкам и фильтрации (то есть сверху таблицы есть поле
> C>ввода, в котором задается строка фильтрации).
> Без проблем писал такое, причем сортировка выполнялась не на уровне
> построения таблицы а на уровне sql запроса к БД. И поэтому с фильтрацией
> тоже проблем не вижу.
Ну-ну. И сколько десятков килобайт кода это заняло? Кстати, еще учти,
что в ячейках таблицы могут быть custom-рендерер'ы. Да, а еще есть
редактирование — щелкаем на строку и тут же редактируем поля.

И все это уже написано, мне просто надо вставить "<span jwcid="grid">" и
написать реализацию TableModel на Java.

> C>Причем мы хотим сделать так, чтобы листание таблицы и фильтрация

> работала через AJAX.
> Дачтож это за панацея ажакс? Объясни жураку... Чтото все чаще и чаще
> слышу... Очередной Nemerle?
AJAX=Asynchronous Java And XML. То есть страницы, которые не требуют
полной перезагрузки при действиях с ними. В качестве примера можешь
посмотреть Google Mail (могу инвайт прислать, если надо).

Да, а еще компоненты в Tapestry умеют делать graceful degradation до
обычных странцчных компонентов, если браузер не поддерживает AJAX.

> C>Для PHP придется писать горы кода, для Tapestry я просто беру

> C>http://tacos.sourceforge.net/ , добавляю на форму их компонент Grid,
> C>добавляю поле для фильтра и связываю их через binding.
> Вобщем делфи какоето получается...
Именно, причем более правильный и адаптированый для Web. Что проще для
использования: Дельфи или голый WinAPI?

>> > Пользуйся, если тебе оно так надо. Я же привык не плакаться — ойой,

>> > кнопочку нарисовать этоже надо хтмл код выводить... ойой, не умею, ойой
>> > долго писать...
> C>Я умею. Но тратить зря на это время — нафиг.
> Тратить время? О повторном использовании кода слышал?
В PHP оно примерно равно cut&paste.

Я про другое говорил — нафиг мне возиться с деталями HTML-разметки, если
я могу просто собрать страницу из компонентов и с помощью CSS назначить
им нужные визуальные стили?

>> > Я привык контролировать хтмл.

> C>А кто мешает?
> А ты уверен что твои компоненты тебе дадут валидный хтмл в итоге?
??? Естественно!

Более того, они выдадут валидный XHTML, который при желании еще и через
XSL можно протащить будет.

> что </td> нигде не пропустят, что в урлах будет &amp; вместо просто &, что

> все параметры тегов будут в кавычках, что не пропустит оно alt для
> картинок и прочее прочее прочее.
Это скорее проблема PHP. О таких мелочах я уже и думать забыл — к
хорошему быстро привыкаешь.

>> > C>Но будешь ли ты на bash писать Quake 5?

>> > нет конечно, не сравнивай пожалуйста несравнимые вещи.
> C>Нет. ASP.NET — это наааамного более высокий уровень по сравнению с PHP.
> Из твоего кода я понял что асп успешно движется в сторону шаблонной
> писанины, и в конце концов все будет под один гребень причесано...
Какой "гребень"? Весь HTML — это сплошные шаблоны. Везде одинаковые тэги
<html>, <body> — ничего нового нет!

>> > даааааалеко разными вещами занимаются, а вот пхп+апач и асп+иис это из

>> > одного ящика софт, и если у меня пхп уверенно обгоняет асп на п300 (а
>> > ведь так? ты со мной согласишся?) то я более чем уверен, что он обгонит
>> > асп и на п8000. Точка.
> C>Нда... А откуда такая уверенность?
> Обычная индукция.
Мда. А на чем основана база индукции?
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[8]: Медленнее? Ну чтоже вы, как
От: Mamut Швеция http://dmitriid.com
Дата: 18.10.06 11:29
Оценка: +1
C>AJAX=Asynchronous Java And XML.

Позвольте-позвольте. Asynchronous JavaScript And XML

Java и JavaScript — это две большие разницы.

Ну и многие уже отказались от идеи использовать XML в Аяксе. Гораздо удобнее предавать или JSON или напрямую сгенерированный HTML. Но название осталось.

От серверное технологии Аякс почти не зависит
... << RSDN@Home 1.2.0 alpha rev. 655>>


dmitriid.comGitHubLinkedIn
Re[3]: Медленнее? Ну чтоже вы, как
От: _rasta  
Дата: 18.10.06 11:59
Оценка:
Здравствуйте, Sheridan, Вы писали:

C>>А как сам язык — PHP намного медленнее C# или Java, тут даже спорить глупо.

S>Ну запусти на такойже машине с такойже нагрузкой на ИИС подобные выборки и покажи результат.

тут
Автор: _rasta
Дата: 09.10.06
был? читал? и ниже по ветке? тады комментируй...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.