Спасибо, да это работает. Но есть один недостаток, который усложнит мне работу в дальнейшем. Вы указали номера как массив зная их/взяв их из файла. Но мне нужно, что бы номера были считаны исключительно из самой ХМЛ, так как есть две проблемы. 1) Сама база с номерами будет достигать около 1 миллиона (1 мио. строк). Иногда номера будут менять своё местоположение (не зафиксированы в строчках скажем так), база будет пополнятся автоматически на стороннем сервере. Если я правильно понимаю, то если он будет перебирать номера из базы данных и сравнивать их всего с 20 номерами в xml, то программа будет работать медленно и забивать память. 2) Я не имею доступа к обновлению базы в случае появления новых номеров в базе у стороннего сервера, я буду получать xml с этими номерами но не буду их видеть так как у меня база данных будет не актуальна. У меня не всегда есть доступ к базе данных и программе, которая создаёт xml. Поэтому я и сконцентрировался именно на самом конечном xml, который я получаю и очень важно, что бы все номера были взяты только от туда. Можно ли сделать массив номеров из самого xml?
Всё работает ! Спасибо огромное. Маленький вопрос Как сделать, что бы файл дописывался, а не переписывался Я добавляю FILE_APPEND, но получается ерунда всё равно. Не могу понять куда именно его надо вставить. PHP: file_put_contents( 'filename.txt', join(PHP_EOL, $out).FILE_APPEND);
Здравствуйте. Столкнулся с такой проблемой. xml файл, который я получаю обновляется /перезаписывается с различным интервалом времени 2-10 секунд. Скрипт за это время прочитывает много раз файл и делает много повторныx записей. Ставить просто задержку тоже не вариант. Можно ли сделать так, что бы xml файл считывался только один раз при обновлении/изменении его и ждал до следующего изменения/обновления. К примеру, что бы скрипт спрашивал каждые 0.3 секунды изменился ли файл, если да, то делать запись и ждать до следующего изменнения xml.
Что-то вы неправильно делаете. В общем случае xml считывается один раз. Обрабатываются данные, Возможно, длительно, в пределах лимита времени работы скрипта. Записывается или выводится результат. Если вы параллельно запускаете его еще несколько раз, то нужно обеспечить блокировку на запись выходного файла. Также не лишней будет проверка выводимых данных на существование в выводе.
Да, в Вашем примере это так. Но мне приходит каждый раз новый файл/он обновляется. Если его поставить в цикл считывания с задержкой или без, то он либо считывает много раз и записывает одно и тоже, либо пропускает - не успевает считать обновление файла. Скрипт нужно поставить в цикл, где триггером будет обновление файла, что бы он считывал его только один раз. А сам запрос на "обновился ли файл", поставить в цикл с интервалом 0.3 секунды Мне для простоты понимания нужна именно такая форма 0.3с Обновился? нет 0.3с Обновился? нет 0.3с Обновился? да прочитал и записал 0.3с Обновился? нет
Посылается запрос одной программой -> я получаю ответ от второй программы - в виде xml файла он записывается/перезаписывается -> и на последнем этапе уже подключается этот скрипт, чтобы парсить xml. По сколку сам процесс происходит через разные программы итд, это и выглядит очень коряво. Но по сути просто хочу "приклеится" этим скриптом к этому файлу и обязательно через php.
То есть ASIN это уникальный элемент? Значит нужно проверять его наличие в выходном файле, и если он там есть, этот номер не обрабатывать. Но, всё равно, возможна запись повторов. Если подключатся сразу несколько процессов с одинаковыми "номерами". Нужно записывать не в файл, а в базу данных. Назначив ASIN уникальным ключом.
Да, Asin это уникальный номер. И Ваш вариант с базой данныx конечно более грамотный и правильный. Но мне нужно, что бы именно в обычный текстовой файл шла запись скриптом, так как уже к этому файлу подключится другой скрипт, написанный на Autoit, именно уже для автоматизации работы самих программ на компьютере. Я поверхностно знаю Autoit и уже делал в самом Autoit такие примитивные схемы. 0.3с Обновился? нет 0.3с Обновился? да прочитал и записал 0.3с Обновился? нет Поэтому я и хочу такие решения, что бы в дальнейшем я мог, что со сам менять и не тревожить людей на форумах по мелочам. Если записывать в базу данных, то мне придётся разбираться с этим в Autoite. Что тоже для меня будет не легче. Но как это реализовать php не знаю.
Ну, тогда только проверка существования "номера" в файле. С возможностью повторной записи придется смириться.
Такой вариант тоже сойдёт. Мне просто уже к среде надо, что бы хоть как то работало. А потом у меня будет время самому, изучать и что то менять. Если у Вас будет время, напишите пожалуйста. Сам я не успею да и не смогу. --- Добавлено --- Может как то можно с помощью этого ? https://www.php.net/manual/ru/function.stat.php ctime время последнего изменения inode (временная метка Unix) Но как я уже сказал, буду рад любому варианту. Но у меня есть опасение, что при варианте проверки номера, скрипт не будет успевать за обновлениями файла. Так как файл в который будет записывать скрипт и проверят наличие номера, будет разрастаться то 100 тыс строк или даже 1 млн.
Это даст информацию о файле, а не его содержимом. Считывать содержимое и искать в нем отсутствующее значение несложно. Проблема в размере этого файла. С каждым разом это будет занимать всё больше и больше времени. То есть или его нужно периодически очищать. Или этих файлов должно быть множество. Скажем раз в час создавать новый. Например 'filename_2021-03-06_15-00.txt' Сможете ли вы в "Autoit" правильно задать имя файла для считывания?
Так ведь можно не проверять файл в который идёт запись. Так как ASIN в получeных Xml никогда не повторяются. Дубликаты возникают, только из за работы скрипта. Можно ведь сделать так. берётся переменная и приравнивается к последнему изменению xml - файла. Потом скрипт считывает и записывает. Через 0.3 секунды спрашивает, был ли файл изменён? Если переменная осталась прежней, то не считывать xml, если переменная поменялась то считывать. Мне кажется так можно сделать. Да, я могу указать имена в ауотите.
Эта информация кэшируется. На её обновление тоже нужно время. И непонятно с чем сравнивать. Приведите пример.
Я с ходу так не напишу. Но у меня был где то скрипт. Там всё просто. Проверялось сколько документов в папке например 10, у этих 10 были названия 1,2,3,4 итд... Это я точно смогу сделать. Но для простоты для меня будет лучше если Вы будите называть файлы 1,2,3,4 ... Поскольку файлы будут генерироваться в процессе работы скрипта на php, то на аутоите можно просто поставить цикл на опрос сколько файлов в папке итд. Я думаю если разбить файл по 1000 строк, то php скрипт будет успевать На счёт изменения файла. У меня есть скрипт на аутоите, он считывает файл которые меняется примерно раз в секунду. Скрипт считывает количество строк в массив и при изменении массива, считывает новые строки. Тут это не совсем подойдёт конечно, но работает бодро. Я и подумал, что запрос на изменение не должен вызвать большой задержки.
Задержка и есть небольшая. Но достаточная чтобы два или больше процесса вступили в конфликт. Мне нужен пример имени файла с меткой времени в нем. В любом формате.
Извините не совсем Вас понимаю. Я имел ввиду, что Ваш скрипт Будет генерировать файлы по 1000 строк с названием 1,2,3,4,5... и тем самым не будет разрастаться время на проверку (Я думаю 1000 строк это не много, ну или по 500) А я уже с помощью аутоита смогу их прочитать. Ведь скорость работы Autoita уже не так важна, ему спешить не куда. Удалять файлы я буду сам, после пару часов работы скрипта. Мне главное, что бы к среде уже как ни будь стартануть, то что коряво это не страшно. .
Теперь я не понимаю. Смотрите. Вы записываете данные в конец некоего файла. Чтобы ограничить количество строк в нем, его нужно сначала считать, посчитать строки. Если строк больше заданного - то задать новое имя файла увеличив значение на единицу и записывать в него. Это тоже занимает время. Тоже небольшое. И тоже возможен конфликт процессов. Что я предлагаю. Имя файла задается переменной один раз, и зависит от системного времени. Пример выше приводил. Попробуйте в Autoit задать имя таким образом. Если не получится, то вернемся к варианту с периодической очисткой файла.
В общем моих знаний и тут не хватило. Так с наскоку я тоже не осилю. Увы. Давайте сразу с отчисткой файла делать, если у вас будет время.
У меня так всё сложно тут. Мой скрипт зациклен и связан с другим скриптом. А тот скрипт использует АПИ клйчи без которых он работать не будет. Я знаю, я нагородил тут огород, сам в ужасе. Я сделал проще. оставил работать скрипт какое то время, потом скопировал текстовой файл удалил с помощью аутоита все строки, которые повторяются и уже спокойно работал. не в "реальном времени конечно", но пока я думаю и так сойдёт. Спасибо вам за различные варианты и предложения, на счёт создания файлов с временной отметкой в атоите я ещё подумаю.
Извините что снова беспокою, но я при тестировании наткнулся на одну проблему. Asin - Номера могу заканчиваться на "X" например 383626231X Я прикрепил файл, там первый и последний номер заканчиваются на X. И к сожалению таким способом $result2 = $objXmlDocument->xpath('//r:ASIN'); скрипт их не видит.