За последние 24 часа нас посетили 18538 программистов и 1604 робота. Сейчас ищут 922 программиста ...

Не дожидаясь выполнения system(), продолжить выполнять код

Тема в разделе "Прочие вопросы по PHP", создана пользователем admyx, 10 сен 2008.

  1. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Всем привет.

    Вот у меня вопрос.
    Пишу скрипт для автоматизации выполнения детализации из netflow.
    Вот кусок:

    PHP:
    1.  
    2. <?php
    3. $flowfile = '/usr/local/netflow/logs/netflow.txt'; //put k papke i failu s logom newtflow
    4.  
    5. $ot = $_POST['ot']; //vremya starta
    6. $do = $_POST['do']; //vremya okonchaniya
    7. $contract = $_POST['contract']; //nomer dogovora
    8.  
    9.  
    10. $command = escapeshellcmd('/usr/local/get_trafic_use.pl '.$contract.' '.$ot.' '.$do);
    11. @$exec = system($command, $msgcode); //????????
    12.  
    13.  
    14. if(!$exec)
    15.     exit('Invalid command');
    16.  
    17. if($msgcode == 2)
    18.     exit('Error executing command');
    19. ?>
    Значит, дело в чем - скрипт должен выполнять команду system().
    Он запускает perl скрипт, который эту детализацию расшифровывает.
    Далее там создаются файлы, упаковывается в гзип и отсылается на почту.

    Так вот задача - не дожидаясь завершения system() (те, пусть там этот скрипт выполняется на заднем фоне),
    нужно перенаправить пользователя на другую страничку НЕ ПРЕРЫВАЯ работу скрипта.

    Зачем это делается - затем, что создание детализации, это дело муторное и долгое - иногда больше получаса.
    Далее, с file_exists я уже разберусь.

    Нужно как-то не завершая работу system() перейти на другую страничку..
    Есть у кого-нибудь соображения?
     
  2. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Нет, ну можно, конечно, и не только ф-ей system().
    Если есть какой-то другой вариант, я с удовольствием им воспользуюсь....
     
  3. Anonymous

    Anonymous Guest

    pcntl_fork()
     
  4. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    popen() выделяет выполнение в другой процесс, а код программы выполняется дальше?
     
  5. Anonymous

    Anonymous Guest

    я поправился уже )
     
  6. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Оке, спасибо, буду курить.
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    http://lv.php.net/manual/ru/function.system.php
    Т.е.
    Код (Text):
    1.  
    2. system('netstat > /dev/null');
    Не будет дожидаться, пока выполниться netstat (а оно может весьма долго выполнятся на загруженном WEB сервере, вплоть до 7-10 секунд).
     
  8. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    ТЕ

    Код (Text):
    1. system('/usr/local/onyma/get_trafic_use.pl 8959 399203 992039 > /dev/null');
    Так?
    Пробелы между словами в команде экранировать не нужно?
     
  9. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    а зачем их экранировать?

    поработайте в linux консоли и всё встанет на свои места, т.к. по сути вы выполняете команду в консоли, только и всего.
     
  10. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    Да работаю в консоли каждый день.
    Так, перестраховаться)) мало ли.
     
  11. alBoo

    alBoo Активный пользователь

    С нами с:
    27 мар 2008
    Сообщения:
    63
    Симпатии:
    0
    эм, вообще-то консоль при этом не освобождается, соответственно и скрипт будет висеть
    а вот так вот уже лучше )
    Код (Text):
    1.  
    2. netstat >& /dev/null &