Перейти к содержимому
Вы сказали:
На PHP собрать все файлы *.json в папках и подпапках Может быть очень много файлов Пример пути attachments\2020\06\04\b12783481fafe55fbca93d66d9db9d32\1591269626.json Каждый файл *.json (пример 1591269626.json) имеет массив Пример структуры массива {"status":"success","data":{"0":{"uid":6,"subject":"\u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u043e\u043d\u0441\u0443\u043b\u044c\u0442\u0430\u0446\u0438\u044f","date":"2020-06-04 02:20:24pm","from":{"address":"Kvokov@sar-steklo.ru","name":"\u041a\u0432\u043e\u043a\u043e\u0432 \u0421\u0435\u0440\u0433\u0435\u0439 \u041f\u0435\u0442\u0440\u043e\u0432\u0438\u0447"},"message":"<html xmlns:v=\"urn:schemas-microsoft-com:vml\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:w=\"urn:schemas-microsoft-com:office:word\" xmlns:m=\"http:\/\/schemas.microsoft.com\/office\/2004\/12\/omml\" xmlns=\"http:\/\/www.w3.org\/TR\/REC-html40\">\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text\/html; charset=koi8-r\">\r\n<meta name=\"Generator\" content=\"Microsoft Word 14 (filtered medium)\">\r\n<style><!--\r\n\/* Font Definitions *\/\r\n@font-face\r\n\t{font-family:Calibri;\r\n\tpanose-1:2 15 5 2 2 2 4 3 2 4;}\r\n\/* Style Definitions *\/\r\np.MsoNormal, li.MsoNormal, div.MsoNormal\r\n\t{margin:0cm;\r\n\tmargin-bottom:.0001pt;\r\n\tfont-size:11.0pt;\r\n\tfont-family:\"Calibri\",\"sans-serif\";\r\n\tmso-fareast-language:EN-US;}\r\na:link, span.MsoHyperlink\r\n\t{mso-style-priority:99;\r\n\tcolor:blue;\r\n\ttext-decoration:underline;}\r\na:visited, span.MsoHyperlinkFollowed\r\n\t{mso-style-priority:99;\r\n\tcolor:purple;\r\n\ttext-decoration:underline;}\r\nspan.EmailStyle17\r\n\t{mso-style-type:personal-compose;\r\n\tfont-family:\"Calibri\",\"sans-serif\";\r\n\tcolor:windowtext;}\r\n.MsoChpDefault\r\n\t{mso-style-type:export-only;\r\n\tfont-family:\"Calibri\",\"sans-serif\";\r\n\tmso-fareast-language:EN-US;}\r\n@page WordSection1\r\n\t{size:612.0pt 792.0pt;\r\n\tmargin:2.0cm 42.5pt 2.0cm 3.0cm;}\r\ndiv.WordSection1\r\n\t{page:WordSection1;}\r\n--><\/style><!--[if gte mso 9]><xml>\r\n<o:shapedefaults v:ext=\"edit\" spidmax=\"1026\" \/>\r\n<\/xml><![endif]--><!--[if gte mso 9]><xml>\r\n<o:shapelayout v:ext=\"edit\">\r\n<o:idmap v:ext=\"edit\" data=\"1\" \/>\r\n<\/o:shapelayout><\/xml><![endif]-->\r\n<\/head>\r\n<body lang=\"RU\" link=\"blue\" vlink=\"purple\">\r\n<div class=\"WordSection1\">\r\n<p class=\"MsoNormal\">?????? ????.<o:p><\/o:p><\/p>\r\n<p class=\"MsoNormal\">????? ? ??? ? ???? ????? ??????????<o:p><\/o:p><\/p>\r\n<p class=\"MsoNormal\">???????.<o:p><\/o:p><\/p>\r\n<p class=\"MsoNormal\"><o:p>&nbsp;<\/o:p><\/p>\r\n<p class=\"MsoNormal\">?????? ?????? ????????,<o:p><\/o:p><\/p>\r\n<p class=\"MsoNormal\">????????? ??????? ???????????? ??????? ???????? ? ?????????<o:p><\/o:p><\/p>\r\n<p class=\"MsoNormal\">?? &laquo;??????????????????&raquo; <o:p><\/o:p><\/p>\r\n<p class=\"MsoNormal\">???. 8 8452 305232&nbsp; &nbsp;8&nbsp;987&nbsp;811 30 34<o:p><\/o:p><\/p>\r\n<\/div>\r\n<\/body>\r\n<\/html>\r\n","attachments":[]},"udate":1591269626,"uid_id":"<E65DD1F8E9B14947BA267F8534FA2F5BF1E65DE9@Igor16.steklo.com>","inbox_id":404,"message_id":null}} В этом массиве осуществить поиск в "subject" "address" "message" по ключевому слову который приходит с запросом POST globSearch Собранные совпадение собрать в Массив $globOutput
ChatGPT сказал:

Вот полный пример кода на PHP, который:

  1. Рекурсивно ищет все файлы .json в указанной папке и подпапках;

  2. Читает содержимое каждого файла;

  3. Декодирует JSON;

  4. Ищет ключевое слово из $_POST['globSearch'] в полях subject, address и message;

  5. Собирает все найденные совпадения в массив $globOutput.


✅ Пример PHP-скрипта:

php
<?php // Получение ключевого слова из POST-запроса $keyword = isset($_POST['globSearch']) ? $_POST['globSearch'] : ''; if (empty($keyword)) { die("Не указано ключевое слово для поиска."); } // Папка, с которой начинается обход (например, 'attachments') $baseDir = __DIR__ . '/attachments'; // Массив для хранения совпадений $globOutput = []; /** * Рекурсивная функция обхода директорий и поиска JSON-файлов */ function scanForJsonFiles($dir, $keyword, &$globOutput) { $files = scandir($dir); foreach ($files as $file) { if ($file === '.' || $file === '..') continue; $fullPath = $dir . DIRECTORY_SEPARATOR . $file; if (is_dir($fullPath)) { scanForJsonFiles($fullPath, $keyword, $globOutput); } elseif (pathinfo($fullPath, PATHINFO_EXTENSION) === 'json') { processJsonFile($fullPath, $keyword, $globOutput); } } } /** * Обработка одного JSON-файла */ function processJsonFile($filePath, $keyword, &$globOutput) { $content = @file_get_contents($filePath); if ($content === false) return; $json = json_decode($content, true); if (json_last_error() !== JSON_ERROR_NONE) return; // Проверяем, есть ли нужные поля if (!isset($json['data']) || !is_array($json['data'])) return; foreach ($json['data'] as $entry) { // Проверка наличия ключей $subject = $entry['subject'] ?? ''; $address = $entry['from']['address'] ?? ''; $message = $entry['message'] ?? ''; // Поиск по ключевому слову (регистр не учитывается) if ( stripos($subject, $keyword) !== false || stripos($address, $keyword) !== false || stripos($message, $keyword) !== false ) { $entry['_source_file'] = $filePath; // Добавим путь к файлу $globOutput[] = $entry; } } } // Запускаем обход scanForJsonFiles($baseDir, $keyword, $globOutput); // Возвращаем результат в виде JSON header('Content-Type: application/json; charset=utf-8'); echo json_encode($globOutput, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

📌 Особенности:

  • Поиск не чувствителен к регистру (используется stripos).

  • Добавляется поле _source_file в результат, чтобы было видно откуда данные.

  • Обработка большого числа файлов может занять время, особенно на HDD — можно добавить set_time_limit(0); если это долгий процесс.

  • Убедитесь, что структура JSON одинаковая во всех файлах.


Если нужен CLI-скрипт (для запуска в консоли), или чтобы результат писать в файл, — скаж

A network error occurred. Please check your connection and try again. If this issue persists please contact us through our help center at help.openai.com.

Вы сказали:
scanForJsonFiles долгий поиск файлов возможно ускорить ?
ChatGPT сказал:

Да, поиск файлов через scandir() с рекурсией работает, но он медленный при большом количестве файлов. Вот способы, как ускорить поиск .json файлов:


🔧 1. Использовать RecursiveDirectoryIterator + RegexIterator (быстрее, чем scandir())

Это встроенный механизм SPL (Standard PHP Library), работает на уровне файловой системы эффективнее:

✅ Улучшенная версия сканирования:

php
function scanJsonFilesFast($baseDir, $keyword, &$globOutput) { $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($baseDir, FilesystemIterator::SKIP_DOTS) ); $regex = new RegexIterator($iterator, '/\.json$/i', RecursiveRegexIterator::GET_MATCH); foreach ($regex as $files) { $filePath = $files[0]; // RegexIterator возвращает массив processJsonFile($filePath, $keyword, $globOutput); } }

И заменяешь вызов scanForJsonFiles(...) на:

php
scanJsonFilesFast($baseDir, $keyword, $globOutput);

🔋 Преимущества:

  • Работает быстрее.

  • Не делает лишние вызовы is_dir() и pathinfo().

  • Масштабируется лучше при большом количестве директорий и файлов.


🧠 2. Ускорения через кеширование (при повторных поисках)

Если пользователь часто ищет по одним и тем же файлам — можно:

  • Хранить список всех .json файлов в .cache.json;

  • Обновлять его раз в X минут;

  • Использовать кеш вместо нового обхода.

📦 Пример кэш-файла:

php
// Если cache существует и свежий — использовать его $cacheFile = __DIR__ . '/json_file_cache.json'; $cacheTTL = 300; // 5 минут if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTTL) { $jsonFiles = json_decode(file_get_contents($cacheFile), true); } else { // Генерируем список файлов и кешируем $jsonFiles = []; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($baseDir, FilesystemIterator::SKIP_DOTS) ); $regex = new RegexIterator($iterator, '/\.json$/i', RecursiveRegexIterator::GET_MATCH); foreach ($regex as $match) { $jsonFiles[] = $match[0]; } file_put_contents($cacheFile, json_encode($jsonFiles)); } // Далее вместо обхода просто обрабатываем каждый файл foreach ($jsonFiles as $filePath) { processJsonFile($filePath, $keyword, $globOutput); }

🛑 3. Чего лучше не делать:

  • glob('**/*.json') — работает только в Linux с GLOB_BRACE, и часто медленнее.

  • Хранить всё в одной папке — будет деградация производительности ФС.

  • Использовать базы данных типа SQLite на каждый вызов без индексации — даст обратный эффект.


⚡ ИТОГ

МетодСкоростьЛучшее применение
scandir()🐢 МедленноПростой код
RecursiveIterator🚀 БыстроБольшие каталоги
Кеширование путей⚡ Мгновенно (повторно)Частые поиски
SQLite с индексами🔥 Очень быстроЕсли нужно масштабировать

Хочешь — могу собрать гибрид: быстрый скан + кеш + CLI/HTTP интерфейс.

Вы сказали:
Давай соберем гибрид
ChatGPT сказал:

Отлично! Ниже — полноценный гибридный PHP-скрипт, который:


✅ Функции:

  1. Рекурсивно ищет .json файлы через RecursiveDirectoryIterator + RegexIterator;

  2. Кеширует список файлов в json_file_cache.json на N минут (по умолчанию 5);

  3. Обрабатывает только новые или изменённые файлы при следующем запуске;

  4. Ищет по ключевому слову из POST-запроса в полях: subject, from.address, message;

  5. Возвращает совпадения в JSON-массиве.


📁 Структура:

pgsql
project/ │ ├── attachments/ ← корень с файлами ├── search.php ← основной скрипт └── json_file_cache.json ← кеш (авто)

🔍 search.php — гибридный скрипт

php
<?php set_time_limit(0); header('Content-Type: application/json; charset=utf-8'); // === Конфигурация === $baseDir = __DIR__ . '/attachments'; $cacheFile = __DIR__ . '/json_file_cache.json'; $cacheTTL = 300; // 5 минут $keyword = isset($_POST['globSearch']) ? trim($_POST['globSearch']) : ''; if ($keyword === '') { echo json_encode(['error' => 'Не указано ключевое слово globSearch']); exit; } $globOutput = []; // === Получение списка файлов с кешированием === function getJsonFilesFromCache($baseDir, $cacheFile, $cacheTTL) { if (file_exists($cacheFile) && (time() - filemtime($cacheFile)) < $cacheTTL) { $cached = json_decode(file_get_contents($cacheFile), true); if (is_array($cached)) return $cached; } $jsonFiles = []; $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($baseDir, FilesystemIterator::SKIP_DOTS) ); $regex = new RegexIterator($iterator, '/\.json$/i', RecursiveRegexIterator::GET_MATCH); foreach ($regex as $match) { $filePath = $match[0]; $jsonFiles[] = [ 'path' => $filePath, 'mtime' => filemtime($filePath), ]; } file_put_contents($cacheFile, json_encode($jsonFiles, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)); return $jsonFiles; } // === Поиск в JSON-файле === function processJsonFile($filePath, $keyword, &$globOutput) { $content = @file_get_contents($filePath); if ($content === false) return; $json = json_decode($content, true); if (!isset($json['data']) || !is_array($json['data'])) return; foreach ($json['data'] as $entry) { $subject = $entry['subject'] ?? ''; $address = $entry['from']['address'] ?? ''; $message = $entry['message'] ?? ''; if ( stripos($subject, $keyword) !== false || stripos($address, $keyword) !== false || stripos($message, $keyword) !== false ) { $entry['_source_file'] = $filePath; $globOutput[] = $entry; } } } // === Основной процесс === $jsonFiles = getJsonFilesFromCache($baseDir, $cacheFile, $cacheTTL); foreach ($jsonFiles as $fileInfo) { if (!isset($fileInfo['path'])) continue; processJsonFile($fileInfo['path'], $keyword, $globOutput); } // === Результат === echo json_encode($globOutput, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT);

🧪 Пример запроса

Через curl, Postman или AJAX:

bash
curl -X POST -d "globSearch=консультация" http://localhost/search.php

⚙️ Хочешь добавить:

  • ✅ CLI-поддержку?

  • ✅ Асинхронную индексацию файлов?

  • ✅ Поиск по нескольким ключевым словам?

  • ✅ Экспорт в CSV?

Скажи — соберём модульно.

Получайте более умные ответы, загружайте файлы и изображения и многое другое.


ChatGPT может допускать ошибки. Рекомендуем проверять важную информацию.