Блог

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);
}

Поездка в парк Seven Sisters

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

Сегодня я хотел бы вам рассказать о нашем небольшом путешествии. В выходной мы решили посетить одно из самых красивых мест в Англии — это парк Seven Sisters (Севен Систерс) который находится на южном побережье. Seven Sisters — группа меловых скал которые расположены вдоль побережья Ла-Манша в Восточном Суссексе между городами Сифорд и Истборн, они составляют часть территории меловых образований Сауз Даунс. Юго-восточнее Сестёр расположен мыс Бичи-Хед — высочайшая (162 м) меловая скала Великобритании.

Как исправить ошибку «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 отключает проверку размера тела запроса клиента.

Дружим WordPress и Webpack

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

Разработку фронтенда сегодня уже тяжело представить без webpack, а все потому что он предоставляет очень удобные возможности для автоматизации многих процессов. Это очень сильно облегчает процесс разработки и само-собой ускоряет его. В этот раз, когда я решил обновить тему для своего блога, я решил попробовать использовать его возможности. Особенно мне хотелось использовать sass при создании темы и добавить postcss с autoprefixer. Ну что же, есть желание, то надо пробовать. 

Как проверить открытые порты в 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);
	}
}

Путешествие в далекий и удивительный Вьетнам

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

Любое путешествие — это уникальная возможность открыть для себя новые места, встретить интересных людей и познакомиться с новой культурой. Одним из таких путешествий для меня оказался Вьетнам. Это первая азиатская страна в которой мне удалось побывать. Я очень долго ждал эту поездку и мне хотелось узнать немного больше об этой стране. И я, совместно с друзьями, отправился туда на целых 2 недели в майские праздники. 

Фотографии с поездки в Черногорию

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

С недавней поездки в Черногорию удалось запечатлить прекрасные виды страны. Это страна где море сочетается с горами и создается прекрасный пейзаж. Спешу поделиться с вами несколькими фотографиями.

Разработка игры: Умник! Играй с друзьями

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

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

Чаще всего игры в социальных представлены как Flash контейнер или через iframe. Если раньше большая часть игр была на Flash, то благодаря технологиям которые сегодня дает веб уже можно писать многопользовательские и анимационные игры.

Вот и в один из вечеров я решил попробовать написать свою игру и посмотреть на каких технологиях это можно сделать. Моя игра Вконтакте http://vk.com/app4533532. А дальше небольшое описание.

Путешествие в летний Саранск

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

Часто бывая в Саранске на выходных стараюсь сделать несколько фоток города. Ведь летом он прекрасен и красив. Вот небольшая галерея которая будет потихоньку добавляться.