PHP массив ассоциативный или последовательный ?

Опубликовано

Недавно возникла ситуация в которой нужно было проверить, что пришедший массив был ассоциативный или последовательный. Такой вот ответ возвращала платежная система. Он мог быть

"errors":{"amount":["The amount field is required."],"currency":["The currency field is required."]}

или вот таким

"errors":["IP address not allowed"]

Что бы правильно отобразить пользователю ошибки необходимо правильно распарсить пришедший ответ. Для этого мне помогла вот такая функция:

function isAssoc(array $arr)
{
   if (array() === $arr) return false;
   return array_keys($arr) !== range(0, count($arr) - 1);
}

Как исправить ошибку «client intended to send too large body»

Опубликовано

Иногда при загрузки файлов в WordPress или в другой системе вы можете получить ошибку в логах nginx

2017/10/14 11:09:32 [error] 19504#19504: *126356 client intended to send too large body: 13702749 bytes, client: 146.198.143.124, server: vexell.ru

Исправить вы ее можете, если у вас есть доступ к конфигурации nginx. Для этого вам необходимо открыть фаил конфигурации и добавить пункт  client_max_body_size.Например, это может выглядеть вот так:

server {
        server_name  vexell.ru www.vexell.ru;

        if ($host ~* www\.(.*)) {
         set $host_without_www $1;
         rewrite ^(.*)$ http://$host_without_www$1 permanent;
        }

	ssl    on;
        ssl_certificate         /etc/nginx/ssl/vexell.ru/server.crt;
        ssl_certificate_key     /etc/nginx/ssl/vexell.ru/server.key;

        listen               443 ssl http2;
        keepalive_timeout    70;

        client_max_body_size 50m;
        #... тут идет продолжение конфига 
}

После указания пункт конфигурации задается максимальный размер загружаемого файла. 

client_max_body_size
Задаёт максимально допустимый размер тела запроса клиента, указываемый в поле “Content-Length” заголовка запроса. Если размер больше заданного, то клиенту возвращается ошибка 413 (Request Entity Too Large). Следует иметь в виду, что браузеры не умеют корректно показывать эту ошибку. Установка параметра размер в 0 отключает проверку размера тела запроса клиента.

Как проверить открытые порты в linux

Опубликовано

Для того, что бы посмотреть открытые используемые порты в linux, можно воспользоваться командой sudo netstat -tlnp

[root@my-host ssh]# sudo netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      18910/nginx         
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      13322/sendmail      
tcp        0      0 0.0.0.0:443                 0.0.0.0:*                   LISTEN      18910/nginx         
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      18935/php-fpm       
tcp        0      0 127.0.0.1:3306              0.0.0.0:*                   LISTEN      27774/mysqld        
tcp        0      0 127.0.0.1:11211             0.0.0.0:*                   LISTEN      13185/memcached     
tcp        0      0 0.0.0.0:2221                0.0.0.0:*                   LISTEN      27911/sshd          
tcp        0      0 :::2221                     :::*                        LISTEN      27911/sshd

JSON Сериализация класса php с помощью JsonSerializable

Опубликовано

Очень часто возникает ситуация когда необходимо сериализовать тот или иной класс в JSON представление по определенным правилам.

Например, мы можем это сделать с помощью такой конструкции.

<?php
class Test {
	public $a = 'A';
	public $b = 'B';
}

$b = new Test();
echo json_encode($b);
?>

На выходе мы получим вот такой результат:

{"a":"A","b":"B"}

Но как быть, например, если у класса у нас есть приватные или продектед свойства, а при сериализации они все равно должны быть видны. Например, вот такой пример:

<?php
class Test {
	protected $a = 'A';
	protected $b;
}

$b = new Test();
echo json_encode($b);

На выходе мы получим просто пустой объект {}.

Для исправления этой проблемы в PHP существует интерфейс JsonSerializable, который и позволяет нам сериализовать класс по каки-то условиям. Например,

<?php
class Test implements JsonSerializable {
	protected $a = 'A';
	protected $b = true;
	public function jsonSerialize() {
		$result = array(
			'value' => $this->a,
			'result' => $this->b
		);
		return $result;
	}
}
$b = new Test();
echo json_encode($b);
?>

Нам нужно лишь реализовать метод jsonSerialize. Теперь на выходе у нас будет вот такой результат:

{"value":"A","result":true}

Такую возможность я использую для своих небольших ORM классов, что бы все приватные и публичные свойства моделей могли сериазоваться. Для этого я использую еще и рефлексию.

И базовый класс модели сериализации выглядит уже вот так.

