Соционический форум SOCIOCLUB.ORG

Форум о соционике, психе-йоге и других типологиях

Объявление форума

Предлагаем посетить наши новые сайты:
TYPTEST.RU — авторские тесты по соционике, психософии и другим типологиям
TIPIRUEM.RU — форум о типологиях личности
SOCIOMODEL.RU — соционика и психософия для начинающих

Соционический форум SOCIOCLUB.ORG »   Развитие проекта и технические вопросы »   Технические улучшения
RSS
Реклама:

Технические улучшения

для специалистов

<<Назад  Вперед>>Страницы: 1 2
Модераторы: Kath, srez
Печать
 
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Про, разберись, пожалуйста с RSS-потоками, чтобы они выводили автора и
дату.
http://www.webmascon.com/topics/technologies/9a.asp
http://blogs.law.harvard.edu/tech/rss

Кстати, я
добавил наши RSS в блоги Яндекса. :-)
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
И еще - я добавил на сайт RSS ru_socionics, но он на UTF-8 и потому выводится
кракозябрами - ты можешь его настроить?

Т.е.:
- или добавить распознавалку кодировки
- или привести твои потоки
к UTF
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Стандарт, описанный в первой и второй ссылках, друг другу противоречит: в одном
автор называется <dc:creator>, а в другом: <author>. То же самое и с датой публикации: <pubDate> и <dc:date>. Я сейчас сделал
и так и так, посмотрим, что из этого выйдет.
Написать определение кодировки — вряд ли получится, а вот перекодировать
вывод в UTF-8 вполне могу.
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Про, я подкорркетировал index.php:

выделил отдельный языковой
файл для промежуточной страницы (smartinfo.php)
[128]
if (substr($action,0,3)!='do_' || getvar('preview') ||
getvar('more'))
{ $do_mode=1;

        load_lang('main.php');
        load_style('main.php');
        load_style('common.php');
}
else
{        $do_m
ode=0;
        load_lang('smartinfo.php');
        load_style('message.php');
}
if (getvar('preview'))
load_style('message.php');

и убрал второй шаблон
[275]
$do_mode ?
require($opt_dir.'/config/tmplate1.php') : call_user_func($action);


комментарии там стоят
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Про, я создал папку "lib", в которую стал переносить специализированные
функции, чтобы они грузились только по мере надобности.
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
А, в идеале, надо будет сделать так, чтобы корневой файл (index.php) определял
модуль, который будет выводить (согласно строке запроса) и исходя из этого подгружал соответствующие функции, языковой файл и
определенный шаблон. Таким образом мы избежим загрузки ненужных кусков кода. Согласен? 8-) :-)
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Это будет плавный переход к третьей версии, где функции, лежащие в "lib", позже
будут оформлены в виде классов. ;-)
Gram
Участник

Gram

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: БГ
Всего сообщений: 14
Ссылка


Дата регистрации на форуме:
16 авг. 2006

XXXX Pro написал:
[q]
одном автор называется <dc:creator>, а в другом: <author>. То же
самое и с датой публикации: <pubDate> и <dc:date>.
[/q]

Дык это в разных версиях rss по-разному. Делать и так и так
противоречит спецификации..
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Так же придеживаться стандарту MVC:

[q]
Изначально MVC
применялся для разработки графических приложений для Desctop систем, однако в последствии он был не только весьма удачно
приспособлен для Web приложений, но и достиг значительной популярности в Web программировании. Большинство современных
Web–Фреймворков в той или иной мере основываются на этом паттерне. И даже более того - анонсируют его поддержку как самое
свое главное достоинство для программистов.

Основной идеей данного системного паттерна проектирования является
разбиение приложения на три различных слоя:
  • Модель (Model), которая отвечает за работу с
    данными
  • Представление (View), ответственное за внешний вид приложения
  • и Контроллер (Controller) отвечающий за
    бизнес логику.

Благодаря такому структурированию приложения в итоге мы получаем
возможности:
  • быстрой модификации существующего приложения
  • возможности легкого и безболезненного изменения
    внешнего вида
  • почти безграничной расширяемости
  • отделению бизнес логики (как правило, самой трудоемкой части
    разработки) от второстепенных деталей
  • и наконец то мы имеем возможность эффективно разделить обязанности в команде
    разработчиков между программистом и верстальщиком.
[/q]
Gram
Участник

Gram

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: БГ
Всего сообщений: 14
Ссылка


Дата регистрации на форуме:
16 авг. 2006
Кстати, очень удачный шаблон проектирования приложения.
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Удалил закрывающие </td> </tr> (по стандарту HTML 4 они, оказывается, не
обязательны) из основных стилевых файлов, в итоге, по идее, должен немного уменьшиться объем страниц.
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006

XXXX Pro написал:
[q]
Удалил закрывающие </td> </tr> (по стандарту HTML 4 они,
оказывается, не обязательны) из основных стилевых файлов, в итоге, по идее, должен немного уменьшиться объем
страниц.
[/q]

It`s good! :thumbup:
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
занимаюсь вовсю созданием новой темы (предназначенной для переезда).. :wall:


создал глобальную
переменную:
$GLOBALS['style_img']='src="styles/'.$GLOBALS['inuser']['st_file'].'/img/';
теперь
вместо
<img
src="<?=$GLOBALS['opt_url']."/styles/".$GLOBALS['inuser']['st_file']."/rss.png";?>">

можно
писать
<img <?=$GLOBALS['style_img']?>rss.png">

8-)
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Полностью переписал механизм аутентификации, чтобы снизить нагрузку на БД, а
также уменьшить объем cookies (что повлияет на размер даных, передаваемых в каждом запросе со стороны клиента — экономия
примерно почти в 1 Kb).
Если у кого-либо возникнут проблемы со входом на форум или редактированием профиля, то обращайтесь
ко мне либо в ICQ, либо пишите на Email, указанный в профиле (второй способ — надежнее).
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
А сколько же пользователей на сайте?

Наверное,
многие из вас видели такую модную фишку как "Сейчас на сайте 126 человек, из них в чате 89". Если нет, то поставить счетчик
от SpyLog вы можете легко увидеть, сколько человек находится на вашем сайте.
Вот и я решил сам реализовать такую функцию у
себя на сайте http://ancient.dax.ru и вот к чему пришел...

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

Первое что нам понадобится это база данных (в моем
случае это MySQL). В этой БД нам нужна таблица с двумя полями username и time

CREATE TABLE session (
username
varchar(25) DEFAULT '' NOT NULL,
time varchar(14) DEFAULT '' NOT NULL
);


Далее приступим к написанию
самого скрипта, вернее одной единственной функции. Итак,

function online() {

$username =
getenv("REMOTE_ADDR");

$past = time()-900;

mysql_query("DELETE FROM session WHERE time < $past");
$result =
mysql_query("SELECT time FROM session WHERE username='$username'");

$ctime = time();

if ($row =
mysql_fetch_array($result)) {
mysql_query("UPDATE session SET username='$username', time='$ctime' WHERE
username='$username'");
} else {
mysql_query("INSERT INTO session (username, time) VALUES ('$username',
'$ctime')");
}

$result = mysql_query("SELECT COUNT(*) FROM session");
$count =
mysql_fetch_array($result);
echo $count[0];

}


Алгоритм очень прост. Идентифицируем каждого
пользователя и заносим время его прихода на страницу. Определяем время, через которое пользователь будет считаться покинувшим
сайт. Вот и все.
Теперь пояснения по коду. Первым делом мы получаем адрес удаленного пользователя (REMOTE_ADDR) и
определяем время, через которое будем считать пользователя покинувшим сайт.

mysql_query("DELETE FROM session
WHERE time < $past");


Этой строкой удаляем все просроченные записи.

$result = mysql_query("SELECT
time FROM session WHERE username='$username'");


Выбираем из БД поля, для которых REMOTE_ADDR пользователя
совпадает с уже зафиксированным.

if ($row = mysql_fetch_array($result)) {
mysql_query("UPDATE session SET
username='$username', time='$ctime' WHERE username='$username'");
} else {
mysql_query("INSERT INTO session
(username, time) VALUES ('$username', '$ctime')");
}


Если такие записи в таблице есть, то обновляем,
заносим новое время захода на страницу, если нет - добавляем новую запись.

$result = mysql_query("SELECT
COUNT(*) FROM session");
$count = mysql_fetch_array($result);
echo $count[0];


Считаем из базы количество
записей - это и будет количество посетителей на сайте.

Источник: http://ancient.dax.ru
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
Сессии PHP. Часть 6.

Блокировки: файлы, БД,
хитрости.


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


Блокировки файлов.

Для блокирования файла
воспользуемся рекомендательной блокировкой - flock(). Рекомендательной она называется потому, что работает только в том
случае, если все программы, обращающиеся к файлу, будут ее использовать. Программу, которая не будет использовать flock(),
блокировка никак не коснется.
Рекомендательная блокировка имеет ряд ограничений: может не работать на некоторых сетевых
файловых системах (т.е. хранить файлы с данными сессий следует на локальном диске), она не поддерживается на старых файловых
системах (FAT). Подробнее читайте здесь: http://www.php.net/manual/ru/function.flock.php .

Вот модифицированные
функции обработчика из 4-ой части статьи.


function session_read($sid)
{    $file = "$this-
>_path/$sid";
     if (!($this->_fd = @fopen($file, 'rb+')))
       die("Не получается создать или открыть
файл!");
    flock($this->fd,LOCK_EX, true); // Блокируем
    $data = fread($this->_fd, filesize($file));
    
touch($file); // Изменяем время модификации файла на текущее
    return $data;
}

function session_write($sid,
$data)
{   rewind($fd);
    ftruncate($fd, 0);
    $res = fwrite($this->_fd, $data);
    fclose($this->_fd); //
блокировка автоматически снимается
    return $res;
}


Блокировки в БД.

Добавим в таблицу
session (см. 5-ую часть статьи) поле locked.

CREATE TABLE sessions(
    sid CHAR(32) NOT NULL PRIMARY
KEY,
    atime TIMESTAMP,
    locked TINYINT NOT NULL DEFAULT 0,
    data TEXT NOT NULL DEFAULT
'');


Модифицированные функции из 5-ой части:


function session_read($sid){
    
$lock_tries = 50;    // Спервка попробуем создать строку. Если она уже есть, mysql_affected_rows() вернет 0.
    
mysql_query("INSERT IGNORE INTO session (sid, locked) VALUES ('$sid', 1)");
    if (!mysql_affected_rows())
        
while ($lock_tries)
        {   mysql_query("UPDATE session SET locked = 1, atime = NOW() " .
                "WHERE
sid = '$sid' AND " .
                "(locked = 0 OR atime < DATE_ADD(NOW(), INTERVAL -$lock_time_max SECOND))");
            
if (mysql_affected_rows())
                break; // Строку удалось пометить заблокированной
            // Проверка:
пока мы тут ждем, кто-то мог удалить строку...
            $res = mysql_query("SELECT 1 FROM session WHERE sid =
'$sid'");
            $row = mysql_fetch_row($res);            mysql_free_result($res);
            if (!$row)
            
{                // Так и есть. Создаем заново.
                mysql_query("INSERT IGNORE INTO session (sid, locked)
VALUES ('$sid', 1)");
                if (mysql_affected_rows())
                    break; // Если получилось -
выходим из цикла
            }
            $lock_tries--;
            if ($lock_tries)
                
usleep($lock_try_timeout); // Немного подождем...
        }    // Удалось ли заблокировать?
    if (!$lock_tries)
        
die("Ну сколько можно ждать?");
    $res = mysql_query("SELECT data FROM session WHERE sid = '$sid'");
    $row =
mysql_fetch_row($res);    mysql_free_result($res);
    return $row[0];}function session_write($sid, $data){
  $data
= mysql_escape_string($data);
  mysql_query("REPLACE INTO session (sid, locked, data) VALUES ('$sid', 0,
'$data')");
}

function session_delete($sid){
  return mysql_query("DELETE FROM session WHERE sid =
'$sid'");
}

function session_gc($lifetime){
    mysql_query("DELETE FROM session WHERE atime < DATE_ADD(NOW(),
INTERVAL -$lifetime SECOND)");
}


$lock_time_max используется для обработки ситуации, когда скрипт,
заблокировавший строку, по какой-либо причине не разблокировал ее. Выбирать его следует исходя из максимального времени
работы скрипта (без учета ожидания блокировки в функции session_read()). Думаю, для большинства задач достаточно 10
секунд.
$lock_try_timeout - время между попытками заблокировать строку. Я выбрал 0.25 секунды (значение
250000).
$lock_tries - число попыток.
Величина ($lock_tries * $lock_try_timeout) должна быть не меньше $lock_time_max -
чтобы ожидание не было напрасным.

Хитрости.

Как видно из приведенного кода, вариант с файлами
значительно меньше и проще, но БД работает быстрее, и управлять удобнее. Кроме того, сервер БД может находиться на другом
компьютере.
Чтобы сократить время, в течение которого строка находится в заблокированном состоянии, после обновления
данных сессии следует выполнить функцию session_write_close(). Это уменьшит ожидание для параллельного запроса и снизит
вероятность ситуации, когда из-за медленно работающего скрипта параллельный скрипт не смог дождаться своей очереди и
умер.
При старте сессии PHP проверяет допустимость идентификатора - он может содержать только латинские буквы и цифры.
Т.е. необходимости в дополнительном контроле нет.

Роман Чернышов (RXL) 27.05.2006
Источник:
http://club.shelek.com/viewart.php?id=268
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Оффтопик: А вот про INSERT IGNORE я не знал... Полезная штука, если я правильно
понял, что она делает

А вообще, у приведенных методов есть один существенный недостаток (с точки зрения нашего
форума): DELETE выполняется каждый раз, а при большой нагрузке это нежелательно (будет сильно фрагментироваться сессионная
таблица).
А вот для вывода списка присутствующих я тоже собирался сделать примерно такой же механизм...
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006

XXXX Pro написал:
[q]
А вот про INSERT IGNORE я не знал... Полезная штука, если я
правильно понял, что она
делает
[/q]


http://forum.shadrinsk.net/vie...ote=viewre
sult&sid=fbc3bec2e593b53be4fadb42592aa67c

http://www.mysql.ru/webboard/i...mp;page=81
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006
XXXX Pro, оформи обновленный файл в 'lib/'. Сегодня.
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Сделано.
Brand
Участник
Серый Комбинатор
Brand

ТИМ: Не типирован
ПЙ-тип: нет

Откуда: Санкт-Петербург
Всего сообщений: 244
Ссылка


Дата регистрации на форуме:
2 июня 2006

XXXX Pro написал:
[q]
Сделано.
[/q]

Отлично!
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Внимание! Сегодня вечером (ориентировочно с 23:00 до 2:00) форум может быть недоступен всвязи с переходом с PHP 4 на PHP 5.
Admin
Здешних мест хозяин
Философ и Воин Интернета
Admin

ТИМ: ЛИИ ("Робеспьер")
ПЙ-тип: нет

Откуда: Москва, Перово
Всего сообщений: 7998
Ссылка


Дата регистрации на форуме:
2 июня 2006
Ну вот, переход прошел благополучно (причем, что довольно необычно, это сделали буквально за 20 минут, и обошлось без дополнительных писем в техподдержку). У кого какие впечатления относительно скорости работы форума — стало быстрее или медленнее?
aRT
Долгожитель форума
ренегат
aRT

ТИМ: Не типирован
ПЙ-тип: ЛВЭФ

Всего сообщений: 5236
Ссылка


Дата регистрации на форуме:
5 фев. 2007
по-моему стало немного быстрее. хотя мне и до этого скорость нравилась. отлично!
<<Назад  Вперед>>Страницы: 1 2
Модераторы: Kath, srez
Печать

Соционический форум SOCIOCLUB.ORG »   Развитие проекта и технические вопросы »   Технические улучшения
RSS
Быстрый переход в раздел:

Вы не можете отправлять сообщения
Вы не можете создавать темы
Вы не можете голосовать в опросах
Вы не можете создавать опросы
Вы не можете редактировать свои сообщения
Вы не можете прикреплять к сообщениям файлы
Вы не можете модерировать раздел
Вы не можете видеть IP-адреса


Время выполнения скрипта: 0.0303. Количество выполненных запросов: 14, время выполнения запросов 0.0079
Rambler's Top100