LINUX.ORG.RU

еще один кирпичик ненависти к php

 


0

1

php совсем печален, развращает, и наличием высокоуровневых функций учит писать неправильный код.

два цикла, делают одно и тоже, но классический for быстрее в 4 раза.

<?php

for ($i = $start; $i < $end; $i+=$step)
{
//do something with array
}

foreach (range($start, $end, $step) as $i)
{
//do something with array
}

?>

тут выкладывал постраничную навигацию, должен извиниться за свой говнокод и вкладываю исправленную версию с православным for.

хотите писать хороший быстрый код? забудьте обо всех этих читерских foreach и прочей лаже, это удел школьников недалекого ума.

<?php
$page_count = ceil(($db->querySingle('SELECT COUNT(*) FROM blog_posts') / 10));
$page_cache = '';
$page = (isset($_GET['page']))?(int) $_GET['page']:$page_count;

for ($page_id = $page_count; $page_id > 0; $page_id--) {
  if ($page == $page_id) {
    $page_cache .= ' '.$page_id;
  }
  elseif (($page_id == $page_count) || ($page_id == 1)) {
    $page_skip = 1;
    $page_cache .= ' <a href="?page='.$page_id.'">'.$page_id.'</a>';
  }
  elseif (($page < ($page_id + 2)) && ($page > ($page_id - 2))) {
    $page_skip = 1;
    $page_cache .= ' <a href="?page='.$page_id.'">'.$page_id.'</a>';
  }
  elseif ($page_skip > 0) {
    $page_skip--;
    $page_cache .= ' ...';
  }
}
echo $page_cache;
?>

<?php
$try = $db->query('
  SELECT *
  FROM blog_posts
  LIMIT '.($page * 10 - 10).', 9
  ');
?>

спасибо, извините.

★★★★★
Ответ на: комментарий от greenplastik

Ещё раз говорю, мне совершенно насрать как эта дурь объясняется, работать оно должно ожидаемым образом.

В данном случае - «проглатывается» последний элемент массива, совершенно неожиданно для того, кто на эти грабли ещё не наступал.

Конечно всё это всё можно обойти, запомнить тысячу подобных граблей, и всё равно периодически огребать подобные wtf'ки на ровном месте. Если кто-то хочет этим заниматься по доброй воле - он мазохист, без скидок.

И на это наступают ВСЕ кодеры похапэ, независимо от их «квалификации» и количества шишек на лбу. Вот совершенно недавний пример: http://www.opennet.ru/opennews/art.shtml?num=41691

anonymous
()
Ответ на: комментарий от anonymous

И на это наступают ВСЕ кодеры похапэ, независимо от их «квалификации» и количества шишек на лбу.

в других ЯП тоже много интересного. Только кода меньше, и соответственно говнокода тоже меньше. А на этом вашем пхп весь web сейчас построен, причём строили (и строят) его погромисты самой низшей квалификации.

Вот совершенно недавний пример: http://www.opennet.ru/opennews/art.shtml?num=41691

ты тоже первый месяц код пишешь на пхп? Сколько раз можно повторять, что сравнивать нужно оператором ===, а строки strcmp() ? Разве непонятно, что пхп без лишних вопросов всё сконвертит хрен знает куда? Что там четыре(sic!) лжи:

1. FALSE

2. NULL

3. "

4. intval(0)

и все они почему-то равны между собой?

emulek
()
Ответ на: комментарий от Hertz

тут «антиоптимизация»: в пхп есть foreach, который без всяких range обходит любые массивы. Но ТС не ищет лёгких путей, написал два других варианта, и оба неправильные.

emulek
()

сделал два пула

# /usr/sbin/php-fpm —fpm-config /etc/php/pool0.conf
# /usr/sbin/php-fpm —fpm-config /etc/php/pool1.conf

объеденил в один бэкенд

upstream php-fpm {
  server unix:/var/run/php-fpm/pool0.sock weight=100 max_fails=5 fail_timeout=5;
  server unix:/var/run/php-fpm/pool1.sock weight=100 max_fails=5 fail_timeout=5;
}

fastcgi_pass php-fpm;

итого ~3000 запросов. люто. :)

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от emulek

