Форум сетевых администраторов
Показаны 39 сообщений на этой странице

Форум сетевых администраторов (http://netadmin.ws/forum/index.php)
- PHP (http://netadmin.ws/forum/forumdisplay.php?forumid=6)
-- Оптимизация кода, и новые фичи (http://netadmin.ws/forum/showthread.php?threadid=7563)


Помещено zyablik 17-01-2004 в 09:29:

Оптимизация кода, и новые фичи

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

ниже код скрипта:


Помещено Nevermind 17-01-2004 в 15:04:

Скрипт будет глючить при отключенных register_globals - исправляй. Иначе об универсальности речи идти не может.


Помещено zyablik 17-01-2004 в 16:05:

а как бы это покрасивше сделать?
получилось что я так криво написал что испльзовал и метод GET & POST , а теперь туплю...


Помещено polo 17-01-2004 в 16:14:

Есть еще переменная $_REQUEST.

__________________
Всегда есть решение.


Помещено zyablik 17-01-2004 в 18:57:

polo спасибо. клевая переменная .. не знал о ней.


а еще предложения есть?

кстати почему то переносы строк плохо работают.. тоесть они постоянно увеличиваются..

__________________
http://www.best-pills-store.com


Помещено polo 17-01-2004 в 19:28:

quote:
кстати почему то переносы строк плохо работают.. тоесть они постоянно увеличиваются..

Ð_то ты про что?

__________________
Всегда есть решение.


Помещено SCHIZO 17-01-2004 в 19:45:

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

PHP:


/**
* @return bool
* @param $filename string
* @param $relative bool
* @desc Validate filename
*/

function is_filename($filename=' ',$relative=0)
{
    
$allowed = '[wd]'.preg_quote("./_");
    
    if (
eregi('^WIN(.*)',PHP_OS))
    
$allowed .= preg_quote(':');
    
    if (
$relative && preg_match('%(..)|(/./)*%i',$filename))
    return 
FALSE;
    
    if (!
eregi('[a-z]://(.*)',$filename))
    return(!
preg_match('%[^'.$allowed.'-]%i',$filename));
    
    return 
FALSE;
}

/**
 * @return 
 * @param $filename string
 * @desc Check file for read access
 */

function is_readable_file($filename=' ')
{
    if (
is_filename($filename))
        return(
is_readable($filename) && is_file($filename));
}

/**
 * @return bool
 * @param $filename string
 * @param $perms int
 * @desc Create dummy file with defined permissions
 */

function file_create($filename=' ',$perms=0640)
{
    if (
is_filename($filename))
    {
        if (!
file_exists($filename))
        {
            if (
touch($filename)) return chmod($filename,$perms);
        }
    }
    return 
false;
}

/**
 * @return mixed
 * @param $filename string
 * @param $mode char
 * @desc Return file descriptor if filename valid and file readable
 */

function file_open($filename=' ',$mode='r')
{
    if (
is_filename($filename) && is_readable($filename))
        return 
fopen($filename, $mode);
    return 
false;
    
}

/**
 * @return mixed
 * @param $filename string
 * @desc Return contens of a file if readable
 */

function file_read($filename=' ')
{
    if (
is_filename($filename) && is_readable($filename))
    {
        
$fd = file_open($filename,'r');
        if (
$fd)
        {
            
$file = fread($fd, filesize($filename));
            
fclose($fd);
            return 
$file;
        }
    }
    return 
false;
}

/**
 * @return bool
 * @param $filename string
 * @param $contens string
 * @desc Write $contens to $filename
 */

function file_write($filename=' ',$contens='')
{
    if (
is_filename($filename) && is_writeable($filename) && !empty($contens))
    {
        
$fd = file_open($filename,'w');
        if (
$fd)
        {
            if (
flock($fd,LOCK_EX,TRUE))
            {
                
set_file_buffer($fd,0);
                
fwrite($fd, $contens);
                
flock($fd,LOCK_UN);
                return 
fclose($fd);
            }
        }
    }
    return 
false;
}

/**
 * @return unknown
 * @param $filename unknown
 * @desc Delete file if valid name and permissions
 */

function file_delete($filename=' ')
{
    if (
is_filename($filename) && is_writeable($filename)) return unlink($filename);
}



SCHIZO добавил 17-01-2004 в 20:01:38:
еще парочка замечаний по коду
я как параноик относительно секурности и если знаю что какое то значение не должно менятся в процессе выполнения скрипта то пишу его в константу, например так:

PHP:

/ **************************************************
*************************
*
*   
Define most usabled constants from ENV
*
 **************************************************
*************************/

    
# Store software and protocol used both (client,server) sides
    
define('ENV_HTTP_CLIENT',   getenv('HTTP_USER_AGENT'));
    
define('ENV_HTTP_SERVER',   getenv('SERVER_SOFTWARE'));

    
# Store used protocol and method
     
define('ENV_HTTP_PROTOCOL',    strtolower(eregi_repla
ce
('/(.+)$','',getenv('SERVER_PROTOCOL'))));
     
define('ENV_HTTP_METHOD',    getenv('REQUEST_METHOD')
);

    
# Store server machine configuration
    
define('ENV_SERVER_ADDR',    getenv('SERVER_ADDR'));
    
define('ENV_SERVER_HOST',    getenv('HTTP_HOST'));
    
define('ENV_SERVER_PORT',    getenv('SERVER_PORT'));

    
# Store client machine configuration
    
define('ENV_CLIENT_ADDR',    getenv('REMOTE_ADDR'));
     
define('ENV_CLIENT_HOST',    gethostbyaddr(ENV_CLIENT
_ADDR
));
    
define('ENV_CLIENT_PORT',    getenv('REMOTE_PORT'));

    
# Store additional request related variables
     
define('ENV_REQUEST_URI',        getenv('REQUEST_URI'));

     
define('ENV_REQUEST_REFER',        getenv('HTTP_REFERER'
));
     
define('ENV_REQUEST_STRING',    getenv('QUERY_STRING'
));
     
define('ENV_REQUEST_COOKIES',    getenv('HTTP_COOKIE'
));

    
# Store script path and URL related variables
    
define('ENV_SCRIPT_FILE',    str_replace("",'/',getenv('SCRIPT_FILENAME')));
    
define('ENV_SCRIPT_NAME',    getenv('SCRIPT_NAME'));
    
define('ENV_SCRIPT_DIR',    dirname(ENV_SCRIPT_FILE));
    
define('ENV_SCRIPT_URI',    sprintf('%s://%s',ENV_HTTP_PROTOCOL,ENV_SERVER_HOST.ENV_REQUEST_URI));



переменная _REQUEST не позволяет определить откуда пришли значения, с формы на твоем сайте после проверки рефера или юзер просто в адресной строке накорябал чо хотел... фантазия и настойчивость некоторых просто поражает. Ð_то особенно критично при работе с БД или файловой системой.

пример обработки запроса

PHP:

// ... этот кусок не будет работать без
// определенных констант JK_*, ENV_* и VAR_*
//которые в нем используются
/ **************************************************
*************************
*
*   
Low level handling request - get GPC vars
*
 **************************************************
*************************/

    
# Initialize user request vars
    
switch (ENV_HTTP_METHOD)
    {
        case (
JK_ACTION_READ):
            
$JK_FILES = false;
            if (!empty(${
VAR_GET})) $JK_PARAMS =& ${VAR_GET};
            break;
        case (
JK_ACTION_EXEC):
            if (!empty(${
VAR_POST})) $JK_PARAMS =& ${VAR_POST};
            !empty(${
VAR_FILES})
                ?
$JK_FILES =& ${VAR_FILES}
                :
$JK_FILES = false;
            break;
        case (
JK_ACTION_INFO):
            
$date    = date('D, d F Y H:i:s').' GMT';
            
$header  = "200 Document Followsrn";
            
$header .= "Last-modifed: ".$date."rnrn";
            
header('HTTP/1.1 '.$header);
            exit();
        default:
            
$header  = "405 Method Not Allowedrn";
            
$header .= "Allow: GET,POST,HEAD,INFOrnrn";
            
header('HTTP/1.1 '.$header);
            exit();
    }

    
# initialise JK_PARAMS var if not initialize
    
if (empty($JK_PARAMS)) $JK_PARAMS = FALSE;

    
# initialize JK_COOKIES var
    
!empty(${VAR_COOKIE})
        ?
$JK_COOKIE =& ${VAR_COOKIE}
        :
$JK_COOKIE = false;



SCHIZO добавил 17-01-2004 в 20:17:17:
и еще по стилю...

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

..вместо

PHP:

if ($act == 'foo') echo 'bla-bla-bla';
if (
$act == 'bar') echo 'bla1-bla1-bla1';
if (
$act == 'com') echo '_bla-_bla-_bla';


вот так..

PHP:

switch ($act) // обрабаотываем переменную $act
    
{
        case (
'foo'):
            echo 
'bla-bla-bla';
            break;
        case (
'bar'):
            echo 
'bla1-bla1-bla1';
            break;
        case (
'com'):
            echo 
'_bla-_bla-_bla';
            break;
        default:
            return(
null);
     }



SCHIZO добавил 17-01-2004 в 20:20:37:
я от вас не отстану... =)
что мы здесь видим?

PHP:

if($act=='delete') {
   
unlink($root.$tpl);
   echo 
"FILE ".$tpl." DELETED ";
}


..а то что независимо от результата выполнения команды unlink все равно будет сообщено что файл удален..
..вот на такие штуки код надо проверить

SCHIZO добавил 17-01-2004 в 20:24:12:
весь HTML с переменными значениями лучше сразу запихать в переменные а потом когда надо выводить? делать это при помощи форматной строки

__________________
FAQ OFF


Помещено zyablik 17-01-2004 в 23:23:

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

про свичи понятно.. пока писал не сообразил что удобнее сразу свич испольовать.. перепишу
---
с делетом тоже понятно (вроде как достаоточно просто проверки на существоваине файла)
--
с константами не очень понятно... насколько я понял достаточно только пару констант из приведенного списка определить и юзать... хотелось бы пример использования увидить..
--
с остальным не врубился.. (читаю ночью бухой в нулину.. )

zyablik добавил 17-01-2004 в 23:30:53:

quote:
Первоначальное сообщение от polo
Ð_то ты про что?



например был текст
quote:
йцуйцуйцу(перенос)
йцуйцуйц(перенос)
уйцуйцуйцу(перенос)
йцуйцуйцу


после сохранения становистя

quote:
йцуйцуйцу(перенос)(пере
нос)

йцуйцуйц(перенос)(перенос)

уйцуйцуйцу(перенос)(переноÑ
�)

йцуйцуйцу


Помещено SCHIZO 18-01-2004 в 01:11:

перенос какой? win (rn) или uinx (n)?

SCHIZO добавил 18-01-2004 в 02:03:55:
всегда TRUE

PHP:


while($entry=$d->read())


по моему надо так...

PHP:

while($entry==$d->read())


это же условие а не выражение присваивания...


PHP:

if($act=='create') {
   
$fp = fopen($root.$new_file.".html", "a");


используется неинициализированная переменная $new_file, если REGISTER GLOBALS On можно через GET записать в нее что угодно, к тому же эта переменная используется в коде всего единожды. Она вообще нужна в таком случае?


PHP:

$root 
= $_SERVER["DOCUMENT_ROOT"]."/txt/";
$act = $_REQUEST["act"];
$tpl = $_REQUEST["tpl"];
$rename_file = $_REQUEST["rename_file"];
$status = $_REQUEST["status"];
$current = $_REQUEST["current"];



эти переменные всегда присутсвуют в запросе? если нет надо проверять на ненулевое значение !empty($var), тогда ПХП нотисы не будет выдавать (в отличии от isset($var))


PHP:

$d 
= dir($root);


ты уверен что $_SERVER["DOCUMENT_ROOT"]."/txt/" существует? Проверить на существование, и в случае отсутсвия по надобности создать. Только потом открывать.

__________________
FAQ OFF


Помещено whisk 24-01-2004 в 14:50:

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

PHP:


$fp 
= fopen($file);
flock($fp, 3);
....
flock($fp, 2);
fclose($fp);




PHP:

while($entry=$d->read())


- это верная запись. Операция присваивания возвращает результат присваивания. Хотя я в таких случаях обычно пишу что-то вроде

PHP:

while (($entry=$d->read()) !== false)


Помещено SCHIZO 26-01-2004 в 01:52:

...насчет функций чтения файла в строку и записи строки в файл:
http://www.php.net/manual/en/function.file-get-contents.php
http://www.php.net/manual/en/function.file-put-contents.php

__________________
FAQ OFF


Помещено pll 28-01-2004 в 02:30:

вроде нормально =)
покрайней мере как ни странно работает


Помещено zyablik 28-01-2004 в 11:56:

А что, ни у кого нет предложений по поводу новых фич?

quote:
весь HTML с переменными значениями лучше сразу запихать в переменные а потом когда надо выводить? делать это при помощи форматной строки
приведи простенький пример как это делается?

__________________
http://www.best-pills-store.com


Помещено polo 28-01-2004 в 21:07:

?>
html код
<?php
php код
?>

__________________
Всегда есть решение.


Помещено zyablik 30-01-2004 в 12:28:

а скрипт то растет....

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

вроде все впорядке, но как то неудобно...


(если вдруг кто пользоваться будет - напишите здесь )


Помещено he][es 31-01-2004 в 09:43:

А у меня такое вопрос, стоит ли делать так:

PHP:


if ( isset($_GET['act']) ) {
    
$act = $_GET['act'];
    if (
$act != "vote" AND $act != "show_miss" AND $act != "show_all_miss" AND $act != "add_compliment" AND $act != "show_news" AND $act != "show_all_news" AND $act != "show_all_quotes" AND $act != "logout") {
        print 
"<h1 align=\"center\"><bR />&nbsp;<bR />&nbsp;<bR />ПОПАЛСЯ ХАКЕÐ_!!!</h1>";
        exit;
    }
}


Или не стоит $act = $_GET['act'];
И нужно обращаться на прямую к $_GET['act']?

__________________
Админ - вождь Апачей...


Помещено polo 31-01-2004 в 11:38:

А в чем проблема так делать? Ð_то ничему не грозит.

__________________
Всегда есть решение.


Помещено he][es 31-01-2004 в 13:47:

polo ну я имею ввиду оптимальность. а) Что бы скрипт меньше ресурсов жрал...
б) Чтоб проблем невзникло непредвиденных...

