Save all currently accumulated repository changes as a backup snapshot for Gitea so no local work is lost.
194 lines
9.8 KiB
PHP
194 lines
9.8 KiB
PHP
<?php
|
||
/**
|
||
* Анализ: почему веб-интерфейс Nextcloud медленный, а API (n8n) быстрый
|
||
*/
|
||
|
||
error_reporting(E_ALL);
|
||
ini_set('display_errors', 1);
|
||
|
||
echo "════════════════════════════════════════════════════════════════════════════════\n";
|
||
echo "🔍 АНАЛИЗ: ВЕБ-ИНТЕРФЕЙС VS API (n8n)\n";
|
||
echo "════════════════════════════════════════════════════════════════════════════════\n\n";
|
||
|
||
$nextcloudUrl = 'https://office.clientright.ru:8443';
|
||
$username = 'admin';
|
||
$password = 'office'; // Нужно проверить правильный пароль
|
||
|
||
// 1. Что использует n8n (WebDAV PROPFIND)
|
||
echo "1️⃣ ЧТО ИСПОЛЬЗУЕТ n8n (БЫСТРО):\n";
|
||
echo "────────────────────────────────────────────────────────────────────────────\n";
|
||
echo " API: WebDAV PROPFIND\n";
|
||
echo " URL: /remote.php/dav/files/{username}/{path}\n";
|
||
echo " Метод: PROPFIND\n";
|
||
echo " Depth: 1 (только прямые дети)\n";
|
||
echo " Формат: XML\n\n";
|
||
|
||
$testPath = '/crm/crm2/CRM_Active_Files/Documents/Project';
|
||
$webdavUrl = $nextcloudUrl . '/remote.php/dav/files/' . $username . $testPath;
|
||
|
||
echo " 📍 Тестовый путь: $testPath\n";
|
||
echo " 🔗 URL: $webdavUrl\n\n";
|
||
|
||
$xmlRequest = '<?xml version="1.0"?>
|
||
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
|
||
<d:prop>
|
||
<d:displayname/>
|
||
<d:getcontentlength/>
|
||
<d:getlastmodified/>
|
||
<oc:fileid/>
|
||
</d:prop>
|
||
</d:propfind>';
|
||
|
||
$startTime = microtime(true);
|
||
$ch = curl_init($webdavUrl);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
|
||
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PROPFIND');
|
||
curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlRequest);
|
||
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
||
'Depth: 1',
|
||
'Content-Type: application/xml'
|
||
]);
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
|
||
|
||
$response = curl_exec($ch);
|
||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
$duration = (microtime(true) - $startTime) * 1000;
|
||
curl_close($ch);
|
||
|
||
echo " ⏱️ Время выполнения: " . round($duration, 2) . " мс\n";
|
||
echo " 📊 HTTP код: $httpCode\n";
|
||
|
||
if ($httpCode == 207) {
|
||
$xml = simplexml_load_string($response);
|
||
if ($xml) {
|
||
$count = 0;
|
||
foreach ($xml->xpath('//d:response') as $response) {
|
||
$count++;
|
||
}
|
||
echo " 📁 Найдено элементов: $count\n";
|
||
}
|
||
echo " ✅ Это то, что использует n8n - работает быстро!\n";
|
||
} else {
|
||
echo " ⚠️ Ошибка (возможно нужен другой пароль)\n";
|
||
}
|
||
|
||
// 2. Что использует веб-интерфейс Nextcloud
|
||
echo "\n2️⃣ ЧТО ИСПОЛЬЗУЕТ ВЕБ-ИНТЕРФЕЙС (МЕДЛЕННО):\n";
|
||
echo "────────────────────────────────────────────────────────────────────────────\n";
|
||
echo " Nextcloud веб-интерфейс использует СВОЙ API, не WebDAV!\n\n";
|
||
|
||
echo " 📋 Возможные endpoints:\n";
|
||
echo " 1. /apps/files/ajax/list.php - список файлов\n";
|
||
echo " 2. /index.php/apps/files/api/v1/files - Files API\n";
|
||
echo " 3. /ocs/v2.php/apps/files/api/v1/files - OCS Files API\n";
|
||
echo " 4. JavaScript делает запросы через fetch() к внутренним API\n\n";
|
||
|
||
// Проверяем Files API
|
||
echo " 🔍 Проверяем Files API:\n";
|
||
$filesApiUrl = $nextcloudUrl . '/index.php/apps/files/api/v1/files?dir=' . urlencode($testPath);
|
||
|
||
$startTime = microtime(true);
|
||
$ch = curl_init($filesApiUrl);
|
||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
||
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
|
||
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
|
||
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
|
||
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/nc_cookies.txt');
|
||
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/nc_cookies.txt');
|
||
|
||
$response = curl_exec($ch);
|
||
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
|
||
$duration = (microtime(true) - $startTime) * 1000;
|
||
curl_close($ch);
|
||
|
||
echo " URL: $filesApiUrl\n";
|
||
echo " ⏱️ Время: " . round($duration, 2) . " мс\n";
|
||
echo " 📊 HTTP код: $httpCode\n";
|
||
|
||
if ($httpCode == 200) {
|
||
$data = json_decode($response, true);
|
||
if ($data && isset($data['data'])) {
|
||
echo " 📁 Найдено элементов: " . count($data['data']) . "\n";
|
||
}
|
||
} else {
|
||
echo " ⚠️ Может требовать сессию или другой формат\n";
|
||
}
|
||
|
||
// 3. Разница в логике
|
||
echo "\n3️⃣ РАЗНИЦА В ЛОГИКЕ:\n";
|
||
echo "────────────────────────────────────────────────────────────────────────────\n";
|
||
|
||
echo " ✅ n8n (WebDAV PROPFIND):\n";
|
||
echo " - Прямой запрос к S3 через Nextcloud\n";
|
||
echo " - Только список файлов (минимальные данные)\n";
|
||
echo " - Один запрос = один ответ\n";
|
||
echo " - Быстро! ⚡\n\n";
|
||
|
||
echo " ❌ Веб-интерфейс Nextcloud:\n";
|
||
echo " - Использует внутренний Files API\n";
|
||
echo " - Может делать НЕСКОЛЬКО запросов:\n";
|
||
echo " • Список файлов\n";
|
||
echo " • Метаданные (размеры, даты)\n";
|
||
echo " • Права доступа\n";
|
||
echo " • Превью (если включены)\n";
|
||
echo " • Теги и комментарии\n";
|
||
echo " - Может проверять кеш Nextcloud (oc_filecache)\n";
|
||
echo " - Если кеш устарел - сканирует S3\n";
|
||
echo " - Медленно! 🐌\n\n";
|
||
|
||
// 4. Почему веб-интерфейс медленный
|
||
echo "4️⃣ ПОЧЕМУ ВЕБ-ИНТЕРФЕЙС МЕДЛЕННЫЙ:\n";
|
||
echo "────────────────────────────────────────────────────────────────────────────\n";
|
||
|
||
echo " 🔍 Возможные причины:\n\n";
|
||
|
||
echo " 1. Nextcloud проверяет кеш (oc_filecache)\n";
|
||
echo " - Если кеш устарел → сканирует S3\n";
|
||
echo " - filesystem_check_changes=0 должно помочь, но...\n\n";
|
||
|
||
echo " 2. Веб-интерфейс делает ДОПОЛНИТЕЛЬНЫЕ запросы:\n";
|
||
echo " - Запрос метаданных для каждого файла\n";
|
||
echo " - Запрос прав доступа\n";
|
||
echo " - Запрос превью (если включены)\n";
|
||
echo " - Запрос тегов и комментариев\n\n";
|
||
|
||
echo " 3. JavaScript загружает данные ПОСТЕПЕННО:\n";
|
||
echo " - Сначала структура папок\n";
|
||
echo " - Потом метаданные файлов\n";
|
||
echo " - Потом превью\n";
|
||
echo " - Каждый запрос = задержка\n\n";
|
||
|
||
echo " 4. Nextcloud может сканировать ВСЮ папку:\n";
|
||
echo " - Даже если нужно показать только один уровень\n";
|
||
echo " - Проверяет все подпапки\n";
|
||
echo " - Особенно при filesystem_check_changes=1\n\n";
|
||
|
||
// 5. Решение
|
||
echo "5️⃣ РЕШЕНИЕ:\n";
|
||
echo "────────────────────────────────────────────────────────────────────────────\n";
|
||
|
||
echo " 💡 ИСПОЛЬЗОВАТЬ ПРЯМОЙ WebDAV API (как n8n):\n\n";
|
||
|
||
echo " Вместо открытия через веб-интерфейс:\n";
|
||
echo " https://office.clientright.ru:8443/apps/files/?dir=/crm/...\n\n";
|
||
|
||
echo " Использовать прямой WebDAV запрос:\n";
|
||
echo " https://office.clientright.ru:8443/remote.php/dav/files/admin/crm/...\n\n";
|
||
|
||
echo " Или создать свой endpoint в CRM, который:\n";
|
||
echo " 1. Делает PROPFIND запрос (как n8n)\n";
|
||
echo " 2. Парсит XML\n";
|
||
echo " 3. Возвращает JSON\n";
|
||
echo " 4. Кеширует результат в Redis\n\n";
|
||
|
||
echo " 📊 ОЖИДАЕМЫЙ ЭФФЕКТ:\n";
|
||
echo " - Вместо 3-5 секунд → 0.1-0.5 секунды\n";
|
||
echo " - Ускорение в 10-50 раз!\n\n";
|
||
|
||
echo "════════════════════════════════════════════════════════════════════════════════\n";
|
||
echo "✅ ИТОГ: Веб-интерфейс делает больше запросов, чем нужно\n";
|
||
echo "💡 Решение: Использовать прямой WebDAV API (как n8n)\n";
|
||
echo "════════════════════════════════════════════════════════════════════════════════\n";
|