Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » Оптимизация кода PHP

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

ElCoyote

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет Всем!
Дайте ссылки на документы по оптимизации php кода, примеры, свои изыски, мысли по этой теме.
 
Порыскал по литературе, пока нашел вот это:
 
***
Выносите $переменные из "текстовых строк":
$x="test $test";   // неправильно
$x="test".$test;   // правильно
***
 
***
Короткие переменные не более 7 символов:
$var_for_function=1;   //неправильно
$x=1;   //правильно
***
 
***
eregi("МаС+иВ",$text);   //тормозит
preg_match("/МаС+иВ/im",$text);   //не тормозит
***
 
***
for ($j = 0;$j < sizeof($arr);$j++)
    echo $arr[$j] . '<br>';   //неправильно
 
for ($j=0, $max = sizeof($arr), $s = '';$j < $max;$j++)
  $s .= $arr[$j] . '<br>';
echo $s;   //правильно
 
ob_start();
for ($j=0, $max = sizeof($arr), $s = '';$j < $max;$j++)
   echo $arr[$j] . '<br>';   //типа еще правильней
***
 
И самый главный для меня вопрос - как оптимизировать такой код:
есть страница, которая выводит инфу из базы данных в таблицу (больше ста строк и около 15-ти колонок), эти данные изменяются и отправляются на эту же страницу (где данные обрабатываются и отсылаются обратно в базу).

Всего записей: 182 | Зарегистр. 07-04-2006 | Отправлено: 00:35 20-07-2006
N Sensey N



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Как начнет тормозить - тогда и будешь оптимизировать... сейчас это пустой и бесполезный разговор...

----------
sPaiz-Nuke - Free PHP CMS Web Design and Development Портал для израильтян

Всего записей: 1409 | Зарегистр. 01-10-2002 | Отправлено: 01:30 20-07-2006
cwll



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
***  
Выносите $переменные из "текстовых строк":  
$x="test $test";   // неправильно  
$x="test".$test;   // правильно  
***  

 
Тогда уж так: $x='test'.$test;   // правильно  
 
А в целом согласен с предыдущим оратором: не страдай фигней в борьбе за микросекунды, пока в этом нет нужды. Лучше подумать над кодом, потом над более быстрым алгоритмом и лишь потом, когда все средства испытаны...  

Всего записей: 206 | Зарегистр. 26-10-2005 | Отправлено: 01:55 20-07-2006
Advanced_Guest



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
...Лучше подумать над кодом, потом над более быстрым алгоритмом и лишь потом..  

подумать про апгрейд сервера, вынос на отдельную платформу, оптимизациия файловой структуры, програмного обеспечения (тот же zend Optimizer).
Если совсем припрёт, то можно некоторые куски написать на C++, асемблере и тд.
Но я сомневаюсь что это актуально у автора темы.
 
разница, запишешь ты:
***  
$var_for_function=1;   //неправильно  
$x=1;   //правильно  
 
или  
$x="test $test";   // неправильно  
$x="test".$test;   // правильно
***
не сильно скажется на производительности  
Но вот разбиратся в коде будет намного сложнее.
 
например в коде нужно 20 переменных, делать их односимвольными ?и использовать все буквы от A до Z ?  
замучаешься потом искать ошибки и дописывать.
 
 
 


----------
The Abyss - UO, LA2, Ботва, BSFG

Всего записей: 2446 | Зарегистр. 14-04-2002 | Отправлено: 02:07 20-07-2006
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Advanced_Guest
Поддерживаю мысль!  
 

Цитата:
$var_for_function=1;   //неправильно  
$x=1;   //правильно

ElCoyote кто сказал что это не правильно? Я первый кину в него камень
 
У меня есть переменные которые содержат несколько слов. И поверьте это очень удобно. Представьте после года вы взялись оптимизировать код, и что вы видите $i = $x + 10; а что каждая переменная означает еще надо разбираться. А у меня написано $pageToDisplay = $currentArticleNum + 10; которая быстрей воспринимается? Да и во всех книгах (для профессионалов OReilly к примеру) предлагают называть переменные по смыслу, и использовать синтаксис принятый в языке "С" первая буква переменной маленькая и каждое следующее слово с большой буквы.
 
