
Alan
26.07.2017
11:24:44
это чтоб лимиты на одновременную загрузку ресурсов обойти?

Mikhail
26.07.2017
11:24:53
отдельный поддомен для cdn всегда хорошая идея

Alan
26.07.2017
11:24:57
хттп2 вроде пофигу он все качает

Valentin
26.07.2017
11:26:34
С HTTP/2 проблема с лимитом соединений отпадает, потому что оно будет одно, мультиплексное

Google

Alan
26.07.2017
11:26:45
если таймлайн открыть то там видно по waterfall будет что все они одинаково качаются и stalled минимальный у всех

Valentin
26.07.2017
11:27:16
А субдомен для CDN, как мне кажется, актуален тогда, когда вращается система на нескольких машинах, и статика лежит где-то в другом месте
(или если ещё не, но заранее планируется вопрос масштабирования системы)

Mikhail
26.07.2017
11:27:52
ну если это cdn, то очевидно статика в другом месте

Valentin
26.07.2017
11:30:59
Да мало ли, как там чего у человека. Я вот в одном проекте cdn. загодя делал, пока система жила на одном сервере. Потомки успешно масштабировались на 4 сервера (два из которых крутили php-fpm, а другие два сервили статику)

Ad
26.07.2017
11:31:10
Ясно, спасибо.
Просто я тут замахнулся на отдельный сервер под мускул, отдельный под картинки и отдельный под маженту саму. Извините за офтоп.

Evgenii
26.07.2017
15:47:10
Господа, что я делаю не так?
rollback ничего не откатывает, говорит нет активной транзакции.
/** @var EntityManager $em */
$em = $this->getEntityManager();
$em->getConnection()->beginTransaction();
// $em->getConnection()->setAutoCommit(false);
try {
$em->persist($entity);
$em->flush();
$em->getConnection()->commit();
throw new Exception('test error');
return $entity;
} catch (Exception $e) {
$em->getConnection()->rollBack();
throw $e;
}

Dmitry
26.07.2017
15:51:17
ну так ты ее закомитил перед тем, как исключение кинуть

Evgenii
26.07.2017
15:53:18
хм, ну да.. в доке так указано: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/transactions-and-concurrency.html#approach-2-explicitly

Pavel
26.07.2017
15:54:16
коммит должен быть в самом конце
до всех возможных исключений
в доке так и указано))

Google

Dmitry
26.07.2017
15:54:50
у тебя сначала commit, а потом исключение, которое делает rollback, но транзакция уже закомичена, нечего ролбечить

Evgenii
26.07.2017
15:56:21
хм..
мне нужна такая логика.
1) Пишем строчку в БД.
2) потом я вызываю метод, который смотрит на эту строчку
3) Если этот метод кидает исключение, то ее нужно удалить.
но видимо транзакции тут тогда не подойдут и нужно будет строчку в ручную удалять?

Dmitry
26.07.2017
15:58:53
да можно и транзакциями... просто комит должен быть вызван _после_ метода проверки

Evgenii
26.07.2017
16:00:21
непонимаю как,
ведь строка записывается в БД в момент вызова commit
$em->persist($entity);
$em->flush();
$em->getConnection()->commit(); // в этот момент строка появляется в БД

Dmitry
26.07.2017
16:01:08
нет, в момент комита строка становится видимой для других паралельных запросов из других скриптов
$em->getConnection()->commit(); делает всего лишь SQL запрос COMMIT, а вот что такое транзакции и как работают - это найдешь в гугле

vlad
26.07.2017
16:11:39
ребят
всем привет
если процессы запускать один за одним, в цикле, они работают параллельно?
запуск делаю через start()
просто по какой-то причине появилась проблема:
запускаю процессы, если ставлю вывод отладочной информации из процесса, то всё отлично
медленно, но срабатывают
а если запускаю без отладочной информации, то в лучшем случае отрабатывает 1
я понимаю, что проблемы где-то на уровне памяти, что-то с чем-то конфликтует
ну и с run() всё тоже работает

Дмитрий
26.07.2017
19:42:10
AND DATE(k.created_at) = '2017-07-26'
как написать такое условие в createQueryBuilder

Алексей
27.07.2017
07:06:47
setParameter

Ivan
27.07.2017
07:37:52
ну и + DATE funtction для DQL

Eugeny
27.07.2017
09:46:15
Привет. Подскажите, как гуглить и на что обратить внимание. Ошибка: There is no extension able to load the configuration for "product_quest"
И может быть несколько расширений в бандле или бандл и есть расширение
?

