Для получения полного доступа
зарегистрируйтесь.

Дмитрий Порожняков    62   18 338


PHP Developer and more ...

  • Зарегистрирован 4 года назад
Профиль завершён на 30 %
30 %
sudo mysqldump -h [host] -u [username] -p[password] [database] --tables [table1 table2 ...] --lock-tables=false | gzip > dump.sql.gz
sudo mysqlbinlog -v --start-position={START_POS} --base64-output=DECODE-ROWS {FULL_PATH_TO_BINLOG_RELAYLOG_FILE} > {FULL_PATH_TO_DECODED_FILE}

Далее можно открыть DECODED_FILE через vim:

  1. :set hlsearch - включаем подстветку результатов поиска
  2. /# at - по такому паттерну перемещаемся между statements
  3. n - следующее совпадение; N - предыдущее совпадение

CPU:

lscpu

Memory:

less /proc/meminfo

Hard Drive:

sudo fdisk -l | grep Disk

Network:

ifconfig -a
ethtool {interface name} | grep -i speed
kill -15 `ps -ef | grep {mask} | grep -v grep | awk '{print $2}'`

kill -15 `pgrep {mask}  | awk '{print $1}'`

pgrep {mask} | xargs kill

pkill -f {mask}
<?php

class CompareXmls
{
    /**
     * Конвертация Xml-строки в массив.
     * @param string $xmlString
     * @return array
     * @throws \Exception
     */
    private static function convertXmlToArray($xmlString)
    {
        $array = [];

        // проверяем валидность xml-строки
        $xml = \XMLReader::xml($xmlString);
        $xml->setParserProperty(\XMLReader::VALIDATE, true);
        if (!$xml->isValid()) {
            throw new \Exception();
        }

        // создаём xml-объект
        $xml = simplexml_load_string($xmlString, "SimpleXMLElement", LIBXML_NOCDATA);
        if (!$xml) {
            throw new \Exception();
        }

        // формируем массив
        $array['name'] = (string)$xml->getName();
        $array['attributes'] = [];
        foreach ($xml->attributes() as $name => $value) {
            $array['attributes'][(string)$name] = (string)$value;
        }
        if (count($xml->children())) {
            foreach ($xml->children() as $child) {
                $array['value'][] = self::convertXmlToArray($child->asXML());
            }
        }
        else {
            $array['value'] = (string)$xml;
        }


        return $array ?: [];
    }

    /**
     * @param array $aArray1
     * @param array $aArray2
     * @return array
     */
    private static function arrayRecursiveDiff($aArray1, $aArray2)
    {
        $aReturn = array();

        foreach ($aArray1 as $mKey => $mValue) {
            if (array_key_exists($mKey, $aArray2)) {
                if (is_array($mValue)) {
                    $aRecursiveDiff = self::arrayRecursiveDiff($mValue, $aArray2[$mKey]);
                    if (count($aRecursiveDiff)) {
                        $aReturn[$mKey] = $aRecursiveDiff;
                    }
                }
                else {
                    if ($mValue != $aArray2[$mKey]) {
                        $aReturn[$mKey] = $mValue;
                    }
                }
            }
            else {
                $aReturn[$mKey] = $mValue;
            }
        }
        return $aReturn;
    }

    /**
     * Сравнение 2-х Xml по структутре и значению.
     * @param string $xmlOne
     * @param string $xmlTwo
     * @return array
     */
    public static function compare($xmlOne, $xmlTwo)
    {
        try {
            $arrayOne = self::convertXmlToArray($xmlOne);
            $arrayTwo = self::convertXmlToArray($xmlTwo);
        } catch (Exception $e) {
            return [false, [], []];
        }
        return [
            $arrayOne === $arrayTwo,
            self::arrayRecursiveDiff($arrayOne, $arrayTwo),
            self::arrayRecursiveDiff($arrayTwo, $arrayOne),
        ];
    }
}


// Example1
$xmlstring1 = "<root><a attr='1'>1</a><b><c>2</c><d>3</d></b></root>";
$xmlstring2 = "<root>
                    <a attr='1'>1</a>
                    <b>
                        <c>2</c>
                        <d>3</d>
                    </b>
               </root>";