foreach, ... любые массивы

Я помню. :) Мне понравилось то, что ТС сам нихера не зная
пытается наставлять на, якобы, истинный путь других.
Spoofing, тебе лавры Луговского покоя не дают?

Hertz ★★★★★
()
Ответ на: комментарий от Spoofing

Такое чувство, как будто я только что прочитал советы девственника по поводу того, как склонить поролоновую вагину к сексу.

winlook38 ★★
()

Чаще всего скорость ограничена БД, а не PHP-прослойкой между БД и браузером пользователя. Так что пиши как хочешь, ни на что это не повлияет.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

абсолютно верно.

tmpfs вообще больше не дает никакого прироста производительности, настройки PRAGMA synchronous = OFF и PRAGMA journal_mode = MEMORY кажется только портят картину.

сейчас тюнингую настройки nginx, самого php-fpm, и получается что вся скорость упирается чисто в базу данных. придется кропотать над запросами в php коде.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от emulek

По вышеприведённому примеру тебе нечего сказать?

Сколько раз можно повторять, что сравнивать нужно оператором ===, а строки strcmp()

Эта практика не от хорошей жизни появилось, а именно от общей *банутости приведения типов. Чтобы хоть немного быть уверенным, что оно не рванёт в неожиданный момент в проде.

причём строили (и строят) его погромисты самой низшей квалификации.

Вот-вот, и язык дописывался ими же. Не проектировался, дописывался. monkey-in, monkey-out.

Остальной поток сознания не комментирую, ибо к 95% леммингов и съезжание от неудобной темы.

anonymous
()
Ответ на: 3200 от Spoofing

3700

gzip off;

это жесть, я думаю на дворе далеко не нулевые и трафик нынче не проблема. +500 запросов, стоило отключить gzip.

по поводу статики и fastcgi_cache, как я и ванговал: nginx обрабатывает 42000 запросов.

Spoofing ★★★★★
() автор топика

пришла пора написать статью и выложить конфигурацию своего сервера. на сраном пентиуме php обрабатывает 5000 ПЯТЬ МАТЬ ВАШУ ТЫСЯЧ запросов.

дайте мне Core i5 / i7 и я сделаю вам 15 тысяч запросов в секунду. :(

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

Кому нужна статья про оптимизацию сайта с 4 страницами и 0 посетителями в сутки?

winlook38 ★★
()
Ответ на: комментарий от anonymous

По вышеприведённому примеру тебе нечего сказать?

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

emulek
()
Ответ на: комментарий от anonymous

неожиданно для того, кто на эти грабли ещё не наступал
неожиданно
неожиданно
неожиданно
неожиданно

Неожиданно «@» не используют.

greenplastik
()
Ответ на: комментарий от anonymous

это неожиданное поведение

Только для нечитающих документацию:
http://ua2.php.net/manual/ru/control-structures.foreach.php

Внимание

Ссылка $value на последний элемент массива остается даже после того, как оператор foreach завершил работу. Рекомендуется уничтожить ее с помощью функции unset().

h578b1bde ★☆
()
Ответ на: комментарий от h578b1bde

Откуда вы лезете, наркоманы? Вопрос был про перебор элементов массива. Читайте по словам, если в вашу похапешную голову целая фраза не помещается. Слово «перебор», означает последовательный обход всех элементов. Заметьте, здесь ничего не говорится про «всех элементов, кроме предпоследнего, который вам подсунут дважды».

Эта операция везде действует одинаково, кроме похапе, в котором не осилили безглючную реализацию ссылок, нормальный scoping переменных, и ещё много чего.

anonymous
()
Ответ на: комментарий от anonymous

Вопрос был про перебор элементов массива. Читайте по словам, если в вашу похапешную голову целая фраза не помещается. Слово «перебор», означает последовательный обход всех элементов.

Перебирай без использования &, никто не заставляет же.

h578b1bde ★☆
()
Ответ на: комментарий от Harald

А для этого обязательно сидеть в вузике? Самостоятельно изучить вопрос никак? Или ты к тому, что ради зачета ТС однозначно озаботиться изучить вопрос или хотя бы запомнит названия?

TheKnight ★★★
()
Ответ на: комментарий от TheKnight

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

Harald ★★★★★
()

Вот это отборную херь я прочитал только что :) Тред — лютый пи#$ец, ТС — потенциальный говнокодер за доширак :) Но меня это радует. Чем больше таких дебилов, тем больше бабла у меня :)