<?php namespace App\Model;
class BaseJsonModel extends Base implements \JsonSerializable {
	public function __construct() {
		parent::__construct();
	}
	public function jsonSerialize() {
		$reflect = new \ReflectionClass($this);
		$props   = $reflect->getProperties(\ReflectionProperty::IS_PUBLIC | \ReflectionProperty::IS_PROTECTED);
		$result = array();
		foreach($props as $item) {
			$name = $item->getName();
			$result[$name] = $this->$name;
		}
		return $result;
	}
	public function __toString() {
		return json_encode($this->jsonSerialize(), JSON_UNESCAPED_UNICODE);
	}
}

Установка bower компонентов через https:// вместо git://

Опубликовано

Большинство компонентов которые устанавливаются через Bower, например, пытаются произвести загрузку через get:// протокол, а он работает по порту 9418. Если у вас установлен фаервол который закрывает этот порт, то само собой загрузить ничего не получится.

Поэтому существует специальная настройка конфигурации которая позволяет загружать компоненты по https протоколу.  Для этого в консоли вашей ОС выполните следующую строку.

git config --global url.https://.insteadOf git://

Сортировка DOM элементов с jQuery

Опубликовано

Очень часто может возникнуть ситуация когда необходима сортировка html элементов в DOM с помощью javascript.

Для решения данной задачи можно воспользоваться встроенной функцией sort.

Например, у нас есть вот такой неупорядоченный список.

<button class="sort-elements">Сортировать</button>

<div class="sorting">
    <ul class="elements">
        <li>Элементы</li>
        <li>Для</li>
        <li>Проверки</li>
        <li>Сортировки</li>
        <li>На</li>
        <li>jQuery</li>
    </ul>
</div>

Для его сортировки можно использовать следующий метод

$('.sort-elements').click(function(){
    var $elements = $('.elements li');
    var $target = $('.sorting ul');
    
    $elements.sort(function (a, b) {
        var an = $(a).text(),
            bn = $(b).text();
        
        if (an && bn) {
            return an.toUpperCase().localeCompare(bn.toUpperCase());
        }
        
        return 0;
    });
    
    $elements.detach().appendTo($target);
});

Или вот здесь можно посмотреть рабочий пример сортировки.

Как сменить значения двух столбцов в mysql

Опубликовано

Очень часто мы можем ошибиться при внесении данных в БД mysql, например, такое часто может возникнуть когда вы спутаете параметры широты или долготы. Что бы быстро сменить значения двух столбцов в БД вам пригодится вот такой простой запрос который меняет значения и для NULL столбцов тоже.

UPDATE swap_test SET x=(@temp:=x), x = y, y = @temp;

Ошибка «upstream sent too big header» при установке xdebug в symfony 2

Опубликовано

После установки xdebug и запуске DEV environment в Symfony 2 можно получить ошибку Bad Gateway. В логах nginx можно найти следующую ошибку:

upstream sent too big header while reading response header from upstream

Для ее исправления необходимо увеличить параметры в конфигурации виртуального хоста Nginx.

fastcgi_buffer_size 32k;
fastcgi_buffers 4 32k;

В итоге получаем вот такой конфиг:

location ~ ^/(app|app_dev|config)\.php(/|$) {
          fastcgi_buffer_size 32k;
          fastcgi_buffers 4 32k;
          fastcgi_pass    unix:/tmp/site.sock;
          fastcgi_split_path_info ^(.+\.php)(/.*)$;
          include fastcgi_params;
          fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param  HTTPS off;
        }

strip_tags на javascript или как убрать html теги

Опубликовано

Простенькая функция на javascript которая поможет вам убирать html теги

function strip(html)
{
    var tmp = document.createElement("DIV");
    tmp.innerHTML = html;
    return tmp.textContent||tmp.innerText;
}

wordpress: get_the_content() с форматированием

Опубликовано

Если вы пользовались функцией get_the_content(), то замечали, что она возвращает данные в не форматированном виде. Функция the_content() же возвращает форматированные данные.

<?php echo get_the_content(); ?>
<?php the_content(); ?>

Для того, что бы функция get_the_content() возвращала форматированные данные, к ней необходимо применить фильтр the_content. Для этого напишем свою функцию get_formatting_content() и поместим ее в файл «functions.php».

function get_formatting_content ($more_link_text = '(more...)', $stripteaser = 0, $more_file = '') {
	$content = get_the_content($more_link_text, $stripteaser, $more_file);
	$content = apply_filters('the_content', $content);
	$content = str_replace(']]>', ']]&gt;', $content);
	return $content;
}
Страница 1 из 212