File: //home/bk/__backup/exchanger/dwl_sources.php
<?php
/**
* Created by el.
* @autor: el
* @pakage: el
* @version: 0.1 13.08.18 12:11
* Date: 13.08.18
*/
/**
* RUN IN CRON: * / 20 * * * * php /full_path/dwl_sources.php
*/
define('PROCESSES_NUM', 20);
ini_set('max_execution_time', 0);
ini_set('memory_limit', '1024M');
$dirname = dirname(__FILE__);
ob_implicit_flush(true);
define("RP", str_replace("exchanger", "", $dirname) . "/");
define("SOURCE_DIR", RP . "uploads/sources/");
/**
*
* array(
* "key"=>"",
* "link"=>'',
* "login"=>"",
* "password"=>"",
* "ext"=>"",
* "func"=>""
* ),
*
*/
$sources_list = array(
// ebazar
array('key' => "termos_products",
'link' => "http://api.gdeslon.ru/api/search.xml?&l=100&&_gs_at=31c8d6c52b1d7dfe1fc61ce1fe3456cb8cadf852&sub_id=termos&tid=507&p={p}",
"type" => "xml",
"func"=>"gds_dwl"
)
);
parallelForeach($sources_list, "dwl_source_multy");
function dwl_source($arr, $dir)
{
foreach ($arr as $k => $v) {
$ext = substr($v, strrpos($v, "."));
// die($ext);
// echo $k.$ext.PHP_EOL;
file_put_contents($dir . $k . $ext, file_get_contents($v));
chmod($dir . $k . $ext, 0777);
}
}
function gds_dwl($v){
//$keys=array("термос","термопот","автокружка","","","");
$p = 1;
$ext = "." . $v['type'];
while (1){
$fg = file_get_contents(str_replace(array("{p}"),array($p),$v['link']));
if(strpos($fg,"</offer>")===false)break;
file_put_contents(SOURCE_DIR . $v['key'].$p . $ext, $fg);
$p++;
echo $v['key'].$p . $ext.PHP_EOL;
}
}
function happygifts_dwl($v){
if($v['key']=="happygifts_balance"){
$ext = "." . $v['type'];
for($i=0;$i<=20;$i++) {
$content = file_get_contents('ftp://'.$v['login'].'@ftp.ipg.su/clients/Ostatki/store'.$i.'.xml');
if($content !== false) {
file_put_contents(SOURCE_DIR . $v['key'].$i . $ext, $content);
}else{
break;
}
die();
}
return ;
}
if(is_array($v['link'])){
foreach($v['link'] as $k=>$vl){
$content = trim($content = file_get_contents($vl));
$ext = "." . $v['type'];
file_put_contents(SOURCE_DIR . $v['key'] .$k. $ext, $content);
}
}else{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL,$v['link']);
curl_setopt($curl, CURLOPT_USERPWD, $v['login']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$content = trim(curl_exec ($curl));
$ext = "." . $v['type'];
file_put_contents(SOURCE_DIR . $v['key'] . $ext, $content);
}
}
function oasiscatalog_dwl($v){
$api = new oasisApi($v['login']);
$ext = "." . $v['type'];
switch ($v['key']){
case "oasiscatalog_products":
$last_page = true;
$p=1;
do {
$data = $api->getProducts($p);
if($last_page === true ){
if ( preg_match("|X-Pagination-Page-Count: (\d+)|",
$data[0], $last_page)) {
$last_page = $last_page[1];
} else $last_page = false;
}
file_put_contents(SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR. $v['key'].$p . $ext, $data[1]);
echo SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR . $v['key'].$p. $ext.PHP_EOL;
$p++;
if($last_page===false || $last_page==$p)break;
}while($last_page);
break;
case "oasiscatalog_balance2":
$last_page = true;
$p=1;
$data = $api->getStock($p);
file_put_contents(SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR. $v['key'] . $ext, $data[1]);
echo SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR . $v['key']. $ext.PHP_EOL;
break;
case "oasiscatalog_balance":
$last_page = true;
$p=1;
do {
$data = $api->getStock($p);
if($last_page === true ){
if ( preg_match("|X-Pagination-Page-Count: (\d+)|",
$data[0], $last_page)) {
$last_page = $last_page[1];
} else $last_page = false;
}
file_put_contents(SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR. $v['key'].$p . $ext, $data[1]);
echo SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR . $v['key'].$p. $ext.PHP_EOL;
$p++;
if($last_page===false || $last_page==$p)break;
}while($last_page);
break;
case "oasiscatalog_categories":
$data = $api->getCategories();
file_put_contents(SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR . $v['key']. $ext, $data[1]);
echo SOURCE_DIR ."oasiscatalog".DIRECTORY_SEPARATOR . $v['key']. $ext.PHP_EOL;
break;
}
}
function dwl_source_multy($arr)
{
$narr = array();
$narr[] = $arr;
foreach ($narr as $k => $v) {
$k = ($v['key']);
$link = ($v['link']);
/* $ext = substr($v,strrpos($v,"."));*/
$ext = "." . $v['type'];
// die($ext);
echo $k . $ext . PHP_EOL;
if(isset($v['func']) && function_exists($v['func'])){
$v['func']($v);
}else{
file_put_contents(SOURCE_DIR . $k . $ext, file_get_contents($link));
echo SOURCE_DIR . $k . $ext.PHP_EOL;
chmod(SOURCE_DIR . $k . $ext, 0777);
}
}
return true;
}
function parallelForeach($arr, $func)
{
for ($proc_num = 0; $proc_num < PROCESSES_NUM; $proc_num++) {
$pid = pcntl_fork();
var_dump($pid);
if ($pid < 0) {
fwrite(STDERR, "Cannot fork\n");
exit(1);
}
if ($pid == 0) break;
}
if ($pid) {
for ($i = 0; $i < PROCESSES_NUM; $i++) {
pcntl_wait($status);
$exitcode = pcntl_wexitstatus($status);
if ($exitcode) exit(1);
}
return;
}
$l = count($arr);
for ($i = $proc_num; $i < $l; $i += PROCESSES_NUM) if (!$func($arr[$i])) {
var_dump($arr[$i]);
echo " - BAD\n";
// $out = implode(";",array_map("addStr", $GLOBALS['out'][$arr[$i]] ))."\n";
// file_put_contents(RP."sp_no.csv", $out,FILE_APPEND | LOCK_EX);
} else {
// echo $arr[$i]." - OK\n";
};
exit(0);
}
class oasisApi
{
public $apiKey = 'key90a67eef5cbc4f298d4fa989c123e6b8'; // Ваш ключ доступа
public $apiUrlStock = 'https://api.oasiscatalog.com/v3/stock'; // URL для выгрузки остатков
public $apiUrlProduct = 'http://api2.oasiscatalog.com/v3/products'; // URL для выгрузки продуктов
public $apiUrlCategories = "http://api2.oasiscatalog.com/v3/categories"; // URL для выгрузки категорий
public $headers = [
'Accept:application/json', // получить выгрузку в формате XML
];
public function __construct($key)
{
$this->apiKey = $key;
}
private function get($url)
{
$resource = curl_init();
curl_setopt_array($resource, [
CURLOPT_URL => $url, // URL текущего запроса к сервису
CURLOPT_HEADER => true, // указать сервису включить заголовки в ответ
CURLOPT_HTTPHEADER => $this->headers, // массив заголовков для отправки запроса
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => $this->apiKey, // ключ доступа
CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($resource);
$headerSize = curl_getinfo($resource, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $headerSize); // отделяем заголовки ответа
$body = substr($response, $headerSize); // сохраняем непосредственно тело ответа
//var_dump($body);
curl_close($resource);
return array($header, $body);
}
function getProducts($p = 1,$url='')
{
if($url) return $this->get($url.$p);
return $this->get($this->apiUrlProduct . "?expand=description,attributes,materials,brand&page=" . $p);
}
function getCategories()
{
return $this->get($this->apiUrlCategories);
}
function getStock($p=1,$url='')
{
if($url) return $this->get($url);
return $this->get($this->apiUrlStock."?page=".$p);
}
}