Всем привет, Есть однотипные сайты (php + mysql) на разных хостингах, на многих даже закрыт доступ к базам извне. Необходимо сделать сводный отчет по всем базам. То есть нужно запустить скрипт на всех сайтах по очереди, и как-то вернуть результат. Или сохранить куда-нибудь на доступное хранилище, например google drive. То есть для меня непонятно, 1. Как программно выполнить скрипт на другом хостинге, не открывая страницу сайта? 2. Как можно вернуть результирующие данные? Толкните, куда копать. Спасибо
Добрый день! Попробуйте записать один тот же скрипт на всех хостингах. Запускать это скрипт на разных хостингах по очереди можно через CronJob. Определите в crontab команды для запуска скрипта - время и интервал, для каждого хостинга. На одном из хостингов организуйте простой Web Сервис, на end point url, которого будут оправляться через cUrl результаты из скриптов со всех ностингов. На end point url сервиса, скрипт обработчик должен проверять права доступа и либо отколонять запросы либо их акцептировать т.е. сохранять результаты, где пожелаете. Удачи!
Попробовал по другому, но все равно с использованием curl. Подключение, отправка и получение результата, все работает. Но с curl у меня проблема с проверкой доступа. Нигде не нашел простого примера, или поверхностная инфа ни о чем, или чуть ли не разработка фрейморка.
Простой пример c Basic Authorization здесь https://www.edureka.co/community/92447/how-to-use-basic-authorization-in-php-curl PHP: $host = 'https://www.discussdesk.com/'; $user_name = 'set_user_name'; $password = 'set_password'; $ch = curl_init($host); $headers = array( 'Content-Type: application/json', 'Authorization: Basic '. base64_encode("$user_name:$password") ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $response = curl_exec($ch); if(curl_errno($ch)){ // throw the an Exception. throw new Exception(curl_error($ch)); } curl_close($ch); echo $response; Вы можете попробовать вместо 'Authorization: Basic ' PHP: $token = "080042cad6356ad5dc0a720c18b53b8e53d4c274"; ... "Authorization: Bearer $token" Неплохого бы проверять ip-адреса ностов, с которых отправляются запросы. Обычно, так делают на Веб Сервисах. Удачи!
Если сайты сами отправляют отчеты (по крону), можно «тупо» передавать ключик в POST-параметре. Каждый сайт может иметь свой ключик, чтобы прямо по нему определять источник отчета. --- Добавлено --- ...если нет отдельного логина или точки доступа.
Вместо ключика сайта (ностинга) можно использовать ip-адреса - они уникальные. Нужно только, завести таблицу белых ip-адресов и м.б. в таблице должны быть поля данных необходимых для отчетов. Если возникнут затруднения, покажите код.
Для меня логика задачи немного другая. Нужно не отправлять отчеты, а получать отчеты со всех сайтов на один. То есть пользователь открывает отчет и идет запрос на все сайты, то есть на каждом сайте запускается скрипт, который коннектится к базе данных и формирует массив данных. Инфа обрабатывается за полный предыдущий и текущий день, то есть сама обработка выполняется гораздо быстрее, чем отправка запроса/получение результата. Хостинг шаред основной системы не позволяет определить $_SERVER["REMOTE_HOST"] , только $_SERVER["REMOTE_ADDR"], но и этого думаю достаточно. Но есть пара вопросов по Basic Authorization, я читал что в этом случае пароль и логин отправляются в открытом виде, спасает ли в этом случае использование https? И какие могут быть риски? Могут ли злоумышленники навредить хосту, который принимает curl запросы? .
Добрый день! По https протоколу информация не передаётся в открытом виде. Однако в некоторых случаях этого бывает недостаточно. Решения по безопасности, в каждом конкретном случае, принимаются в зависимости от размера возможного ущерба от утечки данных и от выполнения нелегальных запросов. Наиболее серьезные решения реализуются в платёжных системах. Приведу пример кода платёжной системы Novalnet https://developer.novalnet.com/encryption/directapi Удачи!
Данные для постороннего не имеют смысла, просто массив цифр. Я волнуюсь только об потенциальной возможности взлома хостинга, на который отправляется запрос. И второе, натолкнулся на непонятку, если логин/пароль прописывать через Код (Text): curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "$username:$pswd"); то все работает, а если Код (Text): $headers = array( 'Content-Type: application/json', 'Authorization: Basic '. base64_encode("$username:$pswd") ); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); то в принимающем скрипте массив $_POST пустой. Не знаю, что может быть.
Должно быть не массиве $_POST, а в $_SERVER['PHP_AUTH_USER'] и $_SERVER['PHP_AUTH_PW'] см. https://www.php.net/manual/ru/features.http-auth.php
Это понятно, вот полный код Код (Text): <?php $host = "https://crm.iconsultant.com.ua/curlto.php"; $username = "root"; $pswd = "123"; $cli_id = 9; $params = [ "cli_type" => 0, "cli_id" => $cli_id, ]; $json = json_encode($params); $ch = curl_init(); $headers = array( 'Content-Type: application/json', 'Authorization: Basic '. base64_encode("$username:$pswd") ); //curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_URL, $host); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS); curl_setopt($ch, CURLOPT_TIMEOUT, 10); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true); curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2); curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "$username:$pswd"); $output = curl_exec($ch); curl_close($ch); echo $output; if(curl_errno($ch)){ echo "<br>" . curl_error($ch) . "<br>"; } ?> В этом случае массив $_POST заполнен, а если раскомментировать Код (Text): curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); и закомментировать Код (Text): curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "$username:$pswd"); то массив $_POST пустой.
массив $_POST пустой т.к. в $headers неверно задан Content-Type д.б. Код (Text): $headers = array( 'Content-Type: application/x-www-form-urlencoded; charset=utf-8', 'Authorization: Basic '. base64_encode("$username:$pswd") ); Eсли хотите 'Content-Type: application/json', то нужно изменить PHP: //эту строку curl_setopt($ch, CURLOPT_POSTFIELDS, $params); //на curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
Если нет задачи получать данные «в реальном времени» (например взбрело в голову получить сводный в два часа дня, и вытягиваешь данные с сайтов на этот момент), то отправлять-получать – это с какой стороны посмотреть. Сайты сливают свои данные, грубо говоря, в удобное им время, например ночью, спустя час после закрытия смены и т.п., а в центре после поступления всех данных или по мере поступления данных формируется сводный отчет. Если после поступления в центр данные хранятся в таком виде, что по ним можно получить сводный отчет почти мгновенно, то его можно и не формировать отдельно. Лучше потратьте больше времени на обработку отчетов от отдельных сайтов.