Форум сетевых администраторов Страницы (3): [1] 2 3 »
Показаны 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:

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

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

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


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


Формат времени GMT. Текущее время 13:57. Страницы (3): [1] 2 3 »
Показаны 39 сообщений на этой странице

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