[php] Новичкам: задаем вопросы

Discussion in 'PHP' started by _Great_, 26 May 2007.

Thread Status:
Not open for further replies.
  1. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Подскажите какой командой можно узнать имена всех директорий на ftp сервере?
    Подключаюсь через стандартную функцию ftp_connect.

    Вроде нашла ftp_rawlist. Но он выводит список всех файлов и дир. Как узнать что это директория не используя регулярок и substr

    Как сказали можно заюзать GLOB Only_dir. Но вроде бы эта функция работает не на всех хостингах.
    Надо бы чтобы работала везде.
     
  2. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Rastamanka чем вам не нравится substr?

    huzker2 фейки запрещены, если что, и код вам не напишут тут. Плюс вы хотите, чтобы работу сделали за вас, видимо, это второй провал
     
    _________________________
  3. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Вы пользовались хоть раз rawlist? Он выводит в 2-х разных видов(linux,win) данные при этом с фалагами(правами,временем создания и т.д.). По этому чтобы заюзать substr_count до этого надо будет задействовать регулярки..

    В общем вроде вашла выход ftp_nlist(обязательно использовать -a $dir) иначе не на всех фтп выводит папки а только файлы. Осталось определить какие из них папки а какие нет. Да и хотелось бы чтобы 100% рабочий способ определения папка это или файл ибо может так же папка содержать точку и т.д.


    В общем решение найдено. Малоли кому понадобавится.

    PHP:
    $ftp_list ftp_nlist($conn"-a /");

                    foreach(
    $ftp_list as $value) {
                        
                     
    $dir ftp_size ($conn$value);
                     
            
    // проверяем папка это или нет         
                       
    if($dir == '-1') {
                      
                     echo 
    "$value <br>";    
                         
                     }

      }
    Хотя все таки помощь нужна. Оказалось что на некоторых фтп отключена функция распознавания размера файла и в итоге файлы тоже выдают ответ -1. Конечно можно проверять $dir_toch = substr_count($value,"."); но это все не то. Точного ответа это не даст.
     
    #18323 Rastamanka, 25 Apr 2011
    Last edited: 25 Apr 2011
  4. Player#1

    Player#1 Member

    Joined:
    11 Nov 2008
    Messages:
    95
    Likes Received:
    35
    Reputations:
    10
    Rastamanka

    В комменатриях к документации функции ftp_nlist() предлагается использовать вот такую функцию, если не поддерживается ftp_size():

    PHP:
    function ftp_is_dir($dir) {
       global 
    $ftp_connect;
       if (
    ftp_chdir($ftp_connect$dir)) {
         
    ftp_chdir($ftp_connect'..');
         return 
    true;
       } else {
         return 
    false;
       }
     }
    http://docs.php.net/manual/en/function.ftp-nlist.php#78447
     
  5. Rastamanka

    Rastamanka Elder - Старейшина

    Joined:
    26 Nov 2008
    Messages:
    429
    Likes Received:
    11
    Reputations:
    7
    Кто подскажет. Для принятия данных в инете используеться $_POST,$_GET,$_REQUEST.
    А если мне надо передать какой то параметр через консоль скрипту то как принимать его? Через консоль то есть cmd.
     
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Rastamanka
    PHP:
    var_dump($argv); // - параметры командной строки
    echo fgets(STDIN1024); // стандартный (клавиатурный) ввод
     
    _________________________
  7. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Насколько я понял ТС надо другое.
    PHP:
    <?php
    $handle 
    popen("/bin/ls""r");
    ?>
    PHP:
    <?php
    error_reporting
    (E_ALL);

    /* Добавляем перенаправление чтобы прочитать stderr. */
    $handle popen('/path/to/spooge 2>&1''r');
    echo 
    "'$handle'; " gettype($handle) . "\n";
    $read fread($handle2096);
    echo 
    $read;
    pclose($handle);
    ?>
    Т е можно просто открыть процесс, послать в него информацию, принять и закрыть процесс. Но не стоит забывать о функции system и exec. Так же почитайте о функции proc_open.
    proc_open() похожа на popen(), но предоставляет больший контроль над выполнением программы. cmd это команда, выполняемая оболочкой. descriptorspec это индексированный массив, в котором ключи представляют номера дескрипторов, а значения представляют то, как PHP передаёт эти дескрипторы в дочерний процесс. pipes будет установлен в индексированный массив файловых указателей, соответствующий концу любых созданных каналов. return-значение является ресурсом представляющим процесс; вы должны освободить его с помощью proc_close() по окончании работы с ним.​
    PHP:
    $descriptorspec = array(
     0 => array("pipe", "r"),// stdin это канал, из которого потомок будет читать
     1 => array("pipe", "w"),// stdout это канал, в который потомок будет записывать
     2 => array("file", "/tmp/error-output.txt", "a"), // stderr это файл для записи
    );
    $process = proc_open("php", $descriptorspec, $pipes);
    if (is_resource($process)) {
    // $pipes выглядит теперь примерно так:
    // 0 => записываемый дескриптор, соединённый с дочерним stdin
    // 1 => читаемый дескриптор, соединённый с дочерним stdout
    // Любой вывод ошибки будет присоединён к /tmp/error-output.txt

    fwrite($pipes[0], "<?php echo \"Hello World!\"; ?>");
    fclose($pipes[0]);

    while(!
    feof($pipes[1])) {
    echo 
    fgets($pipes[1], 1024);
    }
    fclose($pipes[1]);
    // Важно, чтобы вы закрыли любые каналы до вызова
    // proc_close, чтобы исключить тупиковую блокировку
    $return_value proc_close($process);

    echo 
    "command returned $return_value\n";
    }
    Так же существует функция passthru, escapeshellcmd, shell_exec...... Этот список можно без конечно продолжать. Советую о всех них почитать, прежде чем что то писать.
     
    #18327 randman, 27 Apr 2011
    Last edited: 27 Apr 2011
  8. #Smith

    #Smith New Member

    Joined:
    20 Jun 2010
    Messages:
    96
    Likes Received:
    2
    Reputations:
    0
    Подскажите, как это работает?
    Что вообще вызывает выполнение кода, ведь функция вроде как строковая?


    PHP:
    preg_replace("/.*/e""eval('phpinfo();');"".");
     
  9. winstrool

    winstrool ~~*MasterBlind*~~

    Joined:
    6 Mar 2007
    Messages:
    1,413
    Likes Received:
    910
    Reputations:
    863
    почитай _http://php-book.net/preg-replace.html
     
    _________________________
    2 people like this.
  10. AtomoS

    AtomoS New Member

    Joined:
    17 Feb 2010
    Messages:
    88
    Likes Received:
    1
    Reputations:
    0
    Класс для подсчёта траффика

    Привет всем, уже давно ищу библиотеку для подсчёта количества траффика исходящего из скрипа php к примеру.

    есть ли какие варианты?
     
  11. OnlyOn

    OnlyOn Banned

    Joined:
    18 Oct 2010
    Messages:
    252
    Likes Received:
    89
    Reputations:
    36
    давно для себя делал
    PHP:
    <?php


    $server 
    "127.0.0.1";       
    $maxband "500000";          
    $mirror "mirror.yoursite.com";    

    $handle fopen ("http://$server/server-status?auto""r");
    while (!
    feof($handle)) {
         
    $buffer=fread($handle,4096);
    }
    fclose($handle);


    list(
    $th,$tb,$cpu,$uptime,$rs,$bs,$br,$busy,$idle,$scoreboard)= split ("\n"
    $buffer);

    /* Additional things to parse... don't need them here, but they're available.
    $th = ereg_replace(".*Total Accesses: ", "", $th);
    $tb = ereg_replace(".*Total kBytes: ", "", $tb);
    $cpu = ereg_replace(".*CPULoad: ", "", $cpu);
    $uptime = ereg_replace(".*Uptime: ", "", $uptime);
    $rs = ereg_replace(".*ReqPerSec: ", "", $rs);
    $br = ereg_replace(".*BytesPerReq: ", "", $br);
    */

    $bs ereg_replace(".*BytesPerSec: """$bs);

    if (
    $bs $maxband) {
      
    $location "http://$mirror/$file";
    } else {
      
    $location "http://$server/$file";
    }


    echo 
    "<p>$server limit is $maxband bytes. Current bandwidth is $bs.</p>";
    echo 
    "<p>Sending you to <b>$location</b>.</p>";



    ?>

     
    1 person likes this.
  12. CodeSender:)

    CodeSender:) Elder - Старейшина

    Joined:
    29 Jul 2010
    Messages:
    245
    Likes Received:
    115
    Reputations:
    23
    Говоришь давно себе писал?Тебя Алекс Мондалексис зовут?Это же не твой код...
    http://gb.moundalexis.com/~alexm/downloads/load.phps
     
    1 person likes this.
  13. Nelz.

    Nelz. Member

    Joined:
    2 Aug 2010
    Messages:
    151
    Likes Received:
    7
    Reputations:
    0
    всем привет

    PHP:
    if($_GET['action']== 'logout') {
    session_destroy();
    }
    как в этот код засунут хедер после удаления сессии?
     
  14. lex(SL)

    lex(SL) New Member

    Joined:
    21 Nov 2010
    Messages:
    1
    Likes Received:
    1
    Reputations:
    0
    Кто - то еще сессиями пользуется? :) Юзай кукисы и не будет никаких проблем, Сессии только сервер зря напрягает хламом.
     
  15. Nelz.

    Nelz. Member

    Joined:
    2 Aug 2010
    Messages:
    151
    Likes Received:
    7
    Reputations:
    0
    да пользуется) напрягает сервер но,а безопасность?
    любой желающий может стырить куки...это как трахат девушку без гондона не думая о последствия :rolleyes:

    актуально
     
  16. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Nelz. в чем собственно вопрос?
    PHP:
     if($_GET['action']== 'logout') {
    session_destroy();
    header('Location: http://ya.ru');
    die();
    }  
    Дополнительно, рекомендую прочитать документацию: http://php.net/session_destroy
     
    _________________________
  17. Nelz.

    Nelz. Member

    Joined:
    2 Aug 2010
    Messages:
    151
    Likes Received:
    7
    Reputations:
    0
    я это знаю,дело в этом
    Warning: Cannot modify header information - headers already sent by

    PHP:
    <?php 
    session_start
    ();

    if (
    $_SESSION['username'])
    {
    echo 
    "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>";

    if(
    $_GET['action']== 'logout') {
    session_destroy();
    header('Location: http://ya.ru');
    die();

    }

    }
    else 
    die(
    "");
    ?>
    как засунут хедер после удаления сессии? туда просто так не пихнеш
     
  18. OnlyOn

    OnlyOn Banned

    Joined:
    18 Oct 2010
    Messages:
    252
    Likes Received:
    89
    Reputations:
    36
    Проблемма в этом:
    echo "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>";


    Убери и будет тебе счастье
     
  19. randman

    randman Members of Antichat

    Joined:
    15 May 2010
    Messages:
    1,366
    Likes Received:
    610
    Reputations:
    1,101
    Да всё потому что ты выводишь эту строку:
    PHP:
    echo "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>";
    До header недолжно быть никакого вывода информации в браузер, поскольку она отправляет HTTP заголовки, но она их неможет отправить, поскольку они уже были выведены. Так что можно использовать так:
    PHP:
    <?php 
    session_start
    ();

    if (
    $_SESSION['username'])
    {
    if(
    $_GET['action']== 'logout') {
    session_destroy();
    header('Location: http://ya.ru');
    die();

    }

    echo 
    "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>";

    }
    else 
    die(
    "");
    ?>
    Или переадресовывать через META:
    PHP:
    <?php 
    session_start
    ();

    if (
    $_SESSION['username'])
    {
    echo 
    "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>";

    if(
    $_GET['action']== 'logout') {
    session_destroy();
    echo 
    ' <META HTTP-EQUIV="REFRESH" CONTENT="0; URL=http://ya.ru">';
    die();

    }

    }
    else 
    die(
    "");
    ?>
    Или на Javascript:
    PHP:
    <?php 
    session_start
    ();

    if (
    $_SESSION['username'])
    {
    echo 
    "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>";

    if(
    $_GET['action']== 'logout') {
    session_destroy();
    echo 
    '    <script type="text/javascript">
        window.location = "http://ya.ru/"
        </script>'
    ;
    die();

    }

    }
    else 
    die(
    "");
    ?>
     
    #18339 randman, 30 Apr 2011
    Last edited: 30 Apr 2011
    1 person likes this.
  20. Player#1

    Player#1 Member

    Joined:
    11 Nov 2008
    Messages:
    95
    Likes Received:
    35
    Reputations:
    10
    Заголовки должны отправляться до вывода в браузер. Соответственно сначала header() а потом echo.

    PHP:
    if ($_SESSION['username']) 


    if(
    $_GET['action']== 'logout') { 
    session_destroy(); 
    header('Location: http://ya.ru'); 
    die(); 


    echo 
    "Welcome, ".$_SESSION['username']."!<br><a href='member.php?action=logout'> Logout </a>"

    }
     
    1 person likes this.
Thread Status:
Not open for further replies.