У автора только болтовня, где код? ты хоть посмотри на yii, все красиво и функционально, широкое сообщество, ничего не скрывается.
А сколько у битрикса нагрузка, сколько у джомлы? Я сегодня был целый день занят, не думал что память играет столь важную роль. Пасиба. Сейчас готово всё. Теперь жрёт ы 2 раза меньше. Скрыл много ф-ии и что часто не используются. И вуаля: Код (Text): Site memory usage: 8.50 MB Total memory usage: 9.00 MB Database time: 0.0900s Database accesses: 13 Page load: 0.1500s Files included: 44 Files size: 730.88 KB С кешем вообще 5 мег только будет и 3 соединения с базой.. Больше сжимать уже некуда. Всё сжато! С выходом версии 6.5 всё будет по новому. Наглядно оставил на http://ajaxel.com снизу, посмотрите там инфу и какие соединения и файлы подключаются. Какой код мне тут вам показывать? Прямо сюда на форум и пихать? Причём тут yii и моё самолюбие? Ладно знаю.. у меня оно есть, я же лев.. Не было бы самолюбия не было бы мотива делать всё это. У меня отличные идеи и написал это.. Для вас же! А вы лишь бы покритиковать.. Но я задумался и понял что всё что меня не убивает делает только сильнее, благодаря вам. Я сделаю всё что вы сочтёте нужным. Может я где то чтото упустил, поэтому я здесь. Добавлено спустя 5 минут 59 секунд: правда пямять у coopertino почему то больше хавает.. у меня на локалке так щас показывает 9мег. Не кэшированная страница http://ajaxel.com/reset, посмотрите правильно ли всё? сойдёт? или ещё сжимать? целый день менял ядро, сжимал и ещё прикрутил Код (Text): spl_autoload_register('ajaxel_autoloader'); function ajaxel_autoloader($class) { if (is_file(FTP_DIR_ROOT.'inc/'.$class.'.php')) { require_once FTP_DIR_ROOT.'inc/'.$class.'.php'; Site::mem($class.'.php load'); } elseif (is_file(FTP_DIR_ROOT.'mod/'.$class.'.php')) { require_once FTP_DIR_ROOT.'mod/'.$class.'.php'; Site::mem($class.'.php load'); } } вот.. крутая штука Добавлено спустя 5 минут 27 секунд: Кстате про битрикс: https://github.com/hunterman/bxzender/wiki/Bitrix-facts Добавлено спустя 25 минут 50 секунд: что у меня на локалке c пустым шаблоном
150 ms это долго для страницы, которой ты гордишься. на 13-то запросов в бд. что там за страница такая нагруженная?
Ничего особенного. Достаю нужные данные для сайта. Я написал движок, или вам нужен пустой index.php файл? Так напиши себе Игорь echo 'I am stupid'; и любуйся а затем ударься головой об монитор. Пасиба!
думаешь count(*) лучше? * - это взять всё. 1 взять буул.. то есть если существует. а звёздочка я полагаю будет выбирать все столбцы, что совсем ненужно для подсчёта количества рядов. Технология, учись, студент! Добавлено спустя 11 минут 18 секунд: коли вам так нравится код, пожалуй я поделюсь с вами своей заработкой Код (PHP): public static function getAll($sql,$sel=false,$func=false) { self::on(); $result = @mysql_query($sql,self::$DB[self::$nDB]); if ($result===false) { self::error($sql); } $ret = array(); if ($sel) { if (strstr($sel,'|')) { $ex = explode('|',$sel); if ($ex[1]=='[[:ARRAY:]]') { while($row = mysql_fetch_assoc($result)) { $k = $row[$ex[0]]; if ($func) $row = call_user_func_array($func,array($row)); $ret[$k] = $row; } } elseif ($ex[1]=='[[:EMPTY:]]') { while($row = mysql_fetch_assoc($result)) { $ret[$row[$ex[0]]] = ''; } } elseif ($ex[0]=='[[:INDEX:]]') { while($row = mysql_fetch_assoc($result)) { if ($func) $ret[] = call_user_func_array($func,array($row[$ex[1]])); else $ret[] = $row[$ex[1]]; } } else { while($row = mysql_fetch_assoc($result)) { if ($func) $row = call_user_func_array($func,array($row)); $ret[$row[$ex[0]]] = $row[$ex[1]]; } } } else { while($row = mysql_fetch_assoc($result)) { if ($func) $row = call_user_func_array($func,array($row)); array_push($ret,$row[$sel]); } } } else { while($row = mysql_fetch_assoc($result)) { if ($func) $row = call_user_func_array($func,array($row)); array_push($ret,$row); } } self::off(true,$sql); if (self::errorMsg()) { self::$err = true; return false; } if ($ret && strstr($sql,'SQL_CALC_FOUND_ROWS')) $ret['FOUND_ROWS()'] = DB::one('SELECT FOUND_ROWS()'); if (Site::$db_sql) self::fill($sql,$result); self::free($result); self::yeserror(); return $ret; } не думаю что следует комментировать зачем это всё. Всё вот так вот у меня в двигле, и нигде такой крутизны вы больше не найдёте. Я сам все движки пересмотрел и могу сказать что всё они барахло для тех кому времени и нервов не жалко... я сделал всё исключительно во благо всем. Всё продумал и максимально удобно для всех соорудил.. Добавлено спустя 3 минуты 2 секунды: В вот ещё одна мудрёная.. Код (PHP): public static function insert($table, $data, $replace = false, $cols_only = false) { if (!$data) return false; $_data = array(); if ($cols_only===true) { foreach ($data as $k => $v) { $_data[$k] = self::string($v); } } else { if (!$cols_only) $cols = self::columns($table); foreach ($data as $k => $v) { $_k = ltrim($k,'.'); if (!$cols_only && !in_array($_k, $cols)) continue; if ($cols_only && !in_array($_k,$cols_only)) continue; $_data[$_k] = self::string($v, (substr($k,0,1)=='.' ? false : true)); } } if (!$_data) { return false; } $_table = self::prefix($table); if (self::$lock) self::run("LOCK TABLE $_table WRITE"); $sql = ($replace?'REPLACE':'INSERT').(self::$delayed?' DELAYED':(self::$ignore?' IGNORE':'')).' INTO `'.$_table.'` (`'.join('`, `',array_keys($_data)).'`) VALUES ('.join(', ',array_values($_data)).')'; self::delayed(false); self::ignore(false); self::no_prefix(false); $ret = self::run($sql); if (self::$lock) self::run('UNLOCK TABLES'); return $ret; } Сами бы вы не додумались даже! Ещё пи-здите!
Слушай, а давай без этой идиотии... Ты-же сам подтверждаешь, что нихрена ты не смотрел. Ну а про заявления о барахле - отдельные 3 раза ха. Про нервы и время: да, если тебе лень читать документацию и включать голову, чтобы посмотреть на то, как оно должно работать (потому и плодят кучи кривых модулей, ведь это пишу Я - это МОЙ модуль, Я один прав остальные так, поссать зашли). Вот не поленюсь померю сегодня Джумлу. P.S. На словах - ты Лев Толстой.
Без кэша, без оптимизаций, ибо стадия активной разработки. Это самая тяжелая страница (главная, куда заказчик вывалить решил информацию почти отовсюду).
Автор...блин..ну вот было просветление адекватности же. Прям как будто другой человек писал. И тут бац - опять Остапа понесло. Одергивай себя как только захочется собой погордиться. Если что-то достойно похвалы, люди похвалят сами. Если нахваливаешь сам, это сразу рождает сомнения и пренебрежение. Но по крайней мере взялся за голову - 5 метров памяти уже сэкономлено. Двигайся дальше. Тут все очень просто. Сколько бы ни было - это очень много. Можно меньше. Хорошо оптимизированный продукт - это когда самые слабые места у тебя упираются в сам PHP. Добавлено спустя 1 минуту 30 секунд: Слух...ну со временем что-то не то совсем. Очень уж долго. Добавлено спустя 1 минуту 46 секунд: 4 метра на инициализацию..метр на роутинг, метр на диспетч..что-то там не то. Копай.
не на сервере ибо, а на рабочей машинке, а на мне много сервисов крутится, и плюс совпало с запуском phpStorm'а. Селява ) Про роутинг: дык пишу пишу, там 5 моих компонентов (ибо похожего в природе не нашлось), они еще без роутов, чичас главное функционал сделать, маршрутизацию буду писать опосля, ибо не ясно еще, чем там дело закончится. P.S. кстати да, слегка поглядел в базу, поплевал, там автор одного из компонентов посчитал лишним трудом индексы повешать на поля покоторым выборку проводит, у него только PK определен и все, видимо индексы они лешние - да )
getAll, imho Код (Text): $result = @mysql_query($sql,self::$DB[self::$nDB]); if ($result===false) { self::error($sql); } ну во-первых, @ во-вторых, считаю надо mysql_query (коль им пользуемся) вынести в отдельный метод в третьих, в этом отдельном методе сделать что то типо Код (Text): $result = mysql_query($sql,self::$DB[self::$nDB]); // Хотя сюда можно и or die(mysql_error()); ибо не вижу ситуации, когда на продакшне может случиться здесь ошибка. (из опыта - не было ни разу) if (!$result) self::error($sql); надеюсь в self::error есть mysql_error? зачем запуск колбек функции классом бд? разве "модель" занимается делами "контроллера"? что за пздц с $sel? можно пример использования функции/метода getall? что означают все эти имена методов? как понять не читая горы литры, которую вы никогда не напишите (ставлю бутылку пива) if (Site::$db_sql) self::fill($sql,$result); self::free($result); self::yeserror(); Добавлено спустя 1 минуту 58 секунд: спасибо Yii, что ты есть!
Нет не моя конечно! Просто знаю как лучше.. Это не MySQL_error() это сразу выдаст ошибку в красивом виде и с debug_bactrace и вышлет админу на мыло. Для дебагера собирает запросы, освобождает память и врубает вывод ошибки если не было DB:noerror() вам сложно будет понять думаю.. Я ещё занималься оптимизацией и сейчас 6,25 показывает с пустым шаблоном на локалке, двигаюсь дальше конечно)) Вот посмотрите мой последний сайт http://ru.mytrademarkets.com как быстро всё работает! Причём тут век, если я решил выводить ошибку с красивом виде? с детальной информацией нежели чем MySQL error бла бла и чётамдальшето почему.. всё продумано специально так.. Хорошо я понял, больше не буду)))) Всё ясно с тобой.. вот есть пример для этого: Код (Text): $this->dogs = DB::getAll('SELECT *, '.DB::sqlGetString('age','dob').' AS age FROM '.$this->prefix.'grid_dogs WHERE userid='.$this->UserID.' AND active=1 AND sellonly=\'0\'','id|[[:ARRAY:]]',array($this, 'retDog')); быстро удобно и дописывать ничего не надо.. где: Код (Text): public function retDog($row) { $row['title'] = html($row['title']); $row['show_name'] = html($row['show_name']); $row['name'] = trim($row['title'].' '.$row['show_name']); if ($row['main_photo']) { $row['photo'] = HTTP_DIR_FILES.'grid_dogs/'.$row['id'].'/th2/'.$row['main_photo']; $row['photo_big'] = HTTP_DIR_FILES.'grid_dogs/'.$row['id'].'/th1/'.$row['main_photo']; } $row['link'] = '?profile='.$row['id']; if ($row['breed']) { $row['breed_name'] = preg_replace('/([a-z])([A-Z])/','$1 $2',DB::one('SELECT name_en FROM '.DB_PREFIX.'breed_list WHERE id='.(int)$row['breed'])); } $row['prof_name'] = Data::getVal('my:prof',$row['prof']); return $row; } так далее... Добавлено спустя 13 минут 25 секунд: Вдруг понадобится собрать нужный массив из данных Чем меньше foreach циклов тем лучше! Если уже есть цикл то почему бы не сделать всё прямо в нём. Добавлено спустя 43 секунды: меня так учили когда-то.. ))
http://stackoverflow.com/questions/2710621/count-vs-count1- ... -is-better надо бы знать не только как лучше, но и когда лучше. твоё: Код (Text): 0.16 ms Scheduling request 0.01 ms Writing request header 0.02 ms Writing request body 255.55 ms Waiting for response 0.05 ms Reading response header 76.63 ms Reading response body 9.17 ms Processing response 341.60 ms Duration моё http://besmarter.ru : Код (Text): 0.17 ms Scheduling request 0.01 ms Writing request header 0.02 ms Writing request body 19.49 ms Waiting for response 0.04 ms Reading response header 82.19 ms Reading response body 39.33 ms Processing response 141.26 ms Duration эксепшены юзай. mysqli_report(MYSQLI_REPORT_STRICT); о том и речь, что у тебя уровень продуманства застрял в каменном веке, ибо давить ошибки собаками - капец.
да, собаками я тоже считаю что давить их не следует. Но как быть если я хочу вывести и показать весь запрос для "красивой" ошибки.. $sql запрос не передаётся в mysqli_report(MYSQLI_REPORT_STRICT); а только часть в MySQL_error этого не достаточно. И сохранять каждый запрос в памяти тоже глупо. Добавлено спустя 56 секунд: Waiting for response на каком сайте это? почему? Всегда такой стабильняк? Не прыгает? Добавлено спустя 36 секунд: От хостинга это скорее всего зависит что ты делаешь. Добавлено спустя 3 минуты 25 секунд: так как же лучше на самом деле то? COUNT(*) или COUNT(1) ?? я долго думал на самом деле по этому поводу и вот.. решил так сделать... там на stack пишется как то непонтно.. кто о чём говорит. Добавлено спустя 1 минуту 20 секунд: •COUNT(*) counts the number of rows •COUNT(1) also counts the number of rows also? в этом разница? я всё равно не понял))) Добавлено спустя 2 минуты 8 секунд: Собаками я больше ничего в двигле не давлю! Кроме MySQL ф-ии... Даже можно запустить весь цмс на error_reporting(E_ALL) и всё будет збз.. Использую: Код (Text): function http($http, $name, $key, $_key, $default = '') { if ($_key) $return = ((isset($http[$key]) && isset($http[$key][$_key])) ? $http[$key][$_key] : $default); else { if (is_array($key)) { $key = key($key); } $return = (isset($http[$key]) ? $http[$key] : $default); } if ($return==='[[:CACHE:]]') { $return = Cache::getSmall($name.'('.$key.($_key?','.$_key:'').')'); } elseif ($default==='[[:CACHE:]]') { Cache::saveSmall($name.'('.$key.($_key?','.$_key:'').')',$return); } return $return; } function get($key,$_key=false,$default = '') { return http($_GET, 'get', $key, $_key, $default); } function post($key,$_key=false, $default = '') { return http($_POST, 'post', $key, $_key, $default); } function files($key,$_key=false, $default = '') { if ($_key) return ((isset($_FILES[$key]) && isset($_FILES[$key][$_key])) ? $_FILES[$key][$_key] : $default); else return (isset($_FILES[$key]) ? $_FILES[$key] : $default); } function request($key, $_key=false, $default = '') { return http($_REQUEST, 'request', $key, $_key, $default); } function cookie($key, $default = '') { return (isset($_COOKIE[$key]) ? $_COOKIE[$key] : $default); } Что думаете?
сохраняй последний! =) Добавлено спустя 4 минуты 53 секунды: написано что если без where из одной таблицы и движок MyIsam - то Count(*). Если из одной таблицы, то "работает хорошо" Count(1). Короче, тяжко.
кури, что такое error handler. И таки да, все запросы хранить нет смысла - ошибку может выдать только последний исполненный, что логично. Ты же его в переменной передаешь куда-то там у себя? Вот и юзай его. А пока - костыли на костылях.
Забыл упомянуть что Ajaxel имеет переменную Site::$mini которая отрубает Smarty и тд.. Можно делать шаблоны на PHP файлах. mini включается автоматически при upload и долбалке.. Вот если при mini: Я всегда буду усовершенствовать движок, чем больше знаний тем лучше движок разумеется..) На самом деле для подсчёта кол-ва я часто использую SQL_CALC_FOUND_ROWS Count(1) я окей.. переделаю.. там всего лишь в одном месте: DB::getCount Сейчас движок хавает 6.25 Mb всё почистил) думаю это идеально для цмс. Есть куча настроек, смотрите config/defines.php Кстати вчера требовалось копернуть сайт на другой сабдомен, копернул лишь index.php, были проблемы но уже исправил, с выходом версии 6.6 будет такая вот гибкость..
гибкость это другое - это когда твоя цмс является не сайтом с кастомизируемым внешним видом и пунктами в меню, а адским конструктором лего. Добавлено спустя 1 минуту 32 секунды: никогда не хвали то, что делаешь, иначе не будешь видеть недостатков. Стопудово есть еще что шевелить. А то не так давно 17 метров было идеальным. Оказалось, что 10 из них - избыточные.