Ivan
27.07.2017
09:56:37
одно

Google

Ivan
27.07.2017
09:57:09

Roman
27.07.2017
10:00:48
я так понимаю в конфиге есть раздел product_quest, а соответствующего бандла для этого нет

Valentin
27.07.2017
11:45:45
Надо проверить, добавлен ли он в AppKernel. Со мной бывало: через композер ставишь, конфиг добавляешь, а в список бандлов вписать забываешь

Eugeny
27.07.2017
13:35:45
Спасибо, решил проблему эту. Теперь другая:
The class 'ProductQuestBundle\Component\Quest\Model\ProductQuest' was not found in the chain configured namespaces

Andrew
27.07.2017
14:54:59


Daniel
28.07.2017
07:21:42
Всем дароу, я с вопросом к бывалым старажилам в вебе
Вот че-то видел, где веб-приложение базируют не HTTP протоколе, а на WebSocket полный + AMQP.
Client UI Event -> JavaScript pushToWsServer(event) + JavaScript WsServerSubscribeLoadResponseByEvent(event);
WsServer -> pushToAMQPReqestHandler();
AMQPRequestHandler -> handleRequest() -> pushResponseToOutAMQP Handler();
OutAMQPHandler -> pushResponseDataForRequestToWebsocketServer();
JavaScript Client <- Receive this data from OutAMQP into subscriber.
Т.е. клиент нажимает "зарегистрироваться", срабатывает событие на submit, данные из формы отправляются на WS канал определенный (pub-sub) + клиент подписывается на сообщения с этого канала с его RequestID например.
WS получает payload запроса и отправляет его в очередь на обработку в обработчик "А"
Обработчик "А" обрабатывает request и формирует response
Обработчик "А" кладет сформированный response в очередь ответов, а из очереди все идет в -> обработчик для респонсов "B"
Обработчик "B" отправляет полученный response в WebSocket сервер и нужный канал
Клиент получает этот response, т.к. был подписан
Т.е. типа профит:
Если произошла какая-то ошибка в обработчике запроса, можно переложить эту задачу на обработку запроса снова в очередь для повторной попытки обработки.
AMQP ван лове (шутка), HTTP - зажегся и умер, никак не восстановить и снова попытаться обработать.
WebSocket легковеснее.


Sergey
28.07.2017
07:28:03
ну как сказать легковеснее. держать одновременно тысячи коннектов такое себе
гугл не умеет скрейпить вебсокеты

Dmitriy
28.07.2017
07:28:35
в чем вопрос?
это SOA с гарантией доставки + вебсокеты
чтобы такое делать, поддерживать - проект уже должен стать успешным и тормозным или иметь большую кучу бабла

Sergey
28.07.2017
08:00:46
не, это не soa, это просто какая-то дичь
1. web sockets нужны только там где тебе надо что бы сервер мог инициировать отправку сообщения
2. web sockets сложнее масштабировать
3. web sockets сложнее контролировать на клиенте (сам по суди, ты делаешь запрос, запоминаешь айдиху, хз дойдет ли запрос и получишь ли ты ответ, что делать, перепосылать или нет...)
4. как следствие 3-его - пипец тяжело дебажить
перед тем как пробовать подобные штуки лучше сделать бенчмарк с http (нормально затюненном) и только потом думать "а надо ли мне что-то еще"


Roman
28.07.2017
08:52:38
Здравствуйте, есть вопрос по сериализаторам. Есть две сущности Post и Comment. У поста есть много комментов. У каждого коммента есть указатель на Pots. Можно ли внутри PostNormalizer, задать для CommentNormalizer setIgnoredAttributes(['post']), что бы при выполнении операции $this->serializer->normalize($comments, $format, $context); внутри PostNormalizer не возникало ошибки CircularReference? Сейчас обхожу эту проблему тем, что просто вручную перечисляю, какие свойства сущности Comment сериализовывать, а хотелось бы наоборот, по умлочанию сериализовывать весь объект, но указывать, какие свойства не нужно. Спасибо.

Sergey
28.07.2017
09:04:31
https://symfony.com/doc/current/components/serializer.html#handling-circular-references сюда смотрел?

Roman
28.07.2017
09:23:14
Дело в том, что внутри нормализаторов я использую SerializerAwareInterface, что бы в конструкторе не пришлось указывать отдельно сериализаторы для разных сущностей, а можно просто вызвать $this->serializer->normalize($comments), $this->serializer->normalize($author) и нормализатор автоматически определяется в зависимости от сущности. В доках setIgnoredAttributes и setCircularReferenceHandler применяется к нормализатору, который потом передается на вход сериализатору, а вмоем случае доступа к конкретному нормализатору у меня нет, т.к. внутри PostNormalizer я могу получить только $this->serializer, а $this->setCircularReferenceHandler() вызывает ошибку Attempted to call an undefined method named "setCircularReferenceHandler" of class "AppBundle\Serialization\PostNormalizer"

