Отправляет email-рассылки с помощью сервиса Sendsay

Все о PHP и даже больше

  Все выпуски  

Все о PHP и даже больше #19


Информационный Канал Subscribe.Ru

Все о PHP и даже больше...

.:: Путь от начинающего до эксперта ::.

# 19
15/2003

7 декабря 2003г.

Проект сайта GreatWeb.RU

Ведущий рассылки: Бабушкин Евгений


  Полезные ссылки:

  • Лучший хостинг
  • Раскрутка
  • Советы Web-мастеру
  • Книги по программировании
  • WEB-браузеры
  • Миры PhotoShop
  • Скрипты
  • Лучшие Рассылки
  • Партнерская программа
  • Взлом и Защита

  • Привет программер!

    :.:: Наши проекты:

     

    GreatWeb.Ru - Портал продвинутых юзеров. Только здесь все о веб-дизайне, раскрутке, выбору хостинга и не только...
    Читайте здесь последние новости интернета!

    Films.GreatWeb.Ru - Огромный каталог фильмов, содержащий самые популярные и известные фильмы! + в каталоге есть короткая рецензия на каждый фильм! Каталог обновляется каждую неделю в конце недели.

    Форум продвинутых юзеров. Отличный форум! Задавайте абсолютно любые вопросы, вам обязательно ответят и помогут решить Ваши проблемы.
    Самым активным пользователям будет выделен красивый почтовый ящик на 5 mb. Ваше_имя@greatweb.ru

    Лучший хостинг - Лучший выпуск на мой взгляд! GreatWeb.Ru – лежит конечно же на нем :) Цены самые низкие. Можно платить только за то за что ты хочешь! Например, если тебе не нужен PERL, ты переговариваешь с админом, он может снизить тебе цену или добавить места на диске!!! Всем советую!


    :.:: Новости GreatWeb.Ru:



    Наш портал становится все более и более популярным! Посещаемость растет и качество наших работ увеличивается. Сейчас на GreatWeb.Ru сосредоточена огромная коллекция статей и новостей из различных областей! Сейчас планируется открытие каталога фильмов, он ожидается быть одним из самых больших в рунете!

    Совсем скоро выйдет всовершенно новый GreatWeb.Ru! Это новый дизайн + очень крутой движок + софт-каталог, конечно же, написанный мной :)


    Если Вы хотите опубликовать свою рекламу в этой рассылке, пишите на admin@greatweb.ru с
    темой: "Реклама в рассылке Все о PHP и даже больше".

    С этого момента все выпуски нашей рассылки будут уникальными!
    Это будут выкладки из разных форумов или лично мои статьи и примочки!

    .:: Склонение русских слов после порядковых числительных



    // Функция предназначена для вывода численных результатов с учетом
    // склонения слов, например: "1 ответ", "2 ответа", "13 ответов" и т.д.
    // $int — целое число.
    // $expressions — массив, например: array("ответ", "ответа", "ответов")


    function declension($int, $expressions)
    {
        settype($int, "integer");
        $count = $int % 100;
        if ($count >= 5 && $count <= 20) {
            $result = $int." ".$expressions['2'];
        } else {
            $count = $count % 10;
            if ($count == 1) {
                $result = $int." ".$expressions['0'];
            } elseif ($count >= 2 && $count <= 4) {
                $result = $int." ".$expressions['1'];
            } else {
                $result = $int." ".$expressions['2'];
            }
        }
        return $result;
    }

    Пример использования:


    echo declension(4, array("ответ", "ответа", "ответов"));
    // выведет "4 ответа"

    Отличная функция. Хотя и совсем простенькая :)
    .:: Функция проверяет хороший это пароль или нет



    <?php
    /*
    * bool CheckPass(string password)
    * TRUE - Пароль прошёл проверку
    * FALSE - Не прошёл
    */
    function CheckPass($p) {
        $p=trim($p);
        $len=strlen($p);
        $chars='1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM';

        if($len < 6) return FALSE;
        if(strpos($chars, $p) !== false) return FALSE;
        if($len/2 == round($len/2)) {
            $p1=substr($p,0,$len/2);
            $p2=substr($p,$len/2);
            $p22='';
            for($i=strlen($p2)-1; $i>=0; $i--)
                $p22.=$p2[$i];
            if($p1 == $p2 and strpos($chars, $p1) and strpos($chars, $p2)) return FALSE;
            if($p1 == $p22 and strpos($chars, $p1) and strpos($chars, $p2)) return FALSE;
        }

        $chars=array();
        for($i=0; $i<$len; $i++) {
            if(isSet($chars[$p[$i]]))
                $chars[$p[$i]]++;
            else
                $chars[$p[$i]]=1;
        }
        // Считаем процент уникальности символов
        $k=sizeof($chars) / $len * 100;
        if($k < 46) return FALSE;

        return TRUE;
    }

    Пароли которые функция считает плохими:
    1. Длинна < 6 символов
    2. Последовательность символов как на клавиатуре (123456, qwerty)
    3. Повторные комбинации последовательности символов (werwer, 12341234)
    4. "Отражённые" последовательности символов (123321, qweewq)
    5. Процент уникальности символов меньше 46 (wwwfff, 000000)

    -------------------------------------------------
    Еще одна полезная функция, выуженная из простор интернета.

    Хотите дополнительной инфы по этой теме? тогда вам сюда.

     
    .:: Профайлер для скриптов на PHP

     

    Очень нужная функция для хороших программистов! Она выявляет тормозящие места в скрипте, т.е. профайлер. Для работы этой функции необходим включенный php_dbg.dll. Забирайте, пока дают :)

    <?
    function dbg_profile($dbg_prof_results = false)
    {
       if (!$dbg_prof_results) dbg_get_profiler_results(&$dbg_prof_results);

       $ctx_cache = array();
       $contexts = array();
       foreach ($dbg_prof_results["line_no"] as $idx => $line_no) {
          $mod_no = $dbg_prof_results["mod_no"][$idx];
          dbg_get_module_name($mod_no, &$mod_name);
          
          $hit_cnt = $dbg_prof_results["hit_count"][$idx];

          $time_sum = $dbg_prof_results["tm_sum"][$idx] * 1000;
          $time_avg_hit = $time_sum / $hit_cnt;
          $time_min = $dbg_prof_results["tm_min"][$idx] * 1000;
          $time_max = $dbg_prof_results["tm_max"][$idx] * 1000;

          dbg_get_source_context($mod_no, $line_no, &$ctx_id);
          if (@$ctx_cache[$ctx_id]) {
             $ctx_name = $ctx_cache[$ctx_id];
          } else {
             if (dbg_get_context_name($ctx_id, &$ctx_name) && strcmp($ctx_name,"") == 0)
                $ctx_name = "::main";
             $ctx_cache[$ctx_id] = $ctx_name;
          }

          $cont =& $contexts[$ctx_name];
          if (!@$cont) $cont = array(
             "file" => $mod_name,
             'hit_cnt' => 0,
             'time_sum' => 0,
             'lines' => array()
          );

          $cont['hit_cnt'] += $hit_cnt;
          $cont['time_sum'] += $time_sum;
          $cont['lines'][$line_no] = array(
             "hit_cnt"  => $hit_cnt,
             "time_sum" => $time_sum,
          );
       }

       uasort($contexts, 'dbg_profile_cmp');
       foreach ($contexts as $ctx=>$data) {
          uasort($contexts[$ctx]['lines'], 'dbg_profile_cmp');
       }
       return $contexts;
    }

    function dbg_profile_cmp($x,$y)
    {
       $a = $x["time_sum"];
       $b = $y["time_sum"];
       if ($a == $b) return 0;
        return ($a > $b) ? -1 : 1;
    }


    function dbg_draw_contexts($contexts, $lines_detail = 3)
    {
       echo "
          <br><table cellspacing=2 cellpadding=2 border=0 style='font:8pt courier'>
           <thead>
          <tr style='background:#808080; color:#FFFFFF'>
             <td> file </td>
             <td> function </td>
             <td> hit_cnt </td>
             <td> time </td>
             <td> % time </td>
          </tr></thead>
          <tbody style='vertical-align: top'>
       ";

       $total_time = $total_hits = 0;
       foreach ($contexts as $context=>$data) {
          $total_time += $data['time_sum'];
          $total_hits += $data['hit_cnt'];
       }

       $idx = 0;
       foreach ($contexts as $context=>$data) {
          $bk = ($idx++ & 1) ? "#ffffff" : "#e0e0e0";
          $file = basename($data['file']);
          $p_time = sprintf("%.3f", 100 * $data['time_sum'] / $total_time);
          echo @"
             <tr style='background:$bk'>
             <td>$file</td>
             <td>$context</td>
             <td>$data[hit_cnt]</td>
             <td>$data[time_sum]</td>
             <td>$p_time</td>
              </tr>
          ";
          if ($idx-1 < $lines_detail) {
             $i = 0;
             foreach ($data['lines'] as $l=>$d) {
                $p_time = sprintf("%.3f", 100 * $d['time_sum'] / $total_time);
                echo @"
                   <tr style='background:$bk'>
                   <td>...</td>
                   <td>&nbsp;&nbsp;line $l</td>
                   <td>&nbsp;&nbsp;$d[hit_cnt]</td>
                   <td>&nbsp;&nbsp;$d[time_sum]</td>
                   <td>&nbsp;&nbsp;$p_time</td>
                   </tr>
                ";
                if ($i++>20) break;
             }
          }
       }
       echo "</tbody></table>";
    }
    ?>

    Использование:

    <?
    include_once "Profiler.php";

    ++++ ВАШ КОД ++++

    dbg_draw_contexts(dbg_profile());
    ?>

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

    При выполнения кода профайлера скрипт значительно притормаживает, а если быть точным, тормозит функция dbg_get_source_context(), но от этого некуда не деться... Так что запуск скрипта с профайлером занимает минуты (поставьте max_execution_time побольше в php.ini).

    Все функции работают! Проверено мной! Так что юзайте на здоровье :)

    Все свои вопросы Вы можете задавать на нашем форуме.

    © 2002-2003 Copyright by GreatWeb.Ru
    Копирование материалов рассылки возможно только в случае явного указания на сайт "GreatWeb.RU" как на источник информации.



    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться
    Убрать рекламу

    В избранное