Советы по написанию php скриптов

Статус
Закрыто для дальнейших ответов.

Gairon

Новичок
Регистрация
07.05.2005
Сообщения
4
Хотелось бы услышать ваши советы/мнения/рекомендации по написанию и оптимизации кода.

Просто для затравки.
При написании циклов код:
Код:
for($i;$i<10;$i++)
{<тело>}
работает медленне чем код:
Код:
$i=0;
for(;$i<10;$i++)
{<тело>}
проверено: на малых числах итераций разница заметна, на больших не существенна.

Так же интерена следующая штука: как удобнее на ваш взгляд писать - все функции разбивать на отдельные файлы php (например вывод страницы просмотра - один файл, вывод страницы редактирования второй файл), или все держать в одном большом файле и для разных действий передавать в скрипт разные команды (типа - ?action=view и ?action=edit)?
 

~FisHBonE~

Well-Known Member
Регистрация
23.05.2005
Сообщения
136
По поводу первого... Любое объявление переменной требует времени, отсюда и выигрыш в скорости первого варианта :)

Еще:
Такой код работает быстрее
Код:
echo "hello".$name."welcome";
Чем вот этот:
Код:
echo "Hello $name welcome";
p.s. Считаю, что функции, выводящие что-либо на экран, должны содержаться в отдельных файлах (т.к.дизайнер зашьется оформлять большой файл с выводом). А служебные функции (вроде взаимодействия с БД) можно положить в один большой файл, тогда не будет путаницы с файлами :)
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Очень интересная тема.
1) Лучше тогда не
Код:
echo "hello ".$name." welcome";
а

Код:
echo 'Hello '.$name.' welcome';
т.к. кавычки(") при парсинге просматриваются на наличие переменных, а апостроф(') нет.

2) Цикл for куда быстрее чем while во всех отношениях.

3) Регулярные выражения нужно использовать на основе PCRE, а не POSIX. Кто не знает использовать не ereg****, а preg_*****.

4) Например в цикле

Код:
for($i=0;$i<count($a);$i++){***}
не стоит использовать ф-ию count($a), лучше инициализировать переменную.

Код:
$count=count($a);
for($i=0;$i<$count;$i++){***}
Так скажем для затравки:)
P.S. одно обидно, что приходится компактностью кода жертвовать скорости:(
 

~FisHBonE~

Well-Known Member
Регистрация
23.05.2005
Сообщения
136
Creator сказал(а):
3) Регулярные выражения нужно использовать на основе PCRE, а не POSIX. Кто не знает использовать не ereg****, а preg_*****.
Это не всегда так... В сложных и больших рег. выражениях POSIX иногда гораздо шустрее. Но если требуется небольшая проверка, тогда конечно PCRE.
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
2~FisHBonE~
Это не всегда так... В сложных и больших рег. выражениях POSIX иногда гораздо шустрее. Но если требуется небольшая проверка, тогда конечно PCRE.
А вот тут я не согласен, как раз в больших регулярных выражений вся мощь основанная на PCRE выходит в отрыв от POSIX в разы. Есть только 1 нюанс, что если патэрн не находится в строке, то тут выигрывает уже POSIX.
 

DnAp

self::setDebugMode(true);
Регистрация
30.04.2005
Сообщения
490
Когда то сам так экономил потом понял что экономия на спичках иногда выходит боком...
Код становиться менее разборчивым...

Допустим mysql_fetch_row пашет намного быстрее чем mysql_fetch_assoc но сами подумайте в серьезном проекте запутаешся, а в маленьком смысла нету экономить кому нужна эта n-ная сек.(не знаю на сколько быстрей работает)

Щас уже перестал экономить память...
Но желание есть!
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Цикл "foreach" является гораздо медленнее циклов "for" и "while".

P.S. Необходимо прощупать грань между необходимой читабельностью кода и скоростью работы программы. Понятно, что можно на 1 милисекунду ускорить работу, но заплатить цену нелогичности действия или же просто непонятности совершенного действия. Решать вам...
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Всегда проверять параметры передаваемые из адресной строки. Т.е. не надеяться только на верные получаемые значения. Например, "id" какой-нить новости... подразумевается, что "id" это число и оно без проверок ищется в БД.. А если хаЦкер воспользуется этим аспектом в своих целях? Например, можно сделать sql-инъекцию, правда, если знаешь какие в БД таблицы. Это все достаточно реально. Так что вывод 1! Всегда проверяем эти параметры. Можно даже просто устанавливать определенный тип переменной, например integer... мы от многих проблем избавимся.
 

