<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serov.eu &#187; php</title>
	<atom:link href="https://serov.eu/?feed=rss2&#038;tag=php" rel="self" type="application/rss+xml" />
	<link>https://serov.eu</link>
	<description>Блог программиста</description>
	<lastBuildDate>Thu, 30 Apr 2026 12:31:53 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.1.15</generator>
	<item>
		<title>Сортировка</title>
		<link>https://serov.eu/?p=761</link>
		<comments>https://serov.eu/?p=761#comments</comments>
		<pubDate>Tue, 21 Sep 2021 22:03:19 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=761</guid>
		<description><![CDATA[// по алфавиту usort($listGetOrganisationCoachsNoPhoto, function($a, $b) { return $a['FullName'] $b['FullName']; }); usort($arr, function($a, $b){ return ($b['position'] - $a['position']); }); // array_unique - убрать повторяющиеся значения в массиве]]></description>
				<content:encoded><![CDATA[<pre>
// по алфавиту
usort($listGetOrganisationCoachsNoPhoto, function($a, $b) {
    return $a['FullName'] <=> $b['FullName'];
});


 usort($arr, function($a, $b){
     return ($b['position'] - $a['position']);
 });

// array_unique - убрать повторяющиеся значения в массиве
</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=761</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP вывести сколько памяти использовал скрипт</title>
		<link>https://serov.eu/?p=731</link>
		<comments>https://serov.eu/?p=731#comments</comments>
		<pubDate>Mon, 12 Jul 2021 10:10:57 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=731</guid>
		<description><![CDATA[PHP вывести сколько памяти использовал скрипт &#160; function convert($size) { $unit=array('b','kb','mb','gb','tb','pb'); return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; } echo convert(memory_get_usage(true)); &#160; &#160;]]></description>
				<content:encoded><![CDATA[<p>PHP вывести сколько памяти использовал скрипт</p>
<p>&nbsp;</p>
<pre>

function convert($size)
{
    $unit=array('b','kb','mb','gb','tb','pb');
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i];
}

echo convert(memory_get_usage(true));

</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=731</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>tools</title>
		<link>https://serov.eu/?p=726</link>
		<comments>https://serov.eu/?p=726#comments</comments>
		<pubDate>Thu, 08 Jul 2021 10:35:27 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=726</guid>
		<description><![CDATA[Сделать из буфера ексель список для массива https://serov.eu/tools/filter.php]]></description>
				<content:encoded><![CDATA[<p>Сделать из буфера ексель список для массива</p>
<p><a href="https://serov.eu/tools/filter.php" target="_blank">https://serov.eu/tools/filter.php</a></p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=726</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Рецепт разбора SOAP ответа</title>
		<link>https://serov.eu/?p=691</link>
		<comments>https://serov.eu/?p=691#comments</comments>
		<pubDate>Wed, 19 May 2021 09:16:28 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[soap]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=691</guid>
		<description><![CDATA[Проблема: бывает так, что при вызове soap, ответ на стороне клиента не собирается в объект, это может быть и из-за wsdl или из-за неверного ответа от сервер. Решение: распарсить ответ от сервере как XML // выполняем функцию SOAP $response = $this-&#62;client-&#62;__soapCall("getParam", $param); // костыль, так как первый response ничего не вернул, будем тупо парсить XML &#8230; <a href="https://serov.eu/?p=691" class="more-link">Читать далее <span class="screen-reader-text">Рецепт разбора SOAP ответа</span></a>]]></description>
				<content:encoded><![CDATA[<p>Проблема: бывает так, что при вызове soap, ответ на стороне клиента не собирается в объект, это может быть и из-за wsdl или из-за неверного ответа от сервер.</p>
<p>Решение: распарсить ответ от сервере как XML</p>
<pre>// выполняем функцию SOAP
$response = $this-&gt;client-&gt;__soapCall("getParam", $param);

// костыль, так как первый response ничего не вернул, будем тупо парсить  XML ответ
$response = $this-&gt;client-&gt;__getLastResponse();

// xml парсеру не нравится тег с неймспейсами, вырезаем их
$response = str_ireplace(array('soapenv:', 'tem:', 'SOAP-ENV:', 'rpc:'), '', $response);
$xml = simplexml_load_string($response, "SimpleXMLElement", LIBXML_NOCDATA);

$json = json_encode($xml);
$arrayResponse = json_decode($json,TRUE);

</pre>
<p>Если есть ошибка при разборе, можно поиграть с параметрами</p>
<p>$xml = simplexml_load_string($response, &#171;SimpleXMLElement&#187;, <strong>LIBXML_COMPACT | LIBXML_PARSEHUGE</strong>);</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=691</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Асинхронное выполнение кода  PHP (нет)</title>
		<link>https://serov.eu/?p=687</link>
		<comments>https://serov.eu/?p=687#comments</comments>
		<pubDate>Mon, 10 May 2021 11:18:17 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=687</guid>
		<description><![CDATA[В книге &#171;Symfony 5. Быстрый старт&#187; есть хороший пример, когда нам надо выполнить какие то долгие действия  (отправить почту, вызвать сторонний API) но не заставлять пользователя ждать. Для этого используется очередь. Мы в очередь записываем действие, сразу отправляем ответ пользователю а дальше уже, в другом скрипте делаем задачи из очереди. Но если по каким то &#8230; <a href="https://serov.eu/?p=687" class="more-link">Читать далее <span class="screen-reader-text">Асинхронное выполнение кода  PHP (нет)</span></a>]]></description>
				<content:encoded><![CDATA[<p>В книге &#171;Symfony 5. Быстрый старт&#187; есть хороший пример, когда нам надо выполнить какие то долгие действия  (отправить почту, вызвать сторонний API) но не заставлять пользователя ждать. Для этого используется очередь. Мы в очередь записываем действие, сразу отправляем ответ пользователю а дальше уже, в другом скрипте делаем задачи из очереди.</p>
<p>Но если по каким то причинам, вы не можете поставить rabbitmq или вам это будет &#171;ДОРОГО&#187;, считай излишни, можно обойтись таким асинхронным выполнением. Суть его в том, что все действия делаем быстро, отдаем ответ клиенту, а потом уже, когда он отключился, продолжаем выполнять свои задачи:</p>
<pre>&lt;?php

// Игнорирует отключение пользователя 
ignore_user_abort(true);
//позволяет скрипту быть запущенным постоянно
set_time_limit(0);

// старт буфиризации
ob_start();
// вывести результат в буфер
echo $result;
$length = ob_get_length();


header('Connection: close');
header("Content-Length: " . $length);
header("Content-Encoding: none");
header("Accept-Ranges: bytes");
// отключаем буфиризацию
ob_end_flush();
// сбросить (отправить) буфер вывода
ob_flush();
// сброс системного буфера вывода
flush();


// а вот тут уже делаем все остальное</pre>
<p>По такому принципу у меня работает Telegram бот, он на входе принимает сообщение с внешнего источника, и тут же отключает этот источник от себя, а уже дальше отправляет сообщение в телегу</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=687</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Дайджест-аутентификация (Digest access authentication)</title>
		<link>https://serov.eu/?p=653</link>
		<comments>https://serov.eu/?p=653#comments</comments>
		<pubDate>Fri, 30 Apr 2021 08:03:18 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[curl]]></category>
		<category><![CDATA[Digest]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=653</guid>
		<description><![CDATA[Ранее я описывал алгоритм авторизации Digest, как самому собрать пакет данных Для  PHP все оказалось проще,  в  CURL уже есть готовый механизм, который делает 2 запроса для правильной авторизации Это параметр CURLOPT_HTTPAUTH => CURLAUTH_DIGEST, &#160; &#160; Полностью запрос: $request =[ 'SOAPAction: "http://yandex.ru/"', 'Content-Type: text/xml;charset=UTF-8', ]; $options = array( CURLOPT_URL => $url, CURLOPT_HEADER => true, CURLOPT_VERBOSE => &#8230; <a href="https://serov.eu/?p=653" class="more-link">Читать далее <span class="screen-reader-text">Дайджест-аутентификация (Digest access authentication)</span></a>]]></description>
				<content:encoded><![CDATA[<p><a href="https://serov.eu/?p=585">Ранее</a>  я описывал алгоритм авторизации Digest, как самому собрать пакет данных</p>
<p>Для  PHP все оказалось проще,  в  CURL уже есть готовый механизм, который делает 2 запроса для правильной авторизации</p>
<p>Это параметр CURLOPT_HTTPAUTH       => CURLAUTH_DIGEST,</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>Полностью запрос:</p>
<pre>

$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;



</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=653</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PUSHGATWAY</title>
		<link>https://serov.eu/?p=619</link>
		<comments>https://serov.eu/?p=619#comments</comments>
		<pubDate>Fri, 02 Apr 2021 18:24:46 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=619</guid>
		<description><![CDATA[Про PUSHGATWAY очень мало написано в инете, особенно под PHP Для установки локально PUSHGATWAY docker-compose.yml: pushgateway: image: prom/pushgateway restart: always container_name: app2022-pushgateway ports: - 9091:9091 - 9090:9090 networks: - front - backend &#160; Есть библиотека для работы с pushgateway https://github.com/PromPHP/prometheus_push_gateway_php -&#62; promphp/prometheus_push_gateway_php &#160; Однако, нашел хороший простой класс, который основан на GuzzleHttp\Client: https://github.com/markarik/wnl-platform/blob/9f4383e850373e1849f04f6d1487268cf91fa615/app/Console/PrometheusPushgateway.php Немного модифицировал его под &#8230; <a href="https://serov.eu/?p=619" class="more-link">Читать далее <span class="screen-reader-text">PUSHGATWAY</span></a>]]></description>
				<content:encoded><![CDATA[<p>Про PUSHGATWAY очень мало написано в инете, особенно под PHP</p>
<p>Для установки локально PUSHGATWAY docker-compose.yml:</p>
<pre>    pushgateway:
        image: prom/pushgateway
        restart: always
        container_name: app2022-pushgateway
        ports:
            - 9091:9091
            - 9090:9090
        networks:
            - front
            - backend

</pre>
<p>&nbsp;</p>
<p>Есть библиотека для работы с pushgateway</p>
<pre>https://github.com/PromPHP/prometheus_push_gateway_php -&gt;
promphp/prometheus_push_gateway_php</pre>
<p>&nbsp;</p>
<p>Однако, нашел хороший простой класс, который основан на GuzzleHttp\Client:</p>
<p>https://github.com/markarik/wnl-platform/blob/9f4383e850373e1849f04f6d1487268cf91fa615/app/Console/PrometheusPushgateway.php</p>
<p>Немного модифицировал его под свои нужды, и получилось вот такое</p>
<pre>&lt;?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-&gt;request('POST', $url, [
            'body' =&gt; $body
         ]);
      } catch (GuzzleException $exception) {
          exit('error');
      }
   }
}</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=619</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Когда sitemap.xml нужно обработать как PHP</title>
		<link>https://serov.eu/?p=514</link>
		<comments>https://serov.eu/?p=514#comments</comments>
		<pubDate>Sat, 29 Feb 2020 11:11:51 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[.htaccess]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=514</guid>
		<description><![CDATA[.htaccess: &#60;Files "sitemap.xml"&#62; AddHandler application/x-httpd-php .xml &#60;/Files&#62; &#160;]]></description>
				<content:encoded><![CDATA[<p><code><br />
.htaccess:</p>
<p>&lt;Files "sitemap.xml"&gt;<br />
AddHandler application/x-httpd-php .xml<br />
&lt;/Files&gt;</p>
<p>&nbsp;</p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=514</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>accessing  gmail inbox via php code</title>
		<link>https://serov.eu/?p=500</link>
		<comments>https://serov.eu/?p=500#comments</comments>
		<pubDate>Wed, 19 Feb 2020 12:56:28 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=500</guid>
		<description><![CDATA[&#60;?php $yourEmail = "you@gmail.com"; $yourEmailPassword = "your password"; $mailbox = imap_open("{imap.gmail.com:993/ssl}INBOX", $yourEmail, $yourEmailPassword); $mail = imap_search($mailbox, "ALL"); $mail_headers = imap_headerinfo($mailbox, $mail[0]); $subject = $mail_headers-&#62;subject; $from = $mail_headers-&#62;fromaddress; imap_setflag_full($mailbox, $mail[0], "\\Seen \\Flagged"); imap_close($mailbox); ?&#62;]]></description>
				<content:encoded><![CDATA[<pre class="lang-php prettyprint prettyprinted"><code><span class="pun">&lt;?</span><span class="pln">php

$yourEmail </span><span class="pun">=</span> <span class="str">"you@gmail.com"</span><span class="pun">;</span><span class="pln">
$yourEmailPassword </span><span class="pun">=</span> <span class="str">"your password"</span><span class="pun">;</span><span class="pln">

$mailbox </span><span class="pun">=</span><span class="pln"> imap_open</span><span class="pun">(</span><span class="str">"{imap.gmail.com:993/ssl}INBOX"</span><span class="pun">,</span><span class="pln"> $yourEmail</span><span class="pun">,</span><span class="pln"> $yourEmailPassword</span><span class="pun">);</span><span class="pln">
$mail </span><span class="pun">=</span><span class="pln"> imap_search</span><span class="pun">(</span><span class="pln">$mailbox</span><span class="pun">,</span> <span class="str">"ALL"</span><span class="pun">);</span><span class="pln">
$mail_headers </span><span class="pun">=</span><span class="pln"> imap_headerinfo</span><span class="pun">(</span><span class="pln">$mailbox</span><span class="pun">,</span><span class="pln"> $mail</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln">
$subject </span><span class="pun">=</span><span class="pln"> $mail_headers</span><span class="pun">-&gt;</span><span class="pln">subject</span><span class="pun">;</span><span class="pln">
$from </span><span class="pun">=</span><span class="pln"> $mail_headers</span><span class="pun">-&gt;</span><span class="pln">fromaddress</span><span class="pun">;</span><span class="pln">
imap_setflag_full</span><span class="pun">(</span><span class="pln">$mailbox</span><span class="pun">,</span><span class="pln"> $mail</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span> <span class="str">"\\Seen \\Flagged"</span><span class="pun">);</span><span class="pln">
imap_close</span><span class="pun">(</span><span class="pln">$mailbox</span><span class="pun">);</span>
<span class="pun">?&gt;</span></code></pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=500</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Создание уникального глобального идентификатора (GUID)</title>
		<link>https://serov.eu/?p=421</link>
		<comments>https://serov.eu/?p=421#comments</comments>
		<pubDate>Fri, 23 Aug 2019 11:31:43 +0000</pubDate>
		<dc:creator><![CDATA[Evgen]]></dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">https://serov.eu/?p=421</guid>
		<description><![CDATA[function GUID() { if (function_exists('com_create_guid') === true) { return trim(com_create_guid(), '{}'); } return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)); }; echo GUID();]]></description>
				<content:encoded><![CDATA[<pre>function GUID()
{
    if (function_exists('com_create_guid') === true) {

        return trim(com_create_guid(), '{}');
    }

       return sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535),
           mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535));


};

echo GUID();

</pre>
]]></content:encoded>
			<wfw:commentRss>https://serov.eu/?feed=rss2&#038;p=421</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
