Yandex поступает подло

Уже с месяц Яндекс блокирует строку поиска для тех, у кого включена блокировка Яндекс метрики. Выглядит это вот так:

ya1

 

Довольно подло. Стоит отключить блокировщик, как все работает

ya2

 

Мы не гордые, пойдем в гугл.

 

Дайджест-аутентификация (Digest access authentication)

Ранее я описывал алгоритм авторизации Digest, как самому собрать пакет данных

Для  PHP все оказалось проще,  в  CURL уже есть готовый механизм, который делает 2 запроса для правильной авторизации

Это параметр CURLOPT_HTTPAUTH => CURLAUTH_DIGEST,

 

 

Полностью запрос:


$request =[
    'SOAPAction: "http://yandex.ru/"',
    'Content-Type: text/xml;charset=UTF-8',
];


$options = array(
    CURLOPT_URL            => $url,
    CURLOPT_HEADER         => true,
    CURLOPT_VERBOSE        => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_SSL_VERIFYPEER => false,    // for https
    CURLOPT_USERPWD        => $username . ":" . $password,
    CURLOPT_HTTPAUTH       => CURLAUTH_DIGEST,
    CURLOPT_HTTPHEADER     => $request,
    CURLOPT_POST           => true,

    CURLOPT_POSTFIELDS     =>"xmlRequest=" . $input_xml // если нужно передать xml в теле POST
);

$ch = curl_init();

curl_setopt_array( $ch, $options );

try {
    $raw_response  = curl_exec( $ch );


    // validate CURL status
    if(curl_errno($ch))
        throw new Exception(curl_error($ch), 500);

    // validate HTTP status code (user/password credential issues)
    $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

    if ($status_code != 200)
        throw new Exception("Response with Status Code [" . $status_code . "].", 500);

} catch(Exception $ex) {
    if ($ch != null) curl_close($ch);
    throw new Exception($ex);
}

if ($ch != null) curl_close($ch);

echo "raw response: " . $raw_response;



The Twelve-Factor App

https://12factor.net/ru/

Understanding your Symfony app with Prometheus:

https://blog.4xxi.com/understanding-your-symfony-app-with-prometheus-fdb4b0124d99

 

 

Сбор и анализ логов с Fluentd:

 

 

https://habr.com/ru/company/selectel/blog/250969/

 

О сборке метриков:

https://www.youtube.com/watch?v=RPK5fp9-4yI

Fluentd

https://mcs.mail.ru/help/ru_RU/cases-logs/case-swarm

Fluentd docker

https://docs.docker.com/config/containers/logging/fluentd/

PUSHGATWAY

Про PUSHGATWAY очень мало написано в инете, особенно под PHP

Для установки локально PUSHGATWAY docker-compose.yml:

    pushgateway:
        image: prom/pushgateway
        restart: always
        container_name: app2022-pushgateway
        ports:
            - 9091:9091
            - 9090:9090
        networks:
            - front
            - backend

 

Есть библиотека для работы с pushgateway

https://github.com/PromPHP/prometheus_push_gateway_php ->
promphp/prometheus_push_gateway_php

 

Однако, нашел хороший простой класс, который основан на GuzzleHttp\Client:

https://github.com/markarik/wnl-platform/blob/9f4383e850373e1849f04f6d1487268cf91fa615/app/Console/PrometheusPushgateway.php

Немного модифицировал его под свои нужды, и получилось вот такое

<?php
namespace App\Handler;


use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

class PrometheusPushgateway
{
   public function notify($count, $code=200)
   {

        $url = 'http://pushgateway:9091/metrics/job/symfony/instance/sender';
        $url = getenv('PUSHGATWAY_URL');

      $client = new Client();
      try {
         $bodyLines = [
            "# HELP response_symfony_code_count",
            "# TYPE response_symfony_code_count",
            "response_symfony_code_count {code=\"${code}\"} ${count}"
         ];
         $body = implode("\n", $bodyLines) . "\n";
         $client->request('POST', $url, [
            'body' => $body
         ]);
      } catch (GuzzleException $exception) {
          exit('error');
      }
   }
}

 

 

Symfony full info

#!/bin/bash
php -i
php bin/console debug:config framework profiler
php bin/console debug:config web_profiler
php bin/console debug:container profiler --show-arguments
php bin/console debug:container web_profiler.debug_toolbar --show-arguments
php bin/console debug:event-dispatcher kernel.response
php bin/console about
php bin/console debug:router

User Deprecated: Since symfony/framework-bundle 5.1: Using type «Symfony\….» for argument 1 of method «App\Kernel: configureRoutes()» is deprecated,

User Deprecated: Since symfony/framework-bundle 5.1: Using type "Symfony\Component\Routing\RouteCollectionBuilder" for argument 1 of method "App\Kernel:configureRoutes()" is deprecated,


You need to update Kernel class to start using RoutingConfigurator instead of RouteCollectionBuilder.

You can do it automatically by updating the recipe (composer recipes:install symfony/framework-bundle --force)

safari new date invalid date

Бесит сафари, там где хром отрабатывает на ура, тупой сафари не может распарсит дату, приходится за место

var dtr = new Date( $('#record-client-age-2').val() );

писать

var [ day, month, year ] = $('#record-client-age-2').val().split('.')
var dtr = new Date(year, month, day);

и не забыть указать плейсхолдер

<input class="record-form__input-text " type="date" name="client_age_2" value=""
       id="record-client-age-2" tabindex="7" required placeholder="dd.mm.yyyy" >

а все почему? потому что в 2021 году сафари не знает что такое type=’date’, в 2021 году

How to POST a large amount of data within PHP curl without memory overhead?


$curl = curl_init();
curl_setopt( $curl, CURLOPT_PUT, 1 );
curl_setopt( $curl, CURLOPT_INFILESIZE, filesize($tmpFile) );
curl_setopt( $curl, CURLOPT_INFILE, ($in=fopen($tmpFile, 'r')) );
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, 'POST' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ] );
curl_setopt( $curl, CURLOPT_URL, $url );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
$result = curl_exec($curl);
curl_close($curl);
fclose($in);