v0rbis

selfcoded
Регистрация
02.05.2005
Сообщения
923
кто все еще не знал о том, что чтение файла посредством file() быстрее, чем с++ подобный fopen() ??
----------------
$file=fopen("file.txt","r");
while($buf[]=fgets($file,filesize));
fclose($file);

медленнее (и так видно) чем:

$buf=file("file.txt");
 

v0rbis

selfcoded
Регистрация
02.05.2005
Сообщения
923
Creator сказал(а):
2~FisHBonE~
Это не всегда так... В сложных и больших рег. выражениях POSIX иногда гораздо шустрее. Но если требуется небольшая проверка, тогда конечно PCRE.
А вот тут я не согласен, как раз в больших регулярных выражений вся мощь основанная на PCRE выходит в отрыв от POSIX в разы. Есть только 1 нюанс, что если патэрн не находится в строке, то тут выигрывает уже POSIX.
[post="898"][/post]​
НО! .... попробуйте:

eregi("([a-z_-]+@([a-z][a-z-]*\.)+([a-z]{2}|com|ru|kz))",$text,$ret);
echo $ret[1]

и

preg_match("/([a-z_-]+@([a-z][a-z-]*\.)+([a-z]{2}|com|ru|kz)/im",$text,$ret); echo $ret[1];

(поиск мыла в файле метров так 20-40)

тут перловый регуляр ЯВНО в минусе :)
 

OzZy

Member
Регистрация
01.11.2005
Сообщения
12
ИМХО в наше время быстрых процессоров и большого объёма ОЗУ особой необходимости в оптимизации скриптов нет...
Я действую по такому принципу: читаемость кода и по возможности ровная работа скриптов. Остальное - это дело личного вкуса и стиля... :blush:
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
ИМХО в наше время быстрых процессоров и большого объёма ОЗУ особой необходимости в оптимизации скриптов нет...
Я действую по такому принципу: читаемость кода и по возможности ровная работа скриптов. Остальное - это дело личного вкуса и стиля...
Не совсем согласен... должен быть выработан "правильный подход" к программированию
Т.е. знать конструкции, которые медленно работают или работают не совсем так как надо (например, совершают лишние действия). А на основе этого создать свой стиль прогерства. Так же надо понимать, как работает тот или иной участок... и на основе этого использовать подходящий подход.

Я уже писал про то, что в циклах НИКОГДА не указываем ф-ии "подсчета", т.е.

Код:
for($i=0;$i<count($array);$i++){ ... }
надо выносить в переменную, так как подсчет происходит каждый оборот:

Код:
$count=sizeof($array); 
for($i=0;$i<$count;$i++){ ... }
Я однажды столкнулся с интересной фичей...