print_r(CompareXmls::compare($xmlstring1, $xmlstring2)); // true

// Example2
$xmlstring1 = "<root><a>1</a><b><c>2</c><d>3</d></b></root>";
$xmlstring2 = "<root>
                    <a>1</a>
                    <b>
                        <c>2</c>
                        <e>3</e>
                    </b>
               </root>";
print_r(CompareXmls::compare($xmlstring1, $xmlstring2)); //false

// Example3
$xmlstring1 = "<root><a>1</a><b><c>2</c><d>3</d></b></root>";
$xmlstring2 = "<root>
                    <a>1</a>
                    <b>
                        <c>2</c>
                        <d>4</d>
                    </b>
               </root>";
print_r(CompareXmls::compare($xmlstring1, $xmlstring2)); //false
if ($argv) {
    parse_str(implode('&', array_slice($argv, 1)), $_GET);
    unset($argv);
}

В консоли выполняем:

php index.php arg1=1 arg2=2

И можем использовать переданные значения в нашем скрипте:

$_GET['arg1']
$_GET['arg2']

Необходимо указать критерии для поиска проблемных запросов:

SET @runTime = 2;
SET @selectPattern = "%";
SET @cUser = "user";
SET @cState = "Sleep";

-- Процедура для создания и выполнения kill-запросов
DELIMITER $$
DROP PROCEDURE IF EXISTS totalKILL $$
CREATE PROCEDURE totalKILL(runTime INT, selectPattern VARCHAR(255), cUser VARCHAR(255), cState VARCHAR(255))
  BEGIN
    
    -- Стартовые директивы
    DECLARE finished INTEGER DEFAULT 0;
    DECLARE oneKillQuery VARCHAR(255) DEFAULT '';
    DECLARE curs CURSOR FOR SELECT kill_query FROM mysql_kill_list;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
    
    -- Ищем необходимые PID's, формируем KILL-запросы
    DROP TABLE IF EXISTS mysql_kill_list;
    SET @stmt = CONCAT("CREATE TEMPORARY TABLE mysql_kill_list AS
                        SELECT CONCAT('KILL ', id, ';') 'kill_query'
                        FROM information_schema.processlist 
                        WHERE `info` LIKE ('", selectPattern, "') 
                        AND `time` >= ", runTime, "
						AND user LIKE ('", cUser, "')
						AND state LIKE ('", cState, "')");
    PREPARE Q FROM @stmt;
    EXECUTE Q;
    DEALLOCATE PREPARE Q;
    
    -- Выполняем каждый kill-запрос по отдельности
    OPEN curs;
    killQueries: LOOP
      FETCH curs
      INTO oneKillQuery;
      IF finished = 1
      THEN
        LEAVE killQueries;
      END IF;
      SET @killQuery = oneKillQuery;
      PREPARE Q FROM @killQuery;
      EXECUTE Q;
      DEALLOCATE PREPARE Q;
    END LOOP killQueries;
    CLOSE curs;

    -- удаляем временную таблицу
    DROP TABLE mysql_kill_list;

  END $$
DELIMITER ;

-- запускаем процедуру с необходимыми параметрами
CALL totalKILL(@runTime, @selectPattern, @cUser, @cState);

-- удаляем процедуру
DROP PROCEDURE totalKILL;
/**
 * @param string $coords Координаты города в формате "Долгота,Широта"
 * @return string Кладр
 */
function getKladrByCityCoords($coords) {
	$opts = array('http' =>
		array(
			'method'  => 'GET',
			'user_agent '  => "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
			'header' => array(
				'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
				'Content-type: application/x-www-form-urlencoded'
				), 
		)
	);
	$context  = stream_context_create($opts);

	// Ограничение по количеству обращений в день — 25 000
	$url = "https://geocode-maps.yandex.ru/1.x/?format=json&results=1&geocode={$coords}";
	$res = file_get_contents($url, false, $context);
	$res = json_decode($res, true);
	$address = urlencode($res["response"]["GeoObjectCollection"]["featureMember"][0]["GeoObject"]["description"]);

	// Ограничение по количеству обращений в день — 100 000 
	$url = "http://kladr-api.ru/api.php?query={$address}&oneString=1&limit=1";
	$res = file_get_contents($url, false, $context);
	$res = json_decode($res, true);
	$kladr = $res["result"][0]["id"];
	
	return $kladr;
}

Может использоваться для контроля одновременного исполнения скриптов.

public function isRunning($phpFilePath)
{
    $processes = shell_exec('ps uax | grep php | grep -v bin/sh');
    return strpos($processes, $phpFilePath) !== strrpos($processes, $phpFilePath);
}

Команда удаления файлов из папки {FOLDER2}, имена которых совпадают с файлами из {FOLDER1}.

/bin/ls -1 {FOLDER1} | xargs -I {} rm {FOLDER2}{}

{FOLDER1}, {FOLDER2} - абсолютные/относительные пути.

Запуск разворачивания sql дампа без прерывания в случае закрытия консоли:

nohup mysql -u [username] -p[password] -f [database] < [path/to/sqlfile.sql] &

Проверка статуса:

ps -p [PID]

На случай, если зависло:

kill -9 [PID]

Функция на основе массива входящих урлов возвращает массив с информацией содержащейся на этих урлах. Входные данные: $urls = [

'url1',
'url2',
 ...

]; Выходные данные: $urlData = [

'url1' => [
    'http_status_code' => integer,
    'title'            => plain/text | NULL,
    'description'      => plain/text | NULL,
    'body'             => plain/text | NULL,
],
'url2' => [
    'http_status_code' => integer,
    'title'            => plain/text | NULL,
    'description'      => plain/text | NULL,
    'body'             => plain/text | NULL,
],
...

];

function getUrlsData(Array $urls)
{
    $urlData = [];
    $mh = curl_multi_init();
    $chResources = [];

    foreach ($urls as $key => $url) {
        $chResources[$key] = curl_init();
        curl_setopt($chResources[$key], CURLOPT_USERAGENT,
          'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3');
        curl_setopt($chResources[$key], CURLOPT_CONNECTTIMEOUT, 5);
        curl_setopt($chResources[$key], CURLOPT_TIMEOUT, 5);
        curl_setopt($chResources[$key], CURLOPT_RETURNTRANSFER, true);
        curl_setopt($chResources[$key], CURLOPT_URL, $url);
        curl_multi_add_handle($mh, $chResources[$key]);
    }

    $running = 0;
    do {
        curl_multi_exec($mh, $running);
        curl_multi_select($mh);
    } while ($running > 0);


    foreach ($chResources as $key => $ch) {
        $contentType = curl_getinfo($ch, CURLINFO_CONTENT_TYPE);
        $httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        $pageContent = curl_multi_getcontent($ch);
        curl_multi_remove_handle($mh, $ch);

        $urlData[$urls[$key]]['http_status_code'] = $httpStatusCode;
        if (strripos($contentType, 'text/html') !== false AND $httpStatusCode == 200) {

            // strip some tags
            $pageContent = preg_replace('#<script.*>.*</script>#is', '', $pageContent);
            $pageContent = preg_replace('#<style.*>.*</style>#is', '', $pageContent);

            // create DOM model
            $doc = new DOMDocument();
            @$doc->loadHTML($pageContent);

            // title
            $nodes = $doc->getElementsByTagName('title');
            if ($nodes->length > 0) {
                $urlData[$urls[$key]]['title'] = $nodes->item(0)->nodeValue;
            }

            // meta description
            $nodes = $doc->getElementsByTagName('meta');
            for ($i = 0; $i < $nodes->length; $i++) {
                $node = $nodes->item($i);
                if (strtolower($node->getAttribute('name')) == 'description') {
                    $urlData[$urls[$key]]['description'] = $node->getAttribute('content');
                }
            }

            // body text
            $nodes = $doc->getElementsByTagName("body");
            if ($nodes->length > 0) {
                $urlData[$urls[$key]]['body'] = $nodes->item(0)->nodeValue;
            }
        }
    }
    curl_multi_close($mh);

    return $urlData;
}