Почему при попытке открыть XML файл документ оказывается пустым?

Здравствуйте. 

У меня есть выгрузка товаров, и мне нужно получить данные из файла формата PHP, который по сути содержит информацию в XML-формате. Ссылка на файл: <a href="https://wisell.ru/bitrix/catalog_export/yandex_wisell_opt_gp.php" rel="nofollow">https://wisell.ru/bitrix/catalog_export/yandex_wis...</a>. 

При прямом обращении к файлу или загрузке его с помощью wget данные отображаются корректно, но при использовании PHP я не могу их получить. Когда я использую <code class="php">file_get_contents()</code>, возникает ошибка таймаута; при использовании <code class="php">curl</code> я получаю пустой ответ; и <code class="php">simplexml_load_file</code> также возвращает пустой ответ. 

Подскажите, в чем может быть проблема?
  • 26 сентября 2024 г. 4:53
Ответы на вопрос 2
Проблема, с которой вы столкнулись, может быть связана с несколькими факторами при попытке получить контент XML файла с помощью PHP. Рассмотрим несколько возможных причин и решений:

1. **HTTP-заголовки и параметры запроса**:
   Некоторые серверы могут требовать определенные HTTP-заголовки, такие как `User-Agent`, чтобы разрешить запросы с определённых источников. Попробуйте использовать CURL с установленным заголовком `User-Agent`, как показано ниже:

   ```php
   $url = "https://wisell.ru/bitrix/catalog_export/yandex_wisell_opt_gp.php";

   $ch = curl_init();
   curl_setopt($ch, CURLOPT_URL, $url);
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
   curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36');
   $response = curl_exec($ch);

   if (curl_errno($ch)) {
       echo 'Error: ' . curl_error($ch);
   } else {
       // Проверка на пустой ответ
       if (!empty($response)) {
           // Обработка XML
           $xml = simplexml_load_string($response);
           print_r($xml);
       } else {
           echo "Пустой ответ от сервера.";
       }
   }

   curl_close($ch);
   ```

2. **Проблемы с таймаутом**:
   Убедитесь, что настройки таймаута в вашем PHP-коде достаточны для обработки запроса. Вы можете изменить время ожидания с помощью параметров `CURLOPT_TIMEOUT` и `CURLOPT_CONNECTTIMEOUT`:

   ```php
   curl_setopt($ch, CURLOPT_TIMEOUT, 30); // Установка таймаута на 30 секунд
   ```

3. **Сертификаты SSL**:
   В случае, если сервер использует SSL, возможно, у вас возникают проблемы с проверкой сертификата. Вы можете отключить проверку SSL, добавив следующую строку (что не рекомендуется для продакшн окружений):

   ```php
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
   ```

4. **Ошибки сервера**:
   Возможно, сервер возвращает ошибки, которые не отображаются в вашем коде. Попробуйте вывести HTTP код ответа:

   ```php
   $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
   echo "HTTP Code: $httpCode";
   ```

5. **Проблема с кодировкой**:
   Убедитесь, что вы правильно обрабатываете кодировку, особенно если файл получает данные динамически. Иногда может потребоваться преобразовать кодировку с помощью `mb_convert_encoding()`.

Если эти шаги не помогут, вы можете попробовать изучить логи сервера или использовать другие инструменты для отладки, чтобы выяснить, что происходит при запросе к вашему исходному URL.
В curl() можно получить точный текст запроса к серверу. 
Вот смотрите его и текст запроса из обычного браузера, сравниваете построчно буква в букву.
Если есть разница - меняете запрос curl(), что бы повторял запрос браузера. И т.д. и т.п.
Похожие вопросы