Архив метки: php

Gitlab API — создание, обновление файла на PHP

Ранее я писал как можно через curl в Linux выполнить запрос в Linux на создание файла или его обновление в репозитории Gitlab через его API. Ниже показано как это сделать через Curl, но уже в PHP.

Получить информацию по репозиторию:

<?php
$headers = ['PRIVATE-TOKEN: 123ABC'];

$url = 'https://main-git.ru/api/v4/projects/Dima/%2Fdima-tools';

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                        
curl_setopt($curl, CURLOPT_URL, $url);

$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

var_dump($info);
var_dump($result);

Создать файл в репозитории:


<?php

$json_array = array("branch" => "master", "author_email" => "dima@example.com", "author_name" => "Firstname Lastname", "content" => "some content", "commit_message" => "create a new file");

$JSON = json_encode($json_array);

$headers = array('PRIVATE-TOKEN: 123ABC', 'Content-Type: application/json');
$url = 'https://main-git.ru/api/v4/projects/1/repository/files/app%2Fmain';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($curl, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                               
$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

Обновить файл в репозитории, при этом наполнить его содержимым из другого файла (create json array from file in php):


<?php

//читаем файл в строку, в файле должны быть переводы строк "\n" если хотите, чтобы в  //Gitlab была не одна строка без переносов
$hosts = file_get_contents('./file/hosts.txt');

$json_array = array("branch" => "master", "author_email" => "dima@russia.ru", "author_name" => "Red Dima", "content" => $hosts, "commit_message" => "update file");

$JSON = json_encode($json_array);

$headers = array('PRIVATE-TOKEN: 123ABC', 'Content-Type: application/json');
$url = 'https://main-git.msk.ru/api/v4/projects/1/repository/files/ansible%2Fhosts';

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($curl, CURLOPT_POSTFIELDS, $JSON);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);                                                                                                                                               
$result = curl_exec($curl);
$info = curl_getinfo($curl);
curl_close($curl);

var_dump($info);
var_dump($result);

PHP — найти и показать дубли в ассоциативном массиве

Есть ассоциативный массив $result_arr , нужно найти и показать дубли по имени определенного элемента ‘sku’.

//смотрим дубли
$arr_c = array_column($result_arr, 'sku');
$dupes = array_diff(array_count_values($arr_c), [1]);
var_dump($dupes);

PHP — ворочаем большие массивы

Была задача сделать сверку 2 файлов в каждом по 1 млн. строк. Сверка на уровне базы занимала оочень продолжительное время, примерно сутки и более.
Как и сколько времени это займет на PHP если делать это в памяти через массивы?
Разбираемся.
Изначальный элемент 1 массива (один элемент для примера)
[0]=> string(128) «183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»

Изначальный элемент 2 массива (один элемент для примера)
[0]=> string(128) «183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»

Далее используем функцию array_flip – она возвращает массив наоборот, то есть ключи массива становятся значениями, а значения массива становятся ключами

И тогда:

Измененный элемент 1 массива станет таким
[«183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»]=> int(0)

Измененный элемент 2 массива станет таким
[«183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;183dc1b67dbce515fa91;1»]=> int(0)

Смысл этого в том, что далее мы будем сравнивать элементы не по значению элемента, а по ключам(это даст нам возможность схлопнуть массивы по одинаковым значениям ключей), которые сейчас у нас содержат значения элементов.

Далее запускаем скрипт и получаем строки из 2 файла, которых нет в 1 файле и записываем в результирующий файл

dima@Ubuntu:~/PHP/array_compare$ time php -d memory_limit=4G ./compare.php

Время выполнения скрипта у меня (но у меня стоит PHP7.2 )составило 12 секунд
Памяти мы потребили на момент выполнения 400 мб

Memory Consumption is 0.37 MB
Memory Consumption is 401.56 MB
real 0m12,664s
user 0m4,008s
sys 0m8,600s

Сам скрипт довольно простой, благодаря готовым функциям PHP и сейчас сам скрипт вот

//читаем 1 файл в массив
$a = file(«random_1.csv»);
//читаем 2 файл в массив
$b = file(«random_2.csv»);

//соритруем массивы
sort($a, SORT_STRING);
sort($b, SORT_STRING);

