За последние 24 часа нас посетили 18806 программистов и 1618 роботов. Сейчас ищут 979 программистов ...

Чтение Json в массив PHP

Тема в разделе "PHP для новичков", создана пользователем kaufmanndk, 2 мар 2021.

  1. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Спасибо, да это работает.
    Но есть один недостаток, который усложнит мне работу в дальнейшем.
    Вы указали номера как массив зная их/взяв их из файла. Но мне нужно, что бы номера были считаны исключительно из самой ХМЛ, так как есть две проблемы.

    1) Сама база с номерами будет достигать около 1 миллиона (1 мио. строк). Иногда номера будут менять своё местоположение (не зафиксированы в строчках скажем так), база будет пополнятся автоматически на стороннем сервере. Если я правильно понимаю, то если он будет перебирать номера из базы данных и сравнивать их всего с 20 номерами в xml, то программа будет работать медленно и забивать память.
    2) Я не имею доступа к обновлению базы в случае появления новых номеров в базе у стороннего сервера, я буду получать xml с этими номерами но не буду их видеть так как у меня база данных будет не актуальна.

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

    Можно ли сделать массив номеров из самого xml?
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Запросто.
    PHP:
    1. $result = $objXmlDocument->xpath('//r:ASIN');
    2. print_r($result);
     
    kaufmanndk нравится это.
  3. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Всё работает ! Спасибо огромное.


    Маленький вопрос
    Как сделать, что бы файл дописывался, а не переписывался
    Я добавляю FILE_APPEND, но получается ерунда всё равно. Не могу понять куда именно его надо вставить.

    PHP:
    1. file_put_contents( 'filename.txt', join(PHP_EOL, $out).FILE_APPEND);
     
    #28 kaufmanndk, 4 мар 2021
    Последнее редактирование: 4 мар 2021
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Перед FILE_APPEND вместо точки запятую поставьте.
     
    kaufmanndk нравится это.
  5. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Спасибо, что помогли теперь всё работает!)
     
  6. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Здравствуйте. Столкнулся с такой проблемой.
    xml файл, который я получаю обновляется /перезаписывается с различным интервалом времени 2-10 секунд. Скрипт за это время прочитывает много раз файл и делает много повторныx записей. Ставить просто задержку тоже не вариант.
    Можно ли сделать так, что бы xml файл считывался только один раз при обновлении/изменении его и ждал до следующего изменения/обновления.

    К примеру, что бы скрипт спрашивал каждые 0.3 секунды изменился ли файл, если да, то делать запись и ждать до следующего изменнения xml.
     
    #31 kaufmanndk, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  7. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Что-то вы неправильно делаете.
    В общем случае xml считывается один раз.
    Обрабатываются данные, Возможно, длительно, в пределах лимита времени работы скрипта.
    Записывается или выводится результат.

    Если вы параллельно запускаете его еще несколько раз, то нужно обеспечить блокировку на запись выходного файла.
    Также не лишней будет проверка выводимых данных на существование в выводе.
     
    #32 Drunkenmunky, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  8. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0


    Да, в Вашем примере это так. Но мне приходит каждый раз новый файл/он обновляется.
    Если его поставить в цикл считывания с задержкой или без, то он либо считывает много раз и записывает одно и тоже, либо пропускает - не успевает считать обновление файла.

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

    Мне для простоты понимания нужна именно такая форма
    0.3с Обновился?
    нет
    0.3с Обновился?
    нет
    0.3с Обновился?
    да
    прочитал и записал
    0.3с Обновился?
    нет
     
  9. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Не совсем понимаю значение "приходит".
     
  10. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Посылается запрос одной программой -> я получаю ответ от второй программы - в виде xml файла он записывается/перезаписывается -> и на последнем этапе уже подключается этот скрипт, чтобы парсить xml.

    По сколку сам процесс происходит через разные программы итд, это и выглядит очень коряво. Но по сути просто хочу "приклеится" этим скриптом к этому файлу и обязательно через php.
     
    #35 kaufmanndk, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  11. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    То есть ASIN это уникальный элемент?
    Значит нужно проверять его наличие в выходном файле, и если он там есть, этот номер не обрабатывать.
    Но, всё равно, возможна запись повторов.
    Если подключатся сразу несколько процессов с одинаковыми "номерами".
    Нужно записывать не в файл, а в базу данных.
    Назначив ASIN уникальным ключом.
     
  12. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Да, Asin это уникальный номер.
    И Ваш вариант с базой данныx конечно более грамотный и правильный.
    Но мне нужно, что бы именно в обычный текстовой файл шла запись скриптом, так как уже к этому файлу подключится другой скрипт, написанный на Autoit, именно уже для автоматизации работы самих программ на компьютере.
    Я поверхностно знаю Autoit и уже делал в самом Autoit такие примитивные схемы.

    0.3с Обновился?
    нет
    0.3с Обновился?
    да
    прочитал и записал
    0.3с Обновился?
    нет

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

    Но как это реализовать php не знаю.
     
  13. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Ну, тогда только проверка существования "номера" в файле.
    С возможностью повторной записи придется смириться.
     
  14. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Такой вариант тоже сойдёт. Мне просто уже к среде надо, что бы хоть как то работало. А потом у меня будет время самому, изучать и что то менять.
    Если у Вас будет время, напишите пожалуйста. Сам я не успею да и не смогу.
    --- Добавлено ---
    Может как то можно с помощью этого ?
    https://www.php.net/manual/ru/function.stat.php
    ctime время последнего изменения inode (временная метка Unix)

    Но как я уже сказал, буду рад любому варианту.
    Но у меня есть опасение, что при варианте проверки номера, скрипт не будет успевать за обновлениями файла. Так как файл в который будет записывать скрипт и проверят наличие номера, будет разрастаться то 100 тыс строк или даже 1 млн.
     
    #39 kaufmanndk, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  15. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Это даст информацию о файле, а не его содержимом.
    Считывать содержимое и искать в нем отсутствующее значение несложно.
    Проблема в размере этого файла.
    С каждым разом это будет занимать всё больше и больше времени.
    То есть или его нужно периодически очищать.
    Или этих файлов должно быть множество. Скажем раз в час создавать новый.
    Например 'filename_2021-03-06_15-00.txt'
    Сможете ли вы в "Autoit" правильно задать имя файла для считывания?
     
    kaufmanndk нравится это.
  16. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Так ведь можно не проверять файл в который идёт запись. Так как ASIN в получeных Xml никогда не повторяются. Дубликаты возникают, только из за работы скрипта.

    Можно ведь сделать так.
    берётся переменная и приравнивается к последнему изменению xml - файла.
    Потом скрипт считывает и записывает.
    Через 0.3 секунды спрашивает, был ли файл изменён? Если переменная осталась прежней, то не считывать xml, если переменная поменялась то считывать. Мне кажется так можно сделать.

    Да, я могу указать имена в ауотите.
     
    #41 kaufmanndk, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  17. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Эта информация кэшируется.
    На её обновление тоже нужно время.
    И непонятно с чем сравнивать.
    Приведите пример.
     
  18. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Я с ходу так не напишу. Но у меня был где то скрипт.
    Там всё просто. Проверялось сколько документов в папке например 10, у этих 10 были названия 1,2,3,4 итд...
    Это я точно смогу сделать. Но для простоты для меня будет лучше если Вы будите называть файлы 1,2,3,4 ...
    Поскольку файлы будут генерироваться в процессе работы скрипта на php, то на аутоите можно просто поставить цикл на опрос сколько файлов в папке итд.
    Я думаю если разбить файл по 1000 строк, то php скрипт будет успевать



    На счёт изменения файла.
    У меня есть скрипт на аутоите, он считывает файл которые меняется примерно раз в секунду. Скрипт считывает количество строк в массив и при изменении массива, считывает новые строки.
    Тут это не совсем подойдёт конечно, но работает бодро. Я и подумал, что запрос на изменение не должен вызвать большой задержки.
     
    #43 kaufmanndk, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  19. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Задержка и есть небольшая.
    Но достаточная чтобы два или больше процесса вступили в конфликт.
    Мне нужен пример имени файла с меткой времени в нем. В любом формате.
     
  20. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Извините не совсем Вас понимаю.

    Я имел ввиду, что Ваш скрипт Будет генерировать файлы по 1000 строк с названием 1,2,3,4,5... и тем самым не будет разрастаться время на проверку (Я думаю 1000 строк это не много, ну или по 500)
    А я уже с помощью аутоита смогу их прочитать. Ведь скорость работы Autoita уже не так важна, ему спешить не куда.
    Удалять файлы я буду сам, после пару часов работы скрипта. Мне главное, что бы к среде уже как ни будь стартануть, то что коряво это не страшно.

    .
     
    #45 kaufmanndk, 6 мар 2021
    Последнее редактирование: 6 мар 2021
  21. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Теперь я не понимаю.
    Смотрите.
    Вы записываете данные в конец некоего файла.
    Чтобы ограничить количество строк в нем, его нужно сначала считать, посчитать строки.
    Если строк больше заданного - то задать новое имя файла увеличив значение на единицу и записывать в него.
    Это тоже занимает время. Тоже небольшое.
    И тоже возможен конфликт процессов.

    Что я предлагаю.
    Имя файла задается переменной один раз, и зависит от системного времени. Пример выше приводил.
    Попробуйте в Autoit задать имя таким образом.
    Если не получится, то вернемся к варианту с периодической очисткой файла.
     
  22. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    В общем моих знаний и тут не хватило. Так с наскоку я тоже не осилю. Увы.
    Давайте сразу с отчисткой файла делать, если у вас будет время.
     
  23. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.504
    Симпатии:
    283
    Хорошо.
    Давайте ваш готовый скрипт, я добавлю что нужно.
     
    kaufmanndk нравится это.
  24. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    У меня так всё сложно тут.
    Мой скрипт зациклен и связан с другим скриптом. А тот скрипт использует АПИ клйчи без которых он работать не будет.
    Я знаю, я нагородил тут огород, сам в ужасе.

    Я сделал проще. оставил работать скрипт какое то время, потом скопировал текстовой файл удалил с помощью аутоита все строки, которые повторяются и уже спокойно работал. не в "реальном времени конечно", но пока я думаю и так сойдёт.
    Спасибо вам за различные варианты и предложения, на счёт создания файлов с временной отметкой в атоите я ещё подумаю.
     
  25. kaufmanndk

    kaufmanndk Новичок

    С нами с:
    2 мар 2021
    Сообщения:
    32
    Симпатии:
    0
    Извините что снова беспокою, но я при тестировании наткнулся на одну проблему.

    Asin - Номера могу заканчиваться на "X" например 383626231X
    Я прикрепил файл, там первый и последний номер заканчиваются на X.
    И к сожалению таким способом $result2 = $objXmlDocument->xpath('//r:ASIN'); скрипт их не видит.