boombick ★★★★★
()
Ответ на: комментарий от snoopcat

мм.. а я не знаю что это и как это исправляется. гуглю, прочитал википедию, но так и не понял как это можно применить на моём сайте.

или вы просто так сказали умное слово? нет, к вам претензий нет, вариантов просто масса может быть к чему вы это сказали. но в логах я увидел только один post запрос от wget'а на добавления комментария, — это обычное поведение для пользователя на сайте, но что по вашему не так?

ааааа, или типа, что комментарии должно быть разрешено добавлять только со страницы сайта, а для этого прикрутить небольшую проверку по каком-нибудь ID/токену?

Spoofing ★★★★★
() автор топика
Последнее исправление: Spoofing (всего исправлений: 1)
Ответ на: комментарий от Spoofing

ну не обязательно это может быть вгет, это может быть скрытая форма на каком-нибудь левом бложике (form name=test, action=spfng.com/blog/..., method=post, input=text,hidden: «рандомный текст») и яваскрипт form.test.Submit()

как пофиксить - каждой форме присваивать UID, генерировать анти-CSRF-токен, записывать в сессию/куки/куда угодно пару UID=CSRFTOKEN и при POST-запросе проверять

snoopcat ★★★★★
()
Ответ на: комментарий от snoopcat

а почему бы просто не ограничить отправку одного комментария не чаще раза в минуту с одного IP-адреса, и просто проверять Referer который есть во всех приличных браузерах.

так базу никто не зафлудит.

Spoofing ★★★★★
() автор топика
Ответ на: комментарий от Spoofing

пример простейшей реализации

никакие формы исправлять не нужно, просто инклюдим этот класс, в начало скрипта вставляем

$csrf = new csrf();

и перед записью в БД проверяем статус проверки:

global $csrf; // db access from another script
if($csrf && !$csrf->status) {
 //raise-some-error
}
snoopcat ★★★★★
()
Последнее исправление: snoopcat (всего исправлений: 1)

Типичное неосиляторство и биокодо-строительство господа - язык тут не причем.

Можно засесть за Си и потом сказать как можно с этим отходом работать? Что это за идиотские указатели и почему всё крэшится?

хочешь скорости - избегай циклов: xml+xslt в помощь

anonymous
()
Ответ на: комментарий от Spoofing

Кому вообщее нужная твоя статья про колхозный highload? :D

dormeur86 ★★★★
()
Ответ на: fastcgi_cache — альтернатива op-cache от Spoofing

fastcgi_cache — альтернатива op-cache

Убило просто. Это не альтернатива совершенно, их есть смысл юзать одновременно.

xtraeft ★★☆☆
()
Ответ на: 3700 от Spoofing

это жесть, я думаю на дворе далеко не нулевые и трафик нынче не проблема. +500 запросов, стоило отключить gzip.

Не, ты издеваешься похоже. Нельзя быть настолько тугим.

xtraeft ★★☆☆
()
Ответ на: комментарий от xtraeft

Оно на каждой итерации цикла count($p) что ли делает?

Да, делает. Операция count($p) должна работать за O(1). И она работает за O(1), правда тратится лишнее время на вызов функции, но не критичное.

Проблема появляется, если $p - ссылка на массив. В таком случае оно (схренабы?) работает за O(n). Т.е. сложность получается квадратичной и вместо прохода по 5*10^4 элементам получается проход по 25*10^8 элементам.

А вот если использовать не ссылку, а полное копирование массива (убрать & из аргументов функции), то всё будет работать быстро.

Tanger ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.