//функция для вычисления расхождений 1 массива от 2 массива
function large_array_diff($b, $a){
// меняем наборот в 1 массиве ключ и значение
$at = array_flip($a);
// меняем наборот во 2 массиве ключ и значение
$bt = array_flip($b);
//вычисляем расхождение массивов сравнивая ключи
$d = array_diff_key($bt, $at);
//возвращаем в функции массив-результат сравнения ключей
return array_keys($d);
}
//выполянем функцию подставляя массивы в качестве аргументов
$diff = large_array_diff($b, $a);
//пишем результат сравнения в файл
file_put_contents(‘compare_diff.csv’, $diff, FILE_APPEND);

Тест на PHP5.6 – более медленный чем 7 версия и больше жрет памяти.

Строки получились более длинными вот так например
0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;0bff640c25f2b16720249d6e5bda91a9;1

Результат сравнения двух файлов с 1 млн строк

  • времени работали 8 секунд
  • памяти пожрали 1Гб
  • в результирующий файл попало 1 млн строк (т.е разница между файлами 100%) Проверил потом diff – показал разницу всех строк
    [ium@0400hpium03 array_compare]$ diff random_1.csv random_2.csv | wc -l
    2000002
  • проверял на файлах с меньшим количеством строк, чтобы смотреть разницу – скрипт работает правильно, т.е ошибок нет при сравнении строк находит только разные.

[tnm@0400hp]$ time php -d memory_limit=4G ./compare.php

Memory Consumption is 0.22 MB
Memory Consumption is 1054.2 MB
real 0m8.286s
user 0m5.263s
sys 0m2.812s

Яндекс Вебмастер API — добавление оригинального текста PHP

<?php
//header("Content-Type: application/xml; charset=utf-8");

$user_id = 99999;
$host_id = 'https:site.ru:443';
$OAuth = 'key_here';


$data = 'Варкалось. Хливкие шорьки 
Пырялись по наве, 
И хрюкотали зелюки, 
Как мюмзики в мове. ';

$data = strip_tags($data);
$data = htmlspecialchars($data);
$data = iconv(mb_detect_encoding($data, mb_detect_order(), true), "UTF-8", $data);

$data = "<Data><content>{$data}</content></Data>";

$headers = array(
    'Content-type: application/xml;charset=UTF-8',
    'Authorization: OAuth '.$OAuth.''
);

$ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://api.webmaster.yandex.net/v4/user/$user_id/hosts/$host_id/original-texts/"); // отправка текста в яндекс
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
    $output = curl_exec($ch);
    $debug = curl_getinfo($ch);;
		curl_close($ch);

   $info = json_decode($output, true);
    print_r($info);
    print_r($debug);

У Яндекс условие — текст должен быть более 500 символов.

бака за компом

PHP — запрос-ответ через Curl с сервера Linux

С сервера передаем POST-запрос и получает результат- ответ через стандартную утилиту curl в Linux:

curl -so result.txt http://mainserver.ru/test.php -d"first=Dima&last=Vova"

Ключи в curl : s — тихий режим, без вывода дополнительной информации при выполнении
o — сохранить результат в файл

На стороне принимающего сервера PHP-скрипт:

<?php
$test1 = htmlspecialchars($_POST["first"]);
$test2 = htmlspecialchars($_POST["last"]);
$time = date('U');
echo "{\"time\":$time,\"first\":$test1,\"last\":$test2}\n";

В результате на сервере с которого делаем запрос, получаем файл с результатом:
{«time»:1579160382,»first»:Dima,»last»:Vova}

Яндекс Вебмастер API — как получить оригинальные тексты PHP

<?php
$ch = curl_init('https://login.yandex.ru/info');
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, array('format' => 'json')); 
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth AADSDSddffdfdfdfdfdfjhkh777'));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_HEADER, false);
		$info = curl_exec($ch);
		curl_close($ch);
 
		$info = json_decode($info, true);
		print_r($info);

PHP — curl, функция для подсчета файлов на фтп

<?php
error_reporting(E_ALL | E_STRICT);

//функция подсчета количества файлов на фтп
/*
$ftp_type - протокол ftp или sftp
$ftp_host - хост фтп
$ftp_port - порт фтп
$ftp_user - пользователь фтп
$ftp_pass - пароль фтп
$ftp_dir - директория для подсчета на фтп
*/

