За последние 24 часа нас посетили 17780 программистов и 1280 роботов. Сейчас ищут 1433 программиста ...

Файлы и сторонние программы в консольном PHP

Тема в разделе "Прочие вопросы по PHP", создана пользователем [code], 26 окт 2015.

  1. [code]

    [code] Новичок

    С нами с:
    14 июл 2014
    Сообщения:
    32
    Симпатии:
    0
    Здравствуйте. Мне понадобилось написать один парсер на PHP и нужен запуск через консоль, чтобы он мог вести себя как демон. Предположим, что у меня есть некоторый массив $models примерно такого вида:
    Код (PHP):
    1. array(5) {
    2.   [0]=>
    3.   array(1) {
    4.     ["props"]=>
    5.     array(2) {
    6.       [0]=>
    7.       string(5) "prop0"
    8.       [1]=>
    9.       string(5) "prop1"
    10.     }
    11.   }
    12.   [1]=>
    13.   array(1) {
    14.     ["props"]=>
    15.     array(2) {
    16.       [0]=>
    17.       string(5) "prop2"
    18.       [1]=>
    19.       string(5) "prop3"
    20.     }
    21.   }
    22.   [2]=>
    23.   array(1) {
    24.     ["props"]=>
    25.     array(2) {
    26.       [0]=>
    27.       string(5) "prop4"
    28.       [1]=>
    29.       string(5) "prop5"
    30.     }
    31.   }
    32.   [3]=>
    33.   array(1) {
    34.     ["props"]=>
    35.     array(2) {
    36.       [0]=>
    37.       string(5) "prop6"
    38.       [1]=>
    39.       string(5) "prop7"
    40.     }
    41.   }
    42.   [4]=>
    43.   array(1) {
    44.     ["props"]=>
    45.     array(2) {
    46.       [0]=>
    47.       string(5) "prop8"
    48.       [1]=>
    49.       string(5) "prop9"
    50.     }
    51.   }
    52. }
    53.  
    54.  
    И следующий метод работает с ним:
    Код (PHP):
    1. private function getPropData($name, $filename = self::FILE)
    2.     {
    3.         exec('render ' . $name);
    4.         if (!file_exists($filename))
    5.             echo 'Not exist' . PHP_EOL;
    6.         $handle = fopen($filename, 'rb');
    7.         if ($handle === false)
    8.             throw new Exception('Fail');
    9.         $contents = json_decode(fread($handle, filesize($filename)));
    10.         fclose($handle);
    11.         if (empty($contents)) {
    12.             throw new Exception('File is empty');
    13.         }
    14.         return $contents;
    15. }
    16.  
    Код выше запускается в цикле для каждого prop (prop1,prop2...), и значение prop передается в переменную $name метода getPropData. 'exec' - выполняет команду 'render prop1' (пример для prop1), который записывает в файл, указанный в self::FILE, с флагом 'w' (каждый раз данные перезаписываются) данные в формате JSON. Далее в этом методе просто открывается файл, декодируются и возвращаются данные. Выполнение программы render для каждого вызова занимает примерно 5 секунд.
    Проблема заключается в том, что для некоторых prop exec не запускается или запускается, файл создается, но выдается исключение "File is empty". Возможно программа render не успевает закончить свою работу и php уже пытается открыть файл, но вроде же должно все последовательно происходить.

    Помогите разобраться, в чем дело. Надеюсь, понятно объяснил проблему. Если нет, то спрашивайте, постараюсь более развернуто ответить.

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Пищи в дб задачи, а потом пусть каждый демон отмечает задачу выполненной. Запускай, передавая айди задачи.