Другое дело можно оптимизировать РНР скрипт Zender оптимизатором, здесь у вас будет хороший и наглядный прирост. Хотя больше всего удается выиграть если пересмотреть алгоритмы циклов и вызовы функций

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 03:54 20-07-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Быстрый код или хороший стиль? Не бывает одновременно и того и другого. Тут нужно искать золотую середину, хотя в пхп будет оправданней склонятся именно к хорошему стилю. И вовсе не нужно писать абы как, а потом когда уже все начнет тормозить и глючить, вываливать на рубоард киллометровые кривые исходникики(на которые без слез и не взглянешь) и просить оптимизировать код. Лучше сразу выбрать стиль програмирования и всегда придерживатся его.
На практике же в пхп чаще всего тормозят кривые запросы к бд с не эффективной структурой, запросы во "внешний мир" и регулярные выражения при работе с большими текстами, а не длинные переменные и пустые циклы.

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 12:09 21-07-2006
ElCoyote

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
N Sensey N

Цитата:
Как начнет тормозить - тогда и будешь оптимизировать

Собственно уже начало тормозить, вот поэтому и взялся за оптимизацию...
 
cwll

Цитата:
не страдай фигней в борьбе за микросекунды

Несогласен, при одном вызове страницы - это может и микросекунды, а при нескольких сотен вызовов страницы - это уже секунды, если не десятки...
 
Advanced_Guest

Цитата:
подумать про апгрейд се

Ну и как я буду думать про апгрейд, если физически сервер не находится в моем распоряжении?
 

Цитата:
можно некоторые куски написать на C++

Вот это уже толковая мысль!
 
Delphi6

Цитата:
можно оптимизировать РНР скрипт Zender оптимизатором

Что это такое? Если есть ссылка, кинь пожалуйста.
 
sTa1kEr

Цитата:
На практике же в пхп чаще всего тормозят кривые запросы к бд с не эффективной структурой, запросы во "внешний мир" и регулярные выражения при работе с большими текстами

Как с этим бороться? не с кривыми запросами, а с запросами во внешний мир?

Всего записей: 182 | Зарегистр. 07-04-2006 | Отправлено: 17:10 21-07-2006
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ElCoyote

Цитата:
Цитата:можно оптимизировать РНР скрипт Zender оптимизатором  
 
Что это такое? Если есть ссылка, кинь пожалуйста.  

Zend Products

Цитата:
Несогласен, при одном вызове страницы - это может и микросекунды, а при нескольких сотен вызовов страницы - это уже секунды, если не десятки...  

Мой тебе совет, чем высчитывать сколько там у тебя микросекунд(или может наносекунд ) каждая переменная "съедает", поставь Zend Studio (ссылку смотри выше). Там есть такая функция как Profile, с ее помощью ты сможешь оценить где и какая функция/файл/метод у тебя забирает львиную долю времени и тогда уже будешь знать в каком направлении копать.

Цитата:
Как с этим бороться? не с кривыми запросами, а с запросами во внешний мир?

А они у тебя используются? Если да, то боротся с ними можно двумя способами:
1. Отказатся от них
2. Поставить канал потолще, причем и своему серваку и тем сервакам куда запрос делаешь А в идеале, еще мне и всему инету

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 17:29 21-07-2006 | Исправлено: sTa1kEr, 17:33 21-07-2006
Advanced_Guest



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ElCoyote

Цитата:
Собственно уже начало тормозить, вот поэтому и взялся за оптимизацию...

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

Цитата:
Ну и как я буду думать про апгрейд, если физически сервер не находится в моем распоряжении?

Dedicated server- сам собираешь конфигурацию нужную тебе. сам улучшаешь и тд.
(если ты сидишь на shared хостинге, о возможно кроме тебя там куча других юзеров.. которые и тормозят его)
 

Цитата:
Как с этим бороться? не с кривыми запросами, а с запросами во внешний мир?

отказатся от них.
или сделать кеширование для них.
 
пример:
нужно получать список данных с другого сервера.
на другом сервере список обновляется раз в минуту.
 
варианты:
1. качать список при открытии страницы - плохой вариант при большом сайте.
2. качать список по расписанию раз в минуту - хороший вариант при большом сайте. плохой вариант при маленьком, редко посещаемом сайте.
 