function ftp_count($ftp_type, $ftp_host, $ftp_port, $ftp_user, $ftp_pass, $ftp_dir){
$curl = curl_init();
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl, CURLOPT_URL, "$ftp_type://$ftp_host:$ftp_port/$ftp_dir");
curl_setopt($curl, CURLOPT_USERPWD, "$ftp_user:$ftp_pass");
curl_setopt($curl, CURLOPT_FTPLISTONLY, TRUE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 15);
curl_setopt($curl, CURLOPT_TIMEOUT, 60);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
//curl_setopt($curl, CURLOPT_VERBOSE, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'LIST'); // get directory list
$ftp_result = curl_exec($curl);
curl_close($curl);

$curl_array = explode(PHP_EOL, $ftp_result);

foreach($curl_array as $val){
if (!preg_match('/^d/', $val) && $val != ''){
$filesftp_array[] = $val;
}
}
$count_files = count($filesftp_array);
return $count_files;
}

Яндекс API — как получить user-id в PHP

  1. Получаем ключ авторизации — описано тут
  2. Создаем скрипт со следующим содержимым:
<?php
$ch = curl_init('https://login.yandex.ru/info');
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, array('format' => 'json')); 
		curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth ваш_ключ'));
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_HEADER, false);
		$info = curl_exec($ch);
		curl_close($ch);
 
		$info = json_decode($info, true);
		print_r($info);

3. Переходим по адресу скрипта выше и получаем вот такой ответ :

Array ( [login] => abwgat [id] => 234232 [client_id] => 8asadsd3434d0dsf0dfds232 ) 

Все.

Яндекс API — как получить ключ OAuth-авторизации в PHP

  1. Заходим и читаем https://yandex.ru/dev/direct/doc/dg-v4/examples/auth-token-sample-docpage/
  2. Создаем PHP-скрипт там, куда вернет ответ Яндекс для получения ключа. Например https://webguns.ru/get_token.php
  3. Содержимое скрипта ниже


<?php
// Идентификатор приложения
$client_id = 'YOUR_CLIENT_ID'; 
// Пароль приложения
$client_secret = 'YOUR_CLIENT_SECRET';

// Если скрипт был вызван с указанием параметра "code" в URL,
// то выполняется запрос на получение токена
if (isset($_GET['code']))
  {
    // Формирование параметров (тела) POST-запроса с указанием кода подтверждения
    $query = array(
      'grant_type' => 'authorization_code',
      'code' => $_GET['code'],
      'client_id' => $client_id,
      'client_secret' => $client_secret
    );
    $query = http_build_query($query);

    // Формирование заголовков POST-запроса
    $header = "Content-type: application/x-www-form-urlencoded";

    // Выполнение POST-запроса и вывод результата
    $opts = array('http' =>
      array(
      'method'  => 'POST',
      'header'  => $header,
      'content' => $query
      ) 
    );
    $context = stream_context_create($opts);
    $result = file_get_contents('https://oauth.yandex.ru/token', false, $context);
    $result = json_decode($result);

    // Токен необходимо сохранить для использования в запросах к API Директа
    echo $result->access_token;
  }
?>

4. Регистрируем-заполняем поля для создания своего приложения здесь https://oauth.yandex.ru/client/new

5. Нажимаем создать приложение и получаем ID и секрет, примерно такого вида

ID: 8sd4d0ffsdasdasdsdas160a3
Пароль: d1sdasdsd3dfgffgk3j4kj23ljk3lb8
Callback URL: https://webguns.ru/get_token.php

6. Вводим в браузере адрес https://oauth.yandex.ru/authorize?response_type=code&client_id=<идентификатор_приложения>

Пример: https://oauth.yandex.ru/authorize?response_type=code&client_id=8sd4d0ffsdasdasdsdas160a3

7. Жмем Разрешить — получаем в ответ наш ключ для авторизации. Все.

Вывести xml в виде текста на странице

Бала небольшая задача вывести XML в виде текста на странице без всяких извращений, так как по умолчанию xml выводится в браузере , но увидеть его можно если выбрать просмотр исходного кода на странице. Можно конечно извращаться с выводом через различные просмотрщики и т.д, но это был не тот случай.

Для вывода в виде текста ставим в нашем скрипте не header(‘Content-Type:text/html’);  а header(‘Content-Type:text/plain’);  и все.