Sergey
28.07.2017
09:27:43
AppBundle\Serialization\PostNormalizer унаследуй от AbstractNormalizer

Dmitry
28.07.2017
09:29:11
MaxDepth?

Google

vlad
28.07.2017
11:35:30
ребят, всем привет
как лучше перенести юзеров с одного сайта на другой?
структуры БД разные, в частности разный класс, унаследованный от fosuserbundle
копать в сторону миграций?

Dinar
28.07.2017
11:42:06
Команду можно создать консольную.
Миграции я думаю тут совсем не стоит.

Sergey
28.07.2017
11:42:39
миграции для такого не годятся
дбал в руки и лопатой перебрасывать данные в другую базу)

Dinar
28.07.2017
11:45:26
Просто с командой можно протестировать на тестовых БД. Потом уже и в прод прогнать.
И проревьюить можно всегда.

Admin
ERROR: S client not available

Dinar
28.07.2017
11:46:04
И запустить одной командой в нужное время суток.
И реюзнуть, если вдруг придётся

Ivan
28.07.2017
11:47:33
экспортировать (csv), потом импортировать, подгоняя под новую структуру

Dmitriy
28.07.2017
11:49:50
еще вариант закину )

vlad
28.07.2017
11:49:50
всем спасибо, попробую наваять команду

Dmitriy
28.07.2017
11:50:00
закидываешь базу в базу
у той базы таблицам ставишь префикс
и прям в скл клиенте фигачишь запросы и перегоняешь данные
префикс нужен если имена таблиц совпадают
сами скл запросы лучше сохранить где нить в файле )

Google

Dmitriy
28.07.2017
11:52:02
пригодятся

vlad
28.07.2017
12:02:41
ну, с запросами у меня пока проблема, так что остановился на варианте накидать скрипт
и присто перекидать все данные юзеров в файлик, что-то вроде csv, а затем на втором проекте забить всех юзеров и перекидать этот csv в те поля, которые мне нужны
ребят, вопрос:
1) насколько я знаю, пароль же шифруется? его просто перетягивать так, как есть? с этим проблем не будет?

Ivan
28.07.2017
12:05:24
не будет, если алгоритм хэширования сохранился

Ed
28.07.2017
12:05:35

vlad
28.07.2017
12:06:48
и ещё, если можно:
$baseUsers = $this->getContainer()
->get('doctrine')
->getManager()
->getRepository('как тут обратится к fosuserbundle?')
->findAll();
извините за такие вопросы, совсем новичковые
только учусь
до этого вытягивал из сущностей только своего бандла
а тут что-то вопрос появился

Ed
28.07.2017
12:07:24
выборка, которую хочу напрямую через PDO сделать, без доктрины. Лучше в репозиторие сделать или отдельным сервисом? Просто хуливар возник с коллегой. Имхо это в репе делается

vlad
28.07.2017
12:07:25
оу
я понял, херню сказал
класс же унаследован
извините)

Dmitriy
28.07.2017
12:07:47
попробуй вообще в phpmyadmin

vlad
28.07.2017
12:08:23
ну, если сейчас не получится, то буду пробовать другие варианты, спасибо
а, и ещё хотел спросить, по-поводу "литературы"
кто-нибудь знает хорошие маны по очередям процессов в symfony?
на своём проекте реализовали свой менеджер процессов, но говорят есть очереди
я тут, где-то выше, уже спрашивал по этому поводу, мне подсказали названия менеджеров, как я понимаю
но вот гугл даёт какие-то обрывки локальных действий с ними
или может в какой-то книге это описывалось?

Ed
28.07.2017
12:11:44
очереди? в пхп? лучше не копать яму. Есть нормальные инструменты для очередей rabbitmq, apache kafka, resque на худой конец

Dmitriy
28.07.2017
12:15:30
давали же http://kr.github.io/beanstalkd/

vlad
28.07.2017
12:15:59
возможно неверно выразился, да, я про них и спрашивал
очереди? в пхп? лучше не копать яму. Есть нормальные инструменты для очередей rabbitmq, apache kafka, resque на худой конец
сори, не заметил в тот раз, видимо
давали же http://kr.github.io/beanstalkd/
спасибо!