причины:  
математика
1. в среднем данную страницу открывает 5 человек в минуту.
при 1ом варианте мы скачиваем в 5 раз больше информации  чем нужно. (да и клиент должен ждать пока ты скачаешь этот список своим скриптом)
 
2. в среднем данную страницу скачивают раз в сутки, в особенности если данную страницу только админ видет)
1ый вариант лучше - меньше нагрузка на сервер ( не надо скачивать каждую минуту)
правда опять же проблема, что страница будет открыватся чуть дольше.
 
Другой вариант оптимизации:.
у нас есть mysql таблица со страницами. таблица имеет формат: id  body
в body хранится BB коды. (аля [B] [U] и тд )
 
если у нас часто посещаемый сайт, то лишняя процессорной сила тратится на преобразование данных кодов в html коды.
Решение: создать новое поле в таблице, аля: body_html и туда пихать сразу HTML коды.
 
 
Третий вариант оптимизации:
у нас сайт - игра, и нужна таблица "100 самых лучших игроков".
можно делать так, что данная страница каждый раз запрашивается в базу данных:
select * from users order by points limit 100.
 
но если таблица users большая, то сканинг таблицы займёт долгое время (в особенности если на столбик points не стоит индексов).
Решение:  
Раз в сутки/час  запускаем по расписанию скрипт, который выбирает лучших 100 человек, и запихивает их в отдельную базу данных или в файл. Сразу же в нужном формате.
 
И таких оптимизаций возможно уйма
Причём они дадут намного сильный прирост чем изменение названий переменных и тд.
 
PS: помню был такой случай.. как раз с очками. выборка длилалсь около 1 минуты. После того как проставил индексы на нужные столбцы, по которым делалась выборка - время выборки сократилось до 2 секунд.

----------
The Abyss - UO, LA2, Ботва, BSFG

Всего записей: 2446 | Зарегистр. 14-04-2002 | Отправлено: 18:44 21-07-2006 | Исправлено: Advanced_Guest, 18:49 21-07-2006
Mira



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
передомной тоже стала задача оптимизировать сайт
вот не совсем уверен к какому решению прийти
- можно взять смарти, и на нем перепистаь
- можно работать со статическими данными, например все файлы хранить на сервере , вызывать их уже не из базы а на прямую, и второе обновлять файлы когда что-то в них изменится.

Всего записей: 1627 | Зарегистр. 25-11-2003 | Отправлено: 12:30 07-05-2007
Delphi6



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mira
Все зависит от самого сайте, наверно уже все знают мой уже старый проект с проксями, мне его 4 раза прикрывали и я 5 раз переписывал движок Если сейчас сравнить мой движок с первым вариантом то разница будет наверно в 1000 раз Дело в том что постепенно я снизил количество SQL запросов которые и являлись главное нагрузкой, а сейчас для другого сервера написал совсем новый движок по проверке проксей и там SQL вообще не используется, так у меня нагрузка процессора всего 1-2% единственно что теперь нужно так это память, так как каждый скрипт занимает 8мб памяти, плюс переписал многопоточность 3 раза за последний месяц, и последний дал КПД 80% от рабочего времени, мой старый подход по проверке количества потоков командой ps был неуклюжим да и ресурсы тратились на скрипт ядра и на запуск данной команды (так и не доходят руки обновить сайт и поставить новый движок).  
 
Я к чему все это, да к тому что надо пытается не переменные уменьшать, в этом нет смысла так как РНР сам следит за памятью и не зачищает их а просто думать где можно сэкономить в вызове цикла, или функция которая занимает много времени, как снизить количество ее вызовов. Не сочтите за рекламу но как я слышал PhpED позволяет проверить на каких частях скрипта тратится больше всего времени, а потом уже можно подумать как их разгрузить, у меня лично руки не доходят, мне пока легче лишний гиг памяти купить серверу чем оптимизировать .
 
Так что давайте ваш сайт в студию и что вы там делаете, может что-то придумаем но думаю такие вопросы решать можете только вы.

Всего записей: 2631 | Зарегистр. 06-07-2004 | Отправлено: 15:40 07-05-2007
Mira



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Я к чему все это, да к тому что надо пытается не переменные уменьшать,