Код:
for($i=0;$i<substr_count($str,$search);$i++){ //обработка }
При большом кол-ве вхождений строка перестала обрабатываться :( Долго думал, в чем у меня ошибка, но ее НЕ было! Я ломал мозг...и потом просто занялся оптимизацией кода... и все стало тип топ после:

Код:
$count=substr_count($str,$search);
for($i=0;$i<$count;$i++){ //обработка }
После этой фишки я привел себе это правило и все супер:)
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Вчера мною была найдена интересная "фишка":

Код:
if('dfgdfg'!=0) echo 1;
else echo 0;
Можно предположить, и весьма обосновано, что появится 1, НО!!! предположение неверно! Будет 0!!!

Я был немного в шоке, когда:

Код:
if('dfgdfg'!=1) echo 1;
else echo 0;
выдало 1!

Нет ну ладно, что при неидентичном сравнении 0 выполняет роль FALSE, однако не в этом случае...
Конструкция идентичного сравнения (===) тоже не спасет, будет стабильно 1, т.е. тип не будет совпадать...

Решение:

Код:
if('dfgdfg'!='0') echo 1;
else echo 0;
Получаем "правильный" 0 ... Однако я долго не мог успокоиться, почему так оно происходит, пытался найти более элегантное решение этой проблемы, но так и не нашел:(((
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
Однажды я заметил следующее...

Код:
echo date('d.m.Y h:i',mktime(0,0,0,09,08,2005));
// Получаем 30.11.2004 12:00 вместо 08.09.2005

echo date('d.m.Y h:i',mktime(0,0,0,07,07,2005));
// Получаем 07.07.2005 12:00 - все верно
Почему это происходит? А причиной всему являются корни от C, т.е. подсчет ведется в восьмеричной системе счисления.

Вывод: пишем без ведущих 0, т.е. mktime(0,0,0,9,8,2005)
 

medwoodu

Злобный модер
Регистрация
22.12.2005
Сообщения
1 418
Вчера мною была найдена интересная "фишка":

Код:
if('dfgdfg'!=0) echo 1;
else echo 0;
Можно предположить, и весьма обосновано, что появится 1, НО!!! предположение неверно! Будет 0!!!

Я был немного в шоке, когда:

Код:
if('dfgdfg'!=1) echo 1;
else echo 0;
выдало 1!

Нет ну ладно, что при неидентичном сравнении 0 выполняет роль FALSE, однако не в этом случае...
Конструкция идентичного сравнения (===) тоже не спасет, будет стабильно 1, т.е. тип не будет совпадать...

Решение:

Код:
if('dfgdfg'!='0') echo 1;
else echo 0;
Получаем "правильный" 0 ... Однако я долго не мог успокоиться, почему так оно происходит, пытался найти более элегантное решение этой проблемы, но так и не нашел:(((
Уважаемый, эта фишка далеко не нова, я бы посоветовал прочесть книгу PHP5 Котерова, элементарное решение ставить не == а === что является так же сравнением с учетом типов, НО если вы передаете строку, то <?php print ("0"===0)?"верно":"не верно";?> в результате не верно
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
элементарное решение ставить не == а === что является так же сравнением с учетом типов, НО если вы передаете строку, то <?php print ("0"===0)?"верно":"не верно";?> в результате не верно
Если вы внимательно читали, то я уже писал:

Конструкция идентичного сравнения (===) тоже не спасет, будет стабильно 1, т.е. тип не будет совпадать...
Ладно, покажу на примере:

Код:
if('0'!==0) echo 1; 
else echo 0;
Будет 1 и это неверное положение. Потому для меня был самый оптимальный вариант использовать конструнцию сравнения вместо идентичности, но вручную приравнивая к единому типу.

Код:
if('0'!='0') echo 1; 
else echo 0;
Уважаемый, эта фишка далеко не нова, я бы посоветовал прочесть книгу PHP5 Котерова
Советую не книги читать, а мануалы;)

P.S. PHP4 самоучитель Котерова - это была моя 1-я книга по программированию (в частности на PHP). Мне она понравилась.
Есть у нас в библиотеке!
 

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
В общем здесь советы по написания - а не оптимизации. Значит моно добавить:

1) Всегда делать отступы (Как вариант, 4 пробела)
2) Писать в едином стиле
3) Комментарии к функциям и сложным блокам кода

Кстати, помоему:

echo "I Love $name";
Быстрее чем:
echo "I Love".$name;
И
echo "I Love {$name}";
 

Creator

Administrator
Команда форума
Регистрация
03.03.2005
Сообщения
1 745
echo "I Love $name";
Быстрее чем:
echo "I Love".$name;
И
echo "I Love {$name}";
Вот запись 'I Love'.$name; будет однозначно быстрее всех выше перечисленных, т.к. то что в <"> проверяется на наличие вложенных переменных, т.е. выполняет 2 действия (вывод и поиск) => некоторая задержка относительно <'>.
 

RUSH

Читер
Регистрация
26.01.2006
Сообщения
230
Ну, так значит так. А вообще надо бы засечь... Просто я это вычитал, а не придумал...
 

R1S

Well-Known Member
Регистрация
11.01.2006
Сообщения
160
Гм...и почему такая тема стала угасать. Вот хотелось бы узнать признаки так называемого "плохого стиля" то , что лучше вообще не использовать. Например в обычном(не сетевом) программировании таким признаком является использование безусловного перехода "goto" итд итп. Что-то новое применительно к сетевому есть?
 
Статус
Закрыто для дальнейших ответов.
Верх Низ