Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2015, 22:44   #1
lola_lola1
Новичок
Джуниор
 
Регистрация: 08.12.2015
Сообщений: 11
По умолчанию Помогите с функцией

Добрый вечер. Подскажите, пожалуйста, как можно реорганизовать скрипт или есть возможность изъять данные. Суть такова, у меня есть парсер отделений одной из служб доставки. Есть API для того, чтобы можно было обратиться к нему с любого сайта. Когда я запускаю код на сервере, то всё отличненько парсится и добавляется в базу, если же посылать запрос с какого-то сайта на сервер, то с помощью file_get_contents он возвращает только строковый результат об успешном выполнение и добавляет данные не в базу сайта, а повторно перезаписывает на сервере. Происходит из-за того, что идёт выполнение функции append_department(принадлежит классу для вставки/изъятия и тд ). В общем, есть ли у кого-то идеи, как можно изъять грамотно данные и записать их в базу сайта? Огромнейшее спасибо.

Привожу код парсера и функции для взаимодействия с api

PHP код:
<?php
//include_once('libphp/total_function.php');
include_once('libphp/LIB/simple_html_dom.php');
include_once 
'api.php';
$type=2;
delete_records($type);
$name='';
$city='';
$region='';
$adress='';
$phone='';
$work_time='';
ini_set('user_agent''My-Application/2.5');
$html = new simple_html_dom();
$cont get_data("http://допустим тут ссылка на api службы доставки");
$dom $html->load($cont);
if (!empty(
$dom))
    foreach(
$dom->find('div.city-block') as $article) {
        
$city trim($article->find('div.city-title'0)->plaintext);
        
$city strtolower($city);
        
$city ucfirst($city);
        foreach(
$article->find('div.city-info') as $articles){
            
$name "Отделение №".trim($articles->find('div.attention-circle-violet'0)->plaintext);
            
$adress trim($articles->find('div.city-info-addr'0)->plaintext);
               if(
strlen(trim($adress)))
            
append_department($type,$name,($city),$region,$adress,$phone,$work_time);
        }
    }
else {
     die(
"Error");
}

die(
"OK");

// Дальше следует функция get_data и тд
}
?>
PHP код:
function helloAPI($apiMethodParams){
        
header('Content-type: text/html');       
        echo 
file_get_contents("http://localhost/delivery/delivery.php");
    } 
lola_lola1 вне форума Ответить с цитированием
Старый 09.12.2015, 08:21   #2
ADSoft
Старожил
 
Регистрация: 25.02.2007
Сообщений: 4,160
По умолчанию

ваще непонятно, особенно:
Код:
Когда я запускаю код на сервере, то всё отличненько парсится и добавляется в базу, если же посылать запрос с какого-то сайта на сервер,
любой сайт находится на хостинге-своем сервере.. в чем принципиальное отличие с какого сервера запускать я что-то не пойму....

вот вы код привели - он работает у вас - так? хорошо
объясните тогда что и где не работает в таком случае?
ADSoft на форуме Ответить с цитированием
Старый 09.12.2015, 18:04   #3
lola_lola1
Новичок
Джуниор
 
Регистрация: 08.12.2015
Сообщений: 11
По умолчанию

Ну, допустим есть сервер 1,он парсит данные и записывает к себе в базу. Надо, чтобы при выполнении с другого сервера file_get_contents(ссылка на файл-парсер) производилась запись в базу и на нем. Может можно как-то получить спарсенные данные без помощи file_get_contents?потому что в данном случается она не эффективна?
lola_lola1 вне форума Ответить с цитированием
Старый 09.12.2015, 18:22   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Организовать на сервере 1 нормальное API, чтоб можно было отдавать на другие сервера уже готовые (распарсенные) данные – по запросам, из БД на сервере 1.
Отдавать данные можно в формате JSON например – или хоть serialize-массивом, в крайнем случае.

Или вообще – запускать такой же скрипт парсера на других серверах, и писать данные сразу в их БД.
Что мешает так сделать?

Последний раз редактировалось Andkorol; 09.12.2015 в 18:28.
Andkorol вне форума Ответить с цитированием
Старый 09.12.2015, 18:31   #5
lola_lola1
Новичок
Джуниор
 
Регистрация: 08.12.2015
Сообщений: 11
По умолчанию

Фишка в том, чтобы парсер был на одном сервере, чтобы можно было удобно чинить в случае несправностей. Подскажите источники на толковое объяснение и похожую реализацию, с json приходилось мало сталкиваться
lola_lola1 вне форума Ответить с цитированием
Старый 09.12.2015, 18:44   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

JSON – описание формата и примеры.
json_encode – кодирует данные в JSON-формат – используем на стороне API.
json_decode – декодирует данные из JSON-формата обратно в исходное представление – используем на «принимающей» стороне.
Примеров по ссылкам достаточно для понимания принципов использования и организации простенького API для передачи данных.
Andkorol вне форума Ответить с цитированием
Старый 09.12.2015, 23:55   #7
lola_lola1
Новичок
Джуниор
 
Регистрация: 08.12.2015
Сообщений: 11
По умолчанию

Ага. понятно, спасибо.

Такой еще вопрос, я пытаюсь передать файлы с помощью cURL. В файле test.php все выполняется успешно. Но, кажется, файлы не доходят до test_new.php.

test.php
<?php
$api_url = 'http://mysite.dev/test_new.php';
$json_data =json_encode($data);
$curl = curl_init($api_url);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POSTFIELDS, $json_data);
curl_setopt($curl, CURLOPT_HTTPHEADER, 'Content-Type:application/json');
$json_response = curl_exec($curl);
$curl_errorno = curl_errno($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
echo $json_response;
curl_close($curl);
?>

test_new.php
<?php
$json = file_get_contents('php://input');
echo json;
?>

1) echo json_response - показывает данные, которые надо передать
2) echo json - возвращает пустой результат и более того print($GLOBALS) не содержит $HTTP_RAW_POST_DATA
lola_lola1 вне форума Ответить с цитированием
Старый 10.12.2015, 00:45   #8
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Чё-то как-то навыворот у вас всё это реализовано...
Зачем через cURL пытаться куда-то насильно толкать данные?
Почему сам скрипт test_new.php не может эти данные просто запросить с удаленного сервера – и получить их, по расписанию например, или по какому-то событию на сайте?
Andkorol вне форума Ответить с цитированием
Старый 10.12.2015, 01:43   #9
lola_lola1
Новичок
Джуниор
 
Регистрация: 08.12.2015
Сообщений: 11
По умолчанию

Простите, не совсем понимаю...
Полагается, что test.php выполняется на удаленном сервере. И передает данные
lola_lola1 вне форума Ответить с цитированием
Старый 10.12.2015, 01:48   #10
lola_lola1
Новичок
Джуниор
 
Регистрация: 08.12.2015
Сообщений: 11
По умолчанию

И что значит получить по расписанию?
lola_lola1 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите с функцией Ximerka Паскаль, Turbo Pascal, PascalABC.NET 0 09.04.2009 00:14
помогите с функцией 1234 Общие вопросы Delphi 5 30.08.2008 10:55
Помогите с функцией Родион Общие вопросы Delphi 3 08.05.2008 19:18