• 95% успеха зависит от архитектуры
  • основное усилие нужно направить на обеспечение гибкости системы
  • не получится всё спрогнозировать заранее, поэтому ключ в постепенном росте, нужно постепенно принимать правильные архитектурные решения
  • решения должны быть простыми, гибкая система не бывает сложной
  • правильные приоритеты - всё, что влияет меньше чем на 5% пользователей можно отложить и заняться тем, что важнее

Для связи таблиц в дочерней таблице мы можем создать внешний ключ, описывающий связь с записями родительской таблицы.

При создании внешнего ключа мы можем указать поведение записей дочерней таблицы при изменении записей родительской таблицы.

Допустим у нас есть таблица с годами:

CREATE TABLE `year` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `year` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

таблица с месяцами:

CREATE TABLE `month` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `month` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

и таблица с днями:

Смотрим какое ядро используется сейчас:

uname -r

Выбираем новую версию ядра тут: http://kernel.ubuntu.com/~kernel-ppa/mainline/

Скачиваем deb файлы для своей архитектуры:

cd /tmp/
wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.4.111/linux-headers-4.4.111-0404111-generic_4.4.111-0404111.201801100931_amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.4.111/linux-image-4.4.111-0404111-generic_4.4.111-0404111.201801100931_amd64.deb

Устанавливаем файлы ядра:

sudo dpkg -i *.deb

Обновляем загрузчик:

sudo update-grub

Перезагружаемся:

sudo reboot

Проверяем версию:

uname -r

twig

Как установить twig?

composer require twig/twig

Как подключить twig?

$loader = new Twig_Loader_Filesystem('./templates');
$twig = new Twig_Environment($loader, array(
    'cache' => './cache',
//    'debug' => true,
));

$template = $twig->load('index.html.twig');

echo $template->render();

Как добавить глобальную переменную?

$twg->addGlobal('siteName', 'Тест');

Как добавить кастомные функции, проверки, фильтры?

/**
 * Class MyTwigExtension
 */
class MyTwigExtension extends \Twig_Extension
{
    /**
     * @return array
     */
    public function getTests()
    {
        return array(
            new \Twig_SimpleTest('instance_of', array($this, 'isInstanceOfTest'))
        );
    }

    /**
     * @return array
     */
    public function getFunctions()
    {
        return array(
  • y - stage this hunk (добавить этот кусок в индекс)
  • n - do not stage this hunk (не добавлять этот кусок в индекс)
  • a - stage this and all the remaining hunks in the file (добавить этот и все оставшиеся куски в этом файле в индекс)
  • d - do not stage this hunk nor any of the remaining hunks in the file (не добавлять в индекс ни этот, ни последующие куски в этом файле)
  • g - select a hunk to go to (выбрать кусок и перейти к нему)
  • / - search for a hunk matching the given regex (поиск куска по регулярному выражению)
  • j - leave this hunk undecided, see next undecided hunk (отложить решение для этого куска, перейти к следующему отложенному куску)
  • J - leave this hunk undecided, see next hunk (отложить решение для этого куска, перейти к следующему куску)
  • k - leave this hunk undecided, see previous undecided hunk (отложить решение для этого куска, перейти к предыдущему отложенному куску)

Как установить установщик?

php -r "readfile('https://symfony.com/installer');" > symfony

Как установить symfony?

symfony new project-name

Как установить старый symfony?

symfony new old-project-name 2.8

Как настроить PhpStorm?

  • устанавливаем плагин Symfony Plugin
  • устанавливаем плагин PHP Annotations
  • ставим галочку Languages & Frameworks > PHP > Symfony > Enable Plugin for this Project
  • на этой же вкладке меняем пути на var/cache/dev/appDevUrlGenerator.php и var/cache/dev/translations

1. Устанавливаем

composer require monolog/monolog

2. Подключаем, если composer autoload ещё не подключен

require_once 'vendor/autoload.php';

3. Создаём логгер в нашем крон-скрипте

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$logger = new Logger('main');
$logger->setHandlers(
    array(
        new StreamHandler('php://stdout'),
        new StreamHandler('php://stderr', Logger::ERROR),
    )
);
// это сообщение будет сохранено в файл
$logger->info('Info message');
// это сообщение будет сохранено в файл и отправлено на почту
$logger->error('Error message'); 

Страницы