__________________
Админ - вождь Апачей...


Помещено MarKer 31-01-2004 в 15:37:

Вообще, полная оптимальность - это конечно бы без $act = $_GET['act'];. Но если у тебя в $_GET['act'] особо объемистых данных не будет... для удобства можно сделать и копию с "нормальным" именем - на потребляемых ресурсах это отразится лишь теоретически.

P.S. Кстати, вместо print() и exit; можно воспользоваться одной функцией - exit() (или её альясом die()).


Помещено he][es 31-01-2004 в 19:12:

MarKer ну в приведенном примере значения маленькие, но есть др. функции (подобные) в которых происходит добавление статей в БД, и там поля до longtext 65т. с коп. символов, я это так же делаю, из $_POST['var'] записываю в $var а потом подставляю в SQL запрос...

__________________
Админ - вождь Апачей...


Помещено MarKer 31-01-2004 в 19:35:

Ну... как говорится - копейка рубль бережет
В таких случаях лучше конечно же не делать копии... или делать unset() для "неудобной" переменной после создания копии.


Помещено whisk 31-01-2004 в 23:04:

Можно просто воспользоваться символьной (или символической?) ссылкой:
$act =& $_GET['act'];
he][es Кстати, по твоему примеру - так делать не стоит имхо Слишком много условий - криво. Либо надо делать
if ... elseif ... elseif ... else, или что-то вроде этого:
$actions = array ('add', 'del', 'edit', 'etc...');
if (in_array($act, $actions) == false) {...}
Т.е. можно и как ты, но в таком месиве можно легко допустить фотальную ашипку.


Помещено he][es 01-02-2004 в 08:17:

whisk я просто с такими "фишками" плохо разбираюсь, объясни поподробнее плз...

__________________
Админ - вождь Апачей...


Помещено zyablik 01-02-2004 в 09:54:

in_array - возвращает TRUE, если значение существует в массиве.

quote:
$actions = array ('add', 'del', 'edit', 'etc...');
if (in_array($act, $actions) == false) {...}


читай так:
создать массив экшнс содержащий значения (эдит,добавить, и т.д.)
если ( функция ин_аррай возвращает ложь, (тоесть переменная акт отстутствует в массиве экшн) то ) {замечен хакер.}

во..

Кстати.. с точки зрения производительности лучше использовать &&, || вместо AND, OR соответсвенно.

__________________
http://www.best-pills-store.com


Помещено Искатель 01-02-2004 в 12:14:

------------
$act =& $_GET['act'];
-------------

& Ð_то указатель.
$act =& $_GET['act']; в данном случае переменная $act будет ссылаться на тот же участок памяти что и $_GET['act'].

__________________
http://faq.pp.ru/read_mee/


Помещено he][es 01-02-2004 в 16:16:

Пасибо большое... заюзаю...

he][es добавил 01-02-2004 в 16:27:27:
А вот такие конструкции допустимы?
$vote_add =& (int) $_GET['vote_add'];
Судя по ошибке или нет, или пишу не так...

__________________
Админ - вождь Апачей...


Помещено polo 01-02-2004 в 18:37:

php имеет свойства сам определять тип переменной. Если тебе надо быть уверенным что в $_GET['vote_add'] именно целое число то пиши intval($_GET['vote_add']).

__________________
Всегда есть решение.


Помещено he][es 01-02-2004 в 21:08:

polo т.е. пишу
$vote_add =& intval($_GET['vote_add']);
???

__________________
Админ - вождь Апачей...


Помещено polo 02-02-2004 в 14:19:

да, только & нафига здесь. & создает ссылку на переменную, это здесь ни к чему. Ð_то полезно например использовать в функциях
при передачи параметров и чтобы глобальные переменные тоже менялись. Посмотри пример и сделай выводы:

PHP:


$a 
= 1;
function 
print_a ($a) {
              
$a++;
              echo 
$a;
}

print_a($a); // выведет 2
echo $a; // выведет 1 
print_a(&$a); // выведет 2
echo $a; // выведет 2

__________________
Всегда есть решение.


Помещено he][es 02-02-2004 в 20:55:

Блин, я ещё больше запутался...
если мы делая так:
$k=5;
$a =& $k;
print $a; // 5
Делаем ссылку, на область памяти и не делаем новой переменной, (как я понимаю изменение $k повлечет соотв. изменение $a), то вызывая ф-ию с параметром &$a мы чего делаем???
если ф бы было $b = & print_a($a);
я б понял но как с параметром ссылки...ээ...
Я просто не догоняю как это работает?

$a=5 -> function($a=5) -> $a++ -> 6
это понятно, а
$a=5 -> function(&$a=5) я не понимаю...

__________________
Админ - вождь Апачей...


Помещено polo 02-02-2004 в 21:25:

Да просто не логично использовать $a =& $k; так как $a = $k; тоже даст 5. А то что ты не понимаешь, явно указано в моем примере, посмотри еще раз внимательно на функцию и на выводимые результаты.

polo добавил 02-02-2004 в 21:27:14:
функция также может иметь вид function print_a(&$a) что равно вышеуказанному примеру.

__________________
Всегда есть решение.


Помещено whisk 03-02-2004 в 21:07:

Подробности про references: http://ru2.php.net/references.


Помещено zyablik 05-05-2004 в 15:03:

Еще раз подниму тему... опять треба помощь :)