простите. не совсем понял что вы хотели сказать вот этим
Цитата:
Все зависит от самого сайте, наверно уже все знают мой уже старый проект с проксями, мне его 4 раза прикрывали и я 5 раз переписывал движок  

такая же фигня, сейчас смотрю на свои старые проекты и удивляюсь как я такое мог написать, но это логично, новые знания - новое видение. Вот и теперь, когда хостер нажал на хвост, приходится думать об уменьшении нагрузки, пиходится вникать и придумывать новые идеи для того, что бы скрипты работали лучше.
 
к сожалеию я не совсем понимаю, да и хостеры не дают конктетного ответа, что же является камнем преткновения во всем этом, толи загрузка процессора, толи память толи еще что-то?! Пока собираюсь оптимизировать по времени, те логично предпологаю что и нагрузка в этом случае будет меньше.
 
Мне посоветовали делать все на статике. От всего смысла не вижу, а вот блоки, которые часто используются и "увесистые" думаю так и сделаю, если не увижу более приятную альтернативу.
 
Пока заметил , дейсвительно, как вы и говорите, грузят в основном mysql запросы, особенно счетчики, и объеденения.
 
например хочу избавиться вот от такого запроса

Код:
 
SELECT `a`.*, count(`c`.`id`) as `cnt`  
                FROM `pr_articles` as a  
                LEFT JOIN `pr_comment` as `c` ON `c`.`id_article` = `a`.`id`  
                WHERE `a`.`id_theme` = ".$category." && `a`.`active` = 1 && `a`.`s2`=1  
                GROUP BY `a`.`id`
                ORDER BY `a`.`score` DESC
 

 
вижу два способа, которые достойны внимания.
1. простой, хотя и эффективный, записывать кол-во отзывов к статье в саму статью, потом не будет JOINов и счетчиков, что снизит нагрузку. Это я знаю как делать, этот результат ясен.
2. интересней перевого потому что мысль нова, интересно реализовать, да и если будут результаты не хуже, почему бы не использовать. Смысл состоит в том, что бы этот запрос а точнее результаты вывода этого запроса сохранять в файл, а потом просто извлекать от туда результаты. Перегенеривать файл можно либо по времени , например через каждый час, либо по тому как будет добавлен коммент в бд. Думаю это делать через переменную времени модификации файла или его отсутсвия на сервере (соответсвенно).  
Например,  если добавили комментарий, я просто удаляю файл с сервера, а когда любой пользователь заходит на страницу где этот mysql запрос задействован, она просто перегенерируется на страницу и параллельно записывается в файл, откуда уже и будет браться. Либо второй вариант, проверяется время модификации файла filemtime и если оно больше заданного , перезаписываем содержимое файла.
 
Вот сейчас полтора-вожусь над этой задачей, по предварительным тестам время уже меньше, раза полтора- два. Но , это еще не все проверки которые должны быть, боюсь они тоже займут какое то время.
Да и не уверен что не нарвусь на косяки какие нибудь.
 
 
Добавлено:
пожалуйста, оцените скрипт на глюкавость и слабые места.
спасибо

Код:
 
$fn = "static_html/".$category_name.".html";
$fmt = @filemtime($fn);
if ($fmt && time()-$fmt < 60) //думаю достаточно для проверки  
{
  echo time()-$fmt; //это для меня потому не выношу отдельную переменную
  include_once $fn;
}
else
{
 
    $query = "SELECT `a`.*, count(`c`.`id`) as `cnt`  
                FROM `pr_articles` as a  
                LEFT JOIN `pr_comment` as `c` ON `c`.`id_article` = `a`.`id`  
                WHERE `a`.`id_theme` = ".$category." && `a`.`active` = 1 && `a`.`s2`=1  
                GROUP BY `a`.`id`
                ORDER BY `a`.`score` DESC";
 
  $sql->query($query);
 
  $content = "";
 
  while ($rec = $sql->getRecord())
  {
   $content .= '<tr><td valign="top">......</td></tr>'."\n";
  }
  echo $content;
  $fhandle = fopen($fn, "w");
  fwrite($fhandle, $content); //вот здесь вот возможно и нужна еще одна проверка , если в файл не записалось что бы информация отслылалась админу
  fclose($fhandle);
   
}
 
 
 

 
буду признателен за любые советы, любую критику.  
спасибо

Всего записей: 1627 | Зарегистр. 25-11-2003 | Отправлено: 10:33 08-05-2007 | Исправлено: Mira, 11:31 08-05-2007
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
По поводу оптимизации.
http://www.php.spb.ru/php/speed.html
Статья была справедлива на момент написания.
В 5 версии ПХП многие вещи исправили.
Для того, чтобы проверить старые тезисы на текущий момент, можно просто прогнать те же тесты сегодня на вашей текущей конфигурации.
Для того, чтобы найти другие узкие места, нужно замерять как быстро выполняются блоки программы. Потом их оптимизировать.

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 11:41 08-05-2007
Mira



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
afiget
спасибо. статья хорошая. отметил для себя многое.
когда то видел эту статью, уже все забыл.  
 
правда те приемы которые я раньшье до статьи правильно использовал использую и сейчас.  
 
 
блоки программы замерял. но я не знаю что считать большим значением
3.81469726563E-005
0.003497838974
и тд
те что больше  я вижу, а вот понять на сколько это критично для какого-то блока я не пока не могу.
 

Всего записей: 1627 | Зарегистр. 25-11-2003 | Отправлено: 12:08 08-05-2007
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Mira

Цитата:
например хочу избавиться вот от такого запроса

Трудно оценивать не зная структуры базы и версии MySQL.

Цитата:
... GROUP BY `a`.`id` ...

Что за поле `id`? Если это примари кей, то такая конструкция бессмысленна, т.к. примари кей и так всегда уникелен. Имхо, так же запросы типа "SELECT * FROM table GROUP BY field" - очень плохая практика, группировка подразумевает, что все поля по которым нету группировки будут вычисляемыми.  
Как эффективно расставлены индексы? Попробуй выполнить запрос "EXPLAIN SELECT ...далее весь твой запрос"

Цитата:
1. простой, хотя и эффективный, записывать кол-во отзывов к статье в саму статью, потом не будет JOINов и счетчиков, что снизит нагрузку. Это я знаю как делать, этот результат ясен.  

Все гениальное просто. А если MySQL версии 5, то идеальное всего это было бы сделать через триггеры. Т.ч. советую поступить именно так.

Цитата:
Смысл состоит в том, что бы этот запрос а точнее результаты вывода этого запроса сохранять в файл, а потом просто извлекать от туда результаты.

Имхо, не самый лучший вариант. Тут может быть выигрыш не столько в том, что данные хранятся в текстовом файле, а скорее в том, что это уже сформированный html код. Лучше проверь настройки кэширования запросов, упрости запрос и, главное, индексы.

Цитата:
$fn = "static_html/".$category_name.".html";  

Откуда берется $category_name? Если из GET-а, то нужно обязательно проверить на корректность. Кстати, в PHP 5.2 появились очень интересные функции для этого XLI. Filter Functions
 
Добавлено:
То же самое относится и к переменной $category

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 13:36 08-05-2007
Mira



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
То же самое относится и к переменной $category

эти переменные у меня хоть и получаются из GET но строго зашиты модрерайтом
 

Цитата:
Что за поле `id`? Если это примари кей, то такая конструкция бессмысленна

ну почему же , когда идет объединение то результатом вывода будет объединение  (каламбурчик) двух таблиц ,
например
id_article id_comment
1 2                  
1 3
1 4
2 5
3 6
3 7
 
результат запроса  
id cnt
1 3
2 1
3 2
 
за ссылки спасибо. с хостерами трудно зашиваться на последние версии php , mysql

Всего записей: 1627 | Зарегистр. 25-11-2003 | Отправлено: 13:50 08-05-2007
Alex770

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
А не подскажете чем отличаются одинарные кавычки от двойных? "тест" от 'тест' чем отличается и где это может пригодится?

Всего записей: 38 | Зарегистр. 01-05-2007 | Отправлено: 13:52 08-05-2007
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
эти переменные у меня хоть и получаются из GET но строго зашиты модрерайтом

Готов поспорить, что твои правила модреврайта можно обойти

Цитата:
ну почему же , когда идет объединение то результатом вывода будет объединение  (каламбурчик) двух таблиц

Да... потому я и сказал, что без структуры таблиц сложн анализировать.
Но в любом случае желательно избегать группировок со *.
Alex770
9.1.1. Strings

Цитата:
If the ANSI_QUOTES SQL mode is enabled, string literals can be quoted only within single quotes because a string quoted within double quotes is interpreted as an identifier.

Поэтому лучше использовать всегда одинарные кавычки.

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 14:31 08-05-2007 | Исправлено: sTa1kEr, 16:33 08-05-2007
Mira



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
А не подскажете чем отличаются одинарные кавычки от двойных? "тест" от 'тест' чем отличается и где это может пригодится?

разныцы в вашем случае никакой
 

Цитата:
Поэтому лучше использовать всегда одинарные кавычки.

'\r\n' не сработает ,  
 
немного уточню, по этому лучше всегда использовать то ,что надо для конктетного случая, или стараться учитывать варианты.
 

Цитата:
Готово поспорить, что твои правила модреврайта можно обойти  

обойти можно все что хочешь
не зная переменной вы не обойдете  
пример ниже
 
правило рерайта
 
RewriteRule ^articles-one/?$ /articles1234567_3234.php?peremennaya_get_s_neizvestnim_imenem=1 [L]
 
обойдите
 
Добавлено:

Код:
    $content = $content . '<tr><td width="30"><img src="/img/arr3.gif" alt="'.$rec["note"].'" width="20" height="10" border="0"></td><td><b >'.((!empty($rec['date']) && strtotime($rec['date']." +7 day ") >= mktime())?"<span style='color:red'>new </span>":"").'<a href="/'.$rec['url_latin'].'/" >'.$rec['topic'].'</a>'.
      ((!empty($rec['cnt_comments']))? '/<img src="/img/list.gif" alt="комментариев '.$rec['cnt_comments'].'" width="10" height="10" border="0">'.$rec['cnt_comments'].'/':'').
      '</b></td></tr>';
 


Код:
       
    $content =  $content . sprintf('%s%s%s%s%s%s%s%s',
    '<tr><td width="30"><img src="/img/arr3.gif" alt="',  
    $rec["note"],  
    '" width="20" height="10" border="0"></td><td><b >',  
    ((!empty($rec['date']) && strtotime($rec['date']." +7 day ") >= mktime())?"<span style='color:red'>new </span>":""),
    '<a href="/', $rec['url_latin'], '/" >',$rec['topic'],  
    '</a>' ,
    ((!empty($rec['cnt_comments']))? '/<img src="/img/list.gif" alt="комментариев '.$rec['cnt_comments'].'" width="10" height="10" border="0">'.$rec['cnt_comments'].'/':''),
      '</b></td></tr>');
 
 

 
второй код в 3и раза быстрее первого
 
спасибо за статью и мысль знакомого, проверил на практике
 
кому впадло разбираться смысл такой
sprintf('%s %s %s %s', $a, $b, $c, $d) работает быстрее чем $a.' '.$b.' '.$c.' '.$d

Всего записей: 1627 | Зарегистр. 25-11-2003 | Отправлено: 15:39 08-05-2007 | Исправлено: Mira, 15:39 08-05-2007
sTa1kEr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
\r\n' не сработает

Это не PHP.

Код:
 
SELECT 'One\r\nTwo'
 

Замечательно работает На выходе получаем (это в HEX):

Код:
 
0000000000: 4F 6E 65 0D 0A 54 77 6F
 


Цитата:
обойти можно все что хочешь

Ну с таким отношением - да, можно вообще про безопасность не думать, все равно сломают

Цитата:
не зная переменной вы не обойдете

Подбором, логически догадаться, где-то может ссылку динамическую оставили, где-то может через пост туже переменную передали, ну на форуме исходник выложили Суть не в этом, раз это возможно - значит это эксплоит. Однако проверив переменную хотя бы через регулярное выражение, уже никто не сможет сделать sql инъекцию или заинклюдить свой скрипт даже зная названия переменных.

Всего записей: 279 | Зарегистр. 28-07-2005 | Отправлено: 16:15 08-05-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » Интернет » Web-программирование » Оптимизация кода PHP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru