public class ContentCaptureResponse extends HttpServletResponseWrapper {
    private ByteArrayOutputStream contentBuffer;
    private PrintWriter writer;
    public ContentCaptureResponse(HttpServletResponse response) {
        super(response);
    }
    @Override
    public PrintWriter getWriter() throws IOException {
        if (writer == null) {
            writer = new PrintWriter(getContentBuffer());
        }
        return writer;
    }
    private ByteArrayOutputStream getContentBuffer() {
        if (contentBuffer == null) {
            contentBuffer = new ByteArrayOutputStream();
        }
        return contentBuffer;
    }
    public String getContent() throws IOException {
        getWriter().flush();
        return new String(getContentBuffer().toString());
    }
}@WebFilter(urlPatterns={"/*"})
public class RequestTrack implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
        ContentCaptureResponse contentCaptureResponse = new ContentCaptureResponse(httpResponse);
        filterChain.doFilter(servletRequest, contentCaptureResponse);
        String content = contentCaptureResponse.getContent();
        // content.length();
        // оригинальный response у нас будет пуст, так как в doFilter() мы подменили объект, поэтому пишем в outputStream оригинального response контент, который получили в ответе
        servletResponse.getOutputStream().write(content.getBytes(StandardCharsets.UTF_8));
    }
    @Override
    public void destroy() {}
}version: '3'
services:
  nginx-proxy:
    image: jwilder/nginx-proxy
    container_name: nginx-proxy
    ports:
      - "80:80"
    networks:
      - proxy
    volumes:
      - /var/run/docker.sock:/tmp/docker.sock:ro
networks:
  proxy:
    driver: bridge
# вне этого docker-compose.yml сеть будет доступна по имени {директория}_proxy, в моём случае это nginx_proxy# ...
services:
  # Web server
  web:
    image: nginx
    environment:
      - 'VIRTUAL_HOST=${NGINX_HOST}' # подтягиваем из конфигурации окружения (.env, NGINX_HOST=api.local)
    networks:
       nginx_proxy: # чтобы наш хостовый nginx мог достучаться по общей с прокси сети до других контейнеров в той же сети
           aliases:
               - ${NGINX_HOST} # указываем алиас, по которому будет доступен контейнер, в моём случае это локальный хост api.local
       default: # дефолтная сеть, чтобы не ломать связь внутри текущей Docker Compose конфигурации
  # PHP
  php:
    image: php
    networks:
      - nginx_proxy # возможность из PHP иметь доступ к общей прокси сети, чтобы взаимодействовать с другими хостами
      - default
networks:
  nginx_proxy: # возьмём сеть извне
    external: truehttp://api.local/')).      set_error_handler(
            function ($errno, $errstr) use($data) {
                var_dump($errstr);
            },
            E_ALL
        );session_write_close(): open(/var/www/mysite/data/mod-tmp/sess_s8jm3ltvjbwermqsdr035rk6fp6, O_RDWR) failed: No such file or directory (2)"
string(162) "session_write_close(): Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/www/mysite/data/mod-tmp)
<?php
namespace common\rbac;
use Yii;
use yii\rbac\DbManager as YiiDbManager;
class DbManager extends YiiDbManager
{
    /**
     * Выбранная роль
     * @var
     */
    protected $currentRole;
    /**
     * Немного переопределим инициализацию, чтобы узнать какую роль установил юзер
     */
    public function init()
    {
        parent::init();
        if (is_null($this->currentRole)) {
            // Здесь проставим выбранную роль для юзера
           // Пока что вручную, потом данный параметр будет подтягиваться из сессий, к примеру
            $this->currentRole = 'buyer';
        }
    }
    /**
     * Определим какую из ролей пользователя выдать под текущий запрос
     * @param $userId
     * @return array
     */
    public function getAssignments($userId)
    {
        // Доступные пользователю роли
        $allAssignments = parent::getAssignments($userId);
        // Какую роль он предпочёл в этот раз
        $currentRole = $this->currentRole;
        // Найдём в доступных ролях требуемую
        $assignments = array_filter(
            $allAssignments,
            function ($key) use ($currentRole) {
                return $key === $currentRole;
            },
            ARRAY_FILTER_USE_KEY
        );
        // Если роль не нашлась, то используем первую из доступных
        if (empty($assignments)) {
            $assignments = array_shift($allAssignments);
        }
        return $assignments;
    }
}public function runAction($id, $params = [])
    {
        \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
        // Если условие истино, то выкидываю ошибку
        if (mt_rand(0,1) === 0) {
            return [
                   'status' => false,
                   'errors' => 'Ошибка'
            ];
        } else {
        // Иначе продолжаем выполнение
            parent::runAction($id, $params);
        }
    }<IfModule mod_remoteip.c>
RemoteIPHeader X-Real-IP
RemoteIPInternalProxy 127.0.0.1
RemoteIPInternalProxy [IP вашего хоста]
RemoteIPInternalProxy [Другой IP вашего хоста]
</IfModule>redis.on('pmessage', function (pattern, channel, message) {
    // some code
});// вешаем событие не через .on, а через .addListener
// onPmessage - коллбэк, который вынесен в функцию, в этом же пространстве имен
redis.addListener('pmessage', onPmessage);socket.on('disconnect', function () {
    redis.removeListener('pmessage', onPmessage);
});foreach (($table_header->children) as $num => $th_row) {
            //  echo "FIRST foreach<br>";
            //var_dump($th_row->plaintext);
            //var_dump($num);
            switch(trim($th_row->plaintext)){
                case 'Наименование':
               // case 'Наименование светильника':
                    $numer["name"] = $num;
                    break;
                case 'Фото':
                case 'Изображение':
                    $numer['image'] = $num;
                    break;
                case 'Артикул':
                    $numer['model'] = $num;
                    break;
            }
        }foreach ($arr_of_tl as $num => $value) {...}$post = Sentinel::getUser()->posts()-save($request->all());
return redirect ('/');public static function boot()
    {
        parent::boot();
        static::creating(function($news)
        {
            dd('Create new item');
        });
    }// App/Models/News
public static function boot()
    {
        parent::boot();
        static::creating(function($news)
        {
            Event::fire('news.createcrosspost', array($news));
        });
    }
// App/Providers/EventServiceProvider
protected $listen = [
		'news.createcrosspost' => [
			'CrosspostController@social',
		],
	];function abort404 ($code = 404, $message = '', array $headers = []) {
    header(' ', true, $code);
    return app()->abort($code, $message, $headers);
}echo json_encode($times);jQuery.ajax({
            type: "POST",
            url: "/function/checkTime.php",
            data: ({date:date}),
            dataType:"text",
            success: function(data) {
                console.log(data);
    }
});{"0":"1","id":"1","1":"2014-05-24","date":"2014-05-24","2":"16:00","time_start":"16:00","3":"17:00","time_end":"17:00"}
$('#right').on('click', '.firstcircle, .secondcircle, .thirdcircle, .fourthtcircle', 
    function(){
    var findSelected = $("div.selectedcircle");
    var selectedElementId = $(findSelected).attr('data-slide');
    $('.firstcircle, .secondcircle, .thirdcircle, .fourthtcircle').removeClass('selectedcircle');
    if (selectedElementId == 4) {
        $('.firstcircle').addClass('selectedcircle');}
    else if (selectedElementId == 1) {
        $('.secondcircle').addClass('selectedcircle');}
    else if (selectedElementId == 2) {
        $('.thirdcircle').addClass('selectedcircle');}
    else {$('.fourthcircle').addClass('selectedcircle');}
    });$('.circles').on('click', '.firstcircle, .secondcircle, .thirdcircle, .fourthtcircle', function(e) {
    e.preventDefault();
    $('.firstcircle, .secondcircle, .thirdcircle, .fourthtcircle').removeClass('selectedcircle');
    $(this).addClass('selectedcircle');
    });