Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Библиотека самых бесполезных кусков кода, или как не стоит писать на РНР 
:(
    Опции темы
bars80080
Дата 25.9.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: нет
Всего: 315



свежачок
PM MAIL WWW   Вверх
overmet
Дата 18.8.2010, 23:57 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 83
Регистрация: 15.8.2009
Где: Gomel

Репутация: нет
Всего: -2



Код

Если метод может быть статическим, объявляйте его статическим.

echo быстрее, чем print.

Передавайте в echo несколько параметров, вместо того, чтобы использовать конкатенацию строк.

Устанавливайте максимальное количество проходов ваших циклов for до цикла, а не во время его выполнения.

Удаляйте свои переменные для освобождения памяти, тем более, если это большие массивы.

Остерегайтесь магических методов, таких как __set, __get, __autoload.

require_once дорого обходится.

Указывайте полные пути в конструкциях include/require, меньше времени будет тратится на поиск файла.

Если вам необходимо определить время, когда скрипт был запущен, используйте $_SERVER[’REQUEST_TIME’] вместо time().

Старайтесь использовать strncasecmp, strpbrk и stripos вместо регулярных выражений.


str_replace быстрее, чем preg_replace, но strtr быстрее, чем str_replace.

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

Лучше выбирать утверждения при помощи конструкции else if, чем использовать несколько конструкций if.

Подавление ошибок при использовании @ работает очень медленно.

Используйте модуль Apache mod_deflate.

Закрывайте свои соединения с БД, когда закончите работать с ними.

$row['id'] в семь раз быстрее, чем $row[id].

Сообщения об ошибках дорого стоят

Не используйте функции внутри условия цикла for, например как здесь: for ($x=0; $x < count($array); $x). В данном случае функция count() будет вызываться с каждым проходом цикла.

Инкремент локальной переменной в методе - самый быстрый. Почти также работает инкремент локальной переменной в функции.

Инкремент глобальной переменной в два раза медленее, чем локальной.

Инкремент свойства объекта (т.е. $this->prop++) в три раза медленнее, чем локальной переменной.

Инкремент неопределённой переменной в 9-10 раз медленнее, чем заранее инициализированной.

Объявление глобальной переменной, без использования её в функции, также замедляет работу (примерно на ту же величину, что и инкремент локальной переменной). Вероятно, PHP осуществляет проверку на существование переменной.

Скорость вызов метода, судя по всему, не зависит от количества методов, определённых в классе. Я добавил 10 методов в тестовый класс (до и после тестового метода), без изменения производительности.

Методы в производных классах работают быстрее, чем они же, определённые в базовом классе.

Вызов функции с одним параметром и пустым телом функции в среднем равняется 7-8 инкрементам локальной переменной ($localvar++). Вызов похожего метода, разумеется, около 15 инкрементов.

Ваши строки, определённые при помощи ', а не ", будут интерпретироваться чуть быстрее, т.к. PHP ищет переменные внутри "..", но не '...'. Конечно, вы можете использовать это только тогда, когда в вашей строке нет переменных.

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

PHP-скрипты будут обрабатываться, как минимум, в 2-10 раз медленнее, чем статические HTML-страницы. Попробуйте использовать больше статических HTML-страниц и меньше скриптов.

Ваши PHP-скрипты перекомпилируются каждый раз, если скрипты не кэшируются. Кэширование скриптов обычно увеличивает производительность на 25-100% за счёт удаления времени на компиляцию.

Кэшируйте, насколько это возможно. Используйте memcached — это высокопроизводительная система кэширования объектов в памяти, которая повышает скорость динамических веб-приложений за счёт облегчения загрузки БД. Кэшированный микрокод полезен тем, что позволяет вашему скрипту не компилироваться снова для каждого запроса.

При работе со строками, когда вам понадобится убедиться в том, что строка определённой длины, вы, разумеется, захотите использовать функцию strlen(). Эта функция работает очень быстро, ведь она не выполняет каких-либо вычислений, а лишь возвращает уже известную длину строки, доступную в zval-структуре (внутренняя структура C, используемая при работе с переменными в PHP). Однако потому, что strlen() — функция, она будет работать медленно за счёт вызова некоторых операций, таких как приведение строки в нижний регистр и поиска в хэш-таблице, только после которых будут выполнены основные действия функции. В некоторых случаях вы сможете ускорить свой код за счёт использования хитрости с isset().
Было: if (strlen($foo) < 5) { echo "Foo is too short"; }
Стало: if (!isset($foo{5})) { echo "Foo is too short"; }
Вызов isset() быстрее, чем strlen() потому, что, в отличие от strlen(), isset() - не функция, а языковая конструкция. За счёт этого isset() не имеет практически никаких накладных расходов на определение длины строки.

Инкремент или декремент переменной при помощи $i++ происходит немного медленнее, чем ++$i. Это особая специфика PHP, и не нужно таким образом модифицировать свой C и Java-код думая, что он будет работать быстрее, этого не произойдёт. ++$i будет быстрее в PHP потому, что вместо четырёх команд, как в случае с $i++, вам понадобится только три. Пост-инкремент обычно используется при создании временных переменных, которые затем увеличиваются. В то время, как пре-инкремент увеличивает значение оригинальной переменной. Это один из способов оптимизации PHP-кода в байт-код утилитой Zend Optimizer. Тем не менее, это хорошая идея, поскольку не все байткод-оптимизаторы оптимизируют это, также остаётся немало скриптов, работающих без оптимизации в байткод.

Не всё должно быть ООП, часто это излишне, поскольку каждый метод и объект занимает много памяти.

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

Не слишком разбивайте методы. Думайте, что вы действительно будете повторно использовать.

Вы всегда можете разбить код на методы позже, по необходимости.

Используйте бесчисленное количество предопределённых функций.

Если в вашем коде есть функции, выполняющиеся очень долго, обдумайте их написание на C в виде расширения

Профилируйте свой код. Профилирование покажет вам, как много времени выполняются части вашего кода.

mod_gzip — модуль Apache, который позволяет сжимать ваши данные на лету и может уменьшить объем передаваемых данных до 80%.

советы

Код

<?php

$lang = $_GET['lang'];
if (!$lang) {
    $lang = $_REQUEST['lang'];
}
if (!$lang) {
    $lang = 'en';
}
setcookie('lang', $lang);

?>



Это сообщение отредактировал(а) overmet - 19.8.2010, 00:01
PM MAIL WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
SneG0K
Дата 5.2.2011, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Max Mara
***


Профиль
Группа: Завсегдатай
Сообщений: 1887
Регистрация: 1.12.2007
Где: Wis Dells

Репутация: нет
Всего: 54



nerezus, у тебя хоть отступы есть  smile 
PM WWW Skype   Вверх
Muerto
Дата 11.2.2011, 12:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1207
Регистрация: 23.9.2006

Репутация: нет
Всего: 4



Цитата(nerezus @ 25.9.2009,  23:24)
Отсюда: http://forum.vingrad.ru/forum/topic-274389.html

Код

$ishod=explode ("-", $stroka);
    $size_kupon=sizeof ($ishod);

    for ($i=0; $i<$size_kupon; $i++) {
        $size_ishod [$i]=strlen ($ishod[$i]);
    }

    for ($z0=0; $z0<$size_ishod [0]; $z0++) {
        $ish[0] = substr($ishod[0], $z0, 1);
        for ($z1=0; $z1<$size_ishod [1]; $z1++) {
            $ish[1] = substr($ishod[1], $z1, 1);
            for ($z2=0; $z2<$size_ishod [2]; $z2++) {
                $ish[2] = substr($ishod[2], $z2, 1);
                for ($z3=0; $z3<$size_ishod [3]; $z3++) {
                    $ish[3] = substr($ishod[3], $z3, 1);
                    for ($z4=0; $z4<$size_ishod [4]; $z4++) {
                        $ish[4] = substr($ishod[4], $z4, 1);
                        for ($z5=0; $z5<$size_ishod [5]; $z5++) {
                            $ish[5] = substr($ishod[5], $z5, 1);
                            for ($z6=0; $z6<$size_ishod [6]; $z6++) {
                                $ish[6] = substr($ishod[6], $z6, 1);
                                for ($z7=0; $z7<$size_ishod [7]; $z7++) {
                                    $ish[7] = substr($ishod[7], $z7, 1);
                                    for ($z8=0; $z8<$size_ishod [8]; $z8++) {
                                        $ish[8] = substr($ishod[8], $z8, 1);
                                        for ($z9=0; $z9<$size_ishod [9]; $z9++) {
                                            $ish[9] = substr($ishod[9], $z9, 1);
                                            for ($z10=0; $z10<$size_ishod [10]; $z10++) {
                                                $ish[10] = substr($ishod[10], $z10, 1);
                                                for ($z11=0; $z11<$size_ishod [11]; $z11++) {
                                                    $ish[11] = substr($ishod[11], $z11, 1);
                                                    for ($z12=0; $z12<$size_ishod [12]; $z12++) {
                                                        $ish[12] = substr($ishod[12], $z12, 1);
                                                        for ($z13=0; $z13<$size_ishod [13]; $z13++) {
                                                            $ish[13] = substr($ishod[13], $z13, 1);
                                                            for ($z14=0; $z14<$size_ishod [14]; $z14++) {
                                                                $ish[14] = substr($ishod[14], $z14, 1);

                                                                                                                    
                                                                $new_stroka="";
                                                                for ($i=0; $i<15; $i++) {
                                                                    $new_stroka.=$ish[$i];
                                                                }
                                                            }
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }

Нам похожее в универе задавали...
на скок помню когда писал подобное на Java циклов понадобилось не более двух (кажется вообще один)


--------------------
user posted image
PM MAIL   Вверх
smartov
Дата 11.2.2011, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



Muerto, а что вообще эта конструкция делает? (а то лень разбираться)
PM MAIL   Вверх
N_Ghost
Дата 28.3.2011, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.6.2008

Репутация: нет
Всего: нет



Код

<?
// Вывод ближайших праздников на неделю вперед, праздник, страна
// По ходу считаем дни :)
    $arr = array();
    for($i=0; $i<7; $i++){
        $tmp            = array();
        $Date            = time() + ($i * 86400);
        $tmp['Date']    = $Date;
        $tmp['Day']        = date("d", $Date);
        $tmp['Month']    = date("m", $Date);
        $tmp['Year']    = date("Y", $Date);                
        $arr[$i]        = $tmp;
    }

// Выбираем день и месяц
    foreach( $arr as $key ){
        $New = mysql_query("SELECT * FROM `party` WHERE `day`='{$key['Day']}' && `month`='{$key['Month']}'");
        if(mysql_num_rows($New) > 0)
        {
            while ($row = mysql_fetch_array($New))
            {
                echo "<div class='party'>   <h1>".$key['Day'].'.'.$key['Month'].'.'.$key['Year']."</h1>  ";
            
                $P_Cont = $row['cid'];
                // Выбираем флаг страны
                $Cont_Q = mysql_query("SELECT * FROM flags WHERE `id`='$P_Cont'");
                $rowCont = mysql_fetch_array($Cont_Q);
                $P_Pic = $rowCont['pic'];
                $FlagName = $rowCont[$lang];
            }
            
        }
    }    
    
?>


Подкинули мне интересный проектик, малость поправить и дополнить. То что дизайнер его верстал похоже сразу в фотошопе, я особо не удивился. Но когда полез в код, и нашел там такой веселый кусок, пол часа ржали всем отделом smile
PM MAIL   Вверх
KLeonid
Дата 30.3.2011, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entropy
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 5.7.2007
Где: Shpongleland

Репутация: нет
Всего: 1



А тема то хорошая! Вот только действительно, комментировать нужно код, иначе новички могут не понять над чем смеяться smile.
Никогда не считал себя хорошим кодером, я скорее инженер, но даже на php4 таких глупостей как в теме себе не позволял. А глупостей я насмотрелся, когда переписывал оскоммерс smile.

N_Ghost, да код забавный... автор видимо не умеет пользоваться LEFT JOIN, или в упор не знает, что можно делать выборку из нескольких таблиц одним запросом smile.
А уж как переменные плодить любит! smile 
Вообще, логика этого кода малопонятна smile. Можно было сделать так:

Код

  for($i=0; $i<7; $i++){
    $Date = time() + ($i * 86400);
    $pq = mysql_query("SELECT * FROM party p LEFT JOIN flags f ON  p.cid = f.id WHERE p.day = '". date("d", $Date) ."' AND p.month = '". date("m", $Date) ."'");
     if($pq && mysql_num_rows($pq) > 0)
     {
        while ($row = mysql_fetch_array($pq))
        {
           echo "<div class='party'><h1>$row['day'].$row['month'].date('Y', $Date)</h1>";
/*А тут что-то сделать с 
           $P_Pic = $row['pic'];
           $FlagName = $row[$lang];
не зря же их тянули :)
*/
         }
      }
  }


Но от этого код становится лишь немного лучше... а логика все так же дубова smile

Это сообщение отредактировал(а) KLeonid - 30.3.2011, 20:30
PM MAIL   Вверх
N_Ghost
Дата 6.4.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.6.2008

Репутация: нет
Всего: нет



Забыл добавить что сама дата храниться в базе в трех int полях, как, день, месяц, год. Там видимо программисту не то что LEFT JOIN, а даже стандартные типы данных не известны smile
Еще убила таблица пользователей, UserID, по которому выбираються пользователи, это var_char, содержащий md5 микротайма. А вот пароль храниться в открытом виде, в текстовом поле. 
Такой логики, как не пытался, понять не смог.
PM MAIL   Вверх
KLeonid
Дата 6.4.2011, 21:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Entropy
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 5.7.2007
Где: Shpongleland

Репутация: нет
Всего: 1



А ее там и нет smile. Просто многие считают себя программистами по недоразумению. Если бы они обладали достаточным воображением и могли провести аналогию своей работы, например, с постройкой автомобиля, поняв, что сами ездить на нем они ну совсем не захотели бы (ибо стремно, своя шкура все таки), скорее всего бросили бы это дело или начали совершенствоваться. Впрочем, большинству ###кодеров на это совершенно наплевать. Это их хлеб и у них есть своя потребительская аудитория... впрочем сочувствовать ей я не собираюсь, т.к. достаточно знаком с ней, и в большинстве случаев эти заказчики в последствии платятся за свою жадность smile .
PM MAIL   Вверх
N_Ghost
Дата 25.5.2011, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.6.2008

Репутация: нет
Всего: нет



Есть много способов проверить что переменная существует, или содержит нужное значение.
Но такого извращенного способа еще не встречал smile
Код

function edit($id){

$id = $id+0;

//..... все равно идем в базу за нужным номером :)

}

PM MAIL   Вверх
smartov
Дата 25.5.2011, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 2
Всего: 259



А чего. Отсроумно smile
PM MAIL   Вверх
srt
Дата 9.6.2011, 12:34 (ссылка)    | (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 65
Регистрация: 13.5.2008

Репутация: нет
Всего: 1



самый быстрый способ избавиться от sql injection
никаких регулярок и прочей лобуды
PM MAIL   Вверх
N_Ghost
Дата 2.7.2011, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 18.6.2008

Репутация: нет
Всего: нет



Продолжу тему веселых запросов. Нужно узнать, есть ли транспорт из страны, и в страну. Всего 94 страны, 189 запросов в базу, только для того что бы показать есть ли что то из этой страны, и в эту страну.

Код

$qCountry = mysql_query("SELECT * FROM `country`");
   while($rowCountry = mysql_fetch_array($qCountry)){

      $qFrom = mysql_query("SELECT * FROM `transport` WHILE `From_Country`=$rowCountry['id']");
         if (mysql_num_rows($qFrom) > 0){
            $country[$rowCountry['id']]['from'] = 'yes';
         }else{
            $country[$rowCountry['id']]['from'] = 'no';
         }

      $qTo = mysql_query("SELECT * FROM `transport` WHILE `To_Country`=$rowCountry['id']");
         if (mysql_num_rows($qTo) > 0){
            $country[$rowCountry['id']]['to'] = 'yes';
         }else{
            $country[$rowCountry['id']]['to'] = 'no';
         }

   }


Это сообщение отредактировал(а) N_Ghost - 2.7.2011, 13:07
PM MAIL   Вверх
MoLeX
Дата 4.7.2011, 05:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Местный пингвин
****


Профиль
Группа: Модератор
Сообщений: 4076
Регистрация: 17.5.2007

Репутация: нет
Всего: 140



мда. очень интересно использовать цикл в запросе.


--------------------
Amazing  smile 
PM MAIL WWW ICQ   Вверх
FlameTH
Дата 21.2.2014, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 13.7.2007

Репутация: нет
Всего: нет



как вам такое?
Код

$serial = str_replace('-','',substr(date('Y-m-d'),-5));

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Избранное | Следующая тема »


 




[ Время генерации скрипта: 0.1883 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.