За последние 24 часа нас посетили 17697 программистов и 1639 роботов. Сейчас ищут 1228 программистов ...

Обработка и получение информации из баз данных на разных хостингах.

Тема в разделе "PHP и базы данных", создана пользователем alex-777, 28 июн 2024.

  1. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Всем привет,

    Есть однотипные сайты (php + mysql) на разных хостингах, на многих даже закрыт доступ к базам извне. Необходимо сделать сводный отчет по всем базам.

    То есть нужно запустить скрипт на всех сайтах по очереди, и как-то вернуть результат. Или сохранить куда-нибудь на доступное хранилище, например google drive.

    То есть для меня непонятно,

    1. Как программно выполнить скрипт на другом хостинге, не открывая страницу сайта?
    2. Как можно вернуть результирующие данные?

    Толкните, куда копать.

    Спасибо
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    920
    Симпатии:
    143
     
  3. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    437
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Добрый день!
    Попробуйте записать один тот же скрипт на всех хостингах.
    Запускать это скрипт на разных хостингах по очереди можно через CronJob.
    Определите в crontab команды для запуска скрипта - время и интервал, для каждого хостинга.
    На одном из хостингов организуйте простой Web Сервис, на end point url, которого будут оправляться через cUrl результаты
    из скриптов со всех ностингов.
    На end point url сервиса, скрипт обработчик должен проверять права доступа и либо отколонять запросы либо их акцептировать т.е. сохранять результаты, где пожелаете.
    Удачи!
     
  4. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Попробовал по другому, но все равно с использованием curl.
    Подключение, отправка и получение результата, все работает.

    Но с curl у меня проблема с проверкой доступа. Нигде не нашел простого примера, или поверхностная инфа ни о чем, или чуть ли не разработка фрейморка.
     
  5. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    437
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Простой пример c Basic Authorization здесь https://www.edureka.co/community/92447/how-to-use-basic-authorization-in-php-curl
    PHP:
    1. $host = 'https://www.discussdesk.com/';
    2. $user_name = 'set_user_name';
    3. $password = 'set_password';
    4. $ch = curl_init($host);
    5. $headers = array(
    6. 'Content-Type: application/json',
    7. 'Authorization: Basic '. base64_encode("$user_name:$password")
    8. );
    9. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    10. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    11. $response = curl_exec($ch);
    12. if(curl_errno($ch)){
    13. // throw the an Exception.
    14. throw new Exception(curl_error($ch));
    15. }
    16. echo $response;
    Вы можете попробовать вместо 'Authorization: Basic '
    PHP:
    1. $token = "080042cad6356ad5dc0a720c18b53b8e53d4c274";
    2. ...
    3. "Authorization: Bearer $token"
    Неплохого бы проверять ip-адреса ностов, с которых отправляются запросы.
    Обычно, так делают на Веб Сервисах.
    Удачи!
     
    #5 Vladimir Kheifets, 30 июн 2024
    Последнее редактирование: 30 июн 2024
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Если сайты сами отправляют отчеты (по крону), можно «тупо» передавать ключик в POST-параметре. Каждый сайт может иметь свой ключик, чтобы прямо по нему определять источник отчета.
    --- Добавлено ---
    ...если нет отдельного логина или точки доступа.
     
    #6 miketomlin, 30 июн 2024
    Последнее редактирование: 30 июн 2024
  7. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    437
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Вместо ключика сайта (ностинга) можно использовать ip-адреса - они уникальные.
    Нужно только, завести таблицу белых ip-адресов и м.б. в таблице должны быть поля данных необходимых для отчетов.
    Если возникнут затруднения, покажите код.
     
  8. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Для меня логика задачи немного другая. Нужно не отправлять отчеты, а получать отчеты со всех сайтов на один.
    То есть пользователь открывает отчет и идет запрос на все сайты, то есть на каждом сайте запускается скрипт, который коннектится к базе данных и формирует массив данных. Инфа обрабатывается за полный предыдущий и текущий день, то есть сама обработка выполняется гораздо быстрее, чем отправка запроса/получение результата.
    Хостинг шаред основной системы не позволяет определить $_SERVER["REMOTE_HOST"] , только $_SERVER["REMOTE_ADDR"], но и этого думаю достаточно.

    Но есть пара вопросов по Basic Authorization, я читал что в этом случае пароль и логин отправляются в открытом виде,
    спасает ли в этом случае использование https?

    И какие могут быть риски?
    Могут ли злоумышленники навредить хосту, который принимает curl запросы?

    .
     
  9. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    920
    Симпатии:
    143
    По https не в открытом виде.
     
  10. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    437
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Добрый день!
    По https протоколу информация не передаётся в открытом виде.
    Однако в некоторых случаях этого бывает недостаточно.
    Решения по безопасности, в каждом конкретном случае, принимаются в зависимости от размера возможного ущерба
    от утечки данных и от выполнения нелегальных запросов.
    Наиболее серьезные решения реализуются в платёжных системах.
    Приведу пример кода платёжной системы Novalnet
    https://developer.novalnet.com/encryption/directapi

    Удачи!
     

    Вложения:

    • novalnet.zip
      Размер файла:
      3,5 КБ
      Просмотров:
      1
    #10 Vladimir Kheifets, 1 июл 2024
    Последнее редактирование: 1 июл 2024
  11. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Данные для постороннего не имеют смысла, просто массив цифр.
    Я волнуюсь только об потенциальной возможности взлома хостинга, на который отправляется запрос.

    И второе, натолкнулся на непонятку, если логин/пароль прописывать через
    Код (Text):
    1.     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    2.     curl_setopt($ch, CURLOPT_USERPWD, "$username:$pswd");
    то все работает, а если
    Код (Text):
    1.     $headers = array(
    2.         'Content-Type: application/json',
    3.         'Authorization: Basic '. base64_encode("$username:$pswd")
    4.     );
    5.  
    6.     curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    то в принимающем скрипте массив $_POST пустой.

    Не знаю, что может быть.
     
  12. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    437
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    Должно быть не массиве $_POST, а в $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW']
    см. https://www.php.net/manual/ru/features.http-auth.php
     
  13. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Это понятно, вот полный код
    Код (Text):
    1. <?php
    2.  
    3.     $host         = "https://crm.iconsultant.com.ua/curlto.php";
    4.     $username    = "root";
    5.     $pswd        = "123";
    6.     $cli_id        = 9;
    7.    
    8.     $params = [
    9.       "cli_type" => 0,
    10.       "cli_id" => $cli_id,
    11.     ];
    12.  
    13.     $json = json_encode($params);
    14.    
    15.     $ch = curl_init();
    16.  
    17.     $headers = array(
    18.         'Content-Type: application/json',
    19.         'Authorization: Basic '. base64_encode("$username:$pswd")
    20.     );
    21.  
    22.     //curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    23.    
    24.     curl_setopt($ch, CURLOPT_URL, $host);
    25.     curl_setopt($ch, CURLOPT_POST, true);
    26.     curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    27.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    28.     curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS);
    29.     curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    30.  
    31.     curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    32.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
    33.     curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2);
    34.    
    35.     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    36.     curl_setopt($ch, CURLOPT_USERPWD, "$username:$pswd");
    37.  
    38.     $output = curl_exec($ch);
    39.     curl_close($ch);
    40.  
    41.     echo $output;  
    42.  
    43.     if(curl_errno($ch)){
    44.         echo "<br>" . curl_error($ch) . "<br>";
    45.     }
    46.    
    47. ?>
    В этом случае массив $_POST заполнен, а если раскомментировать
    Код (Text):
    1. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    и закомментировать
    Код (Text):
    1.     curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
    2.     curl_setopt($ch, CURLOPT_USERPWD, "$username:$pswd");
    то массив $_POST пустой.
     
  14. Vladimir Kheifets

    Vladimir Kheifets Новичок

    С нами с:
    23 сен 2023
    Сообщения:
    437
    Симпатии:
    84
    Адрес:
    Бавария, Германия
    массив $_POST пустой т.к. в $headers неверно задан Content-Type д.б.
    Код (Text):
    1. $headers = array(
    2.    'Content-Type: application/x-www-form-urlencoded; charset=utf-8',
    3.    'Authorization: Basic '. base64_encode("$username:$pswd")
    4. );
    Eсли хотите 'Content-Type: application/json', то нужно изменить
    PHP:
    1. //эту строку
    2. curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    3. //на
    4. curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
     
    #14 Vladimir Kheifets, 1 июл 2024
    Последнее редактирование: 1 июл 2024
    alex-777 нравится это.
  15. alex-777

    alex-777 Активный пользователь

    С нами с:
    11 апр 2019
    Сообщения:
    42
    Симпатии:
    0
    Всем спасибо, на данном этапе разобрался, все работает.
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.839
    Симпатии:
    651
    Если нет задачи получать данные «в реальном времени» (например взбрело в голову получить сводный в два часа дня, и вытягиваешь данные с сайтов на этот момент), то отправлять-получать – это с какой стороны посмотреть. Сайты сливают свои данные, грубо говоря, в удобное им время, например ночью, спустя час после закрытия смены и т.п., а в центре после поступления всех данных или по мере поступления данных формируется сводный отчет. Если после поступления в центр данные хранятся в таком виде, что по ним можно получить сводный отчет почти мгновенно, то его можно и не формировать отдельно. Лучше потратьте больше времени на обработку отчетов от отдельных сайтов.