HEX
Server: Apache/2.4.6 (CentOS) mpm-itk/2.4.7-04 mod_fcgid/2.3.9 PHP/5.4.16
System: Linux dvm.vladweb.ru 3.10.0-1160.119.1.el7.x86_64 #1 SMP Tue Jun 4 14:43:51 UTC 2024 x86_64
User: region-gk.ru (1016)
PHP: 8.2.27
Disabled: NONE
Upload Files
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);
    }


}