наколбасил я тут всякого.... посмотрите, поругайте... предложите...

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

собстна гляньте, оцените...


Помещено ExcErr 12-05-2004 в 14:16:

zyablik
Хех, прикольно...
В принципе на основе этого можно создать движок создания сайтов, т.е. конструктор. В принципе костяк у тебя уже есть.

__________________
Жизнь как минное поле, не знаешь где нарвешься...
http://www.danasoft.com/sig/ExcErr2.jpg


Помещено zyablik 12-05-2004 в 14:18:

ExcErr
http://nevinny.narod.ru посмотри поподробнее ))

__________________
http://www.best-pills-store.com


Помещено ExcErr 12-05-2004 в 14:46:

zyablik
Ну усе понятно. Тока шаблонов нет конкретных у тебя.. Добавь шаблоны.. И будет аля narod.ru

__________________
Жизнь как минное поле, не знаешь где нарвешься...
http://www.danasoft.com/sig/ExcErr2.jpg


Помещено zyablik 12-05-2004 в 14:55:

quote:
Первоначальное сообщение от ExcErr
Ну усе понятно. Тока шаблонов нет конкретных у тебя.. Добавь шаблоны.. И будет аля narod.ru


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


Помещено ExcErr 12-05-2004 в 14:57:

zyablik
Ну я заценил сиё.. Мне понравилось.. Ð_еспект.
Вопрос (сорри за оффтопик), может знаешь где можно нарыть именно конструктор сайтов? Спасибо заранее.

__________________
Жизнь как минное поле, не знаешь где нарвешься...
http://www.danasoft.com/sig/ExcErr2.jpg


Помещено zyablik 12-05-2004 в 15:00:

ExcErr неа.... не знаю...((
а в дампе ниче похожего нет?

__________________
http://www.best-pills-store.com


Формат времени GMT. Текущее время 13:46.
Показаны 39 сообщений на этой странице

Powered by: vBulletin Version 2.2.4
Copyright © Jelsoft Enterprises Limited 2000, 2001.