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: true
http://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');
});