@phpclubru

Страница 584 из 956
Artem
10.05.2018
14:09:56
В том что в кривом случае перед асинхронными вызовами подставляется всякое типа yield, await и т.д.
ну так и в Go он тогда иначе выглядит. тебе нужно всякие waitgroup использовать мьютексы и т.д.

плюс каналы и вся синхронизация потоков, нифига он не также выглядит

Pavel
10.05.2018
14:10:24
ну так и в Go он тогда иначе выглядит. тебе нужно всякие waitgroup использовать мьютексы и т.д.
Вот я и спрашиваю, почему нельзя писать без await так же как в го

Artem
10.05.2018
14:10:52
ну так у тебя по сути два отдельных процесса, в случае того же Го да они легковестные и скорее абстрактные, но все же изолированные

Google
Artem
10.05.2018
14:11:00
тебе нужно же синхронизировать результат

Pavel
10.05.2018
14:11:24
Я подозреваю что принципиальная разница в том что эти корутины/файберы должны уметь сохранять состояние на стеке. Чего генераторы не умеют.

Artem
10.05.2018
14:14:11
совсем не обязательно хранить состояние. Это же конкурентность, в большинстве случаев просто независимое исполнение и в случае получения команды он вешает исползенение до получения результата

Pavel
10.05.2018
14:14:29
Вы не отвечаете на мой ответ

Artem
10.05.2018
14:15:10
Вы не отвечаете на мой ответ
если твой ответ в условияях, то при условии, что он не изменяет ничего

но я все равно не пойму сути вопроса, что значит выглядит как синхронный или асинхронный.

Pavel
10.05.2018
14:16:29
Еще раз, вот пример: while ($socket = yield $server->accept()) { $clientHandler($socket); }

Вот пример на go for { conn, err := ln.Accept() if err != nil { // handle error } go handleConnection(conn) }

Artem
10.05.2018
14:17:09
Pavel
10.05.2018
14:17:15
Вопрос: можно ли убрать слово yield из пхп кода и почему без него нельзя обойтись? И почему можно в го ?

тут же нет ничего асинхронного
Здесь все асинхронное, это пример из асинхронного сервера https://github.com/amphp/socket/blob/master/examples/simple-http-server.php

Artem
10.05.2018
14:18:14
ты просто смотришь пользовательский код, тебе нужно в примере с Го пойти в реализацию handleConnection

вообще yield это скорее всего просто способ показать, что он жив и готов принимать соединения. Твоя же задача в первую очередь избежать бесконечного цикла и обеспецичть graceful shutdown

Google
Artem
10.05.2018
14:20:30
но ты явно не в ту сторону вопрос формулируешь. в данном случае генератор -это просто конструкция используемая для блокировки потока исполнения, скорее всего

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

Pavel
10.05.2018
14:22:15
Вопрос сформулирован вполне чотко и конкретно - можно ли с помощью генераторов так организовать event loop чтобы пользовательский код был без yield и мог работать асинхронно

Потому что если изобретут файберы (а сейчас активно ведется работа по их внедрению), то так точно можно будет сделать.

Artem
10.05.2018
14:24:57
Вопрос сформулирован вполне чотко и конкретно - можно ли с помощью генераторов так организовать event loop чтобы пользовательский код был без yield и мог работать асинхронно
нифига не пойму, а зачем? в случае пхп вроде yield это единственный способ из генератора вернуть состояние, как ты без него что то сделашь... Ну и генератор то работает последовательно. Если ты хочешь чтобы генератор использнялся асинхронно, то это уже будет не генератор, там же вся суть в последовательности.

Pavel
10.05.2018
14:26:32
> как ты без него что то сделашь... Вот подробный ответ на это меня и интересует.

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

Artem
10.05.2018
14:27:42
> если бы генератор умел сохранять своей состояние в стеке как-то это был бы уже итератор )

Pavel
10.05.2018
14:27:57
Ну итераторы в пхп есть и тем не менее

Artem
10.05.2018
14:28:28
суть генератора же в том, чтобы последовательно проходить по объекту храня только текущее состояние в памяти

Pavel
10.05.2018
14:28:43
Файберы это то что даже в низкоуровневых языках делается через ассемблер, но не через средства самого языка. То есть сделать такое доступными конструкциями языка нереально.

Artem
10.05.2018
14:29:56
ну если речь именно о том, как они на самом деле запускают процессы и потоки, то это сильно зависит от реализации, кто то потоки ОС использует, кто то свои в VM городит и не важно какими средствами. Генератор же это просто абстракция.

Вопрос же не в том, как генератор будет выполнять код асинхронно, а как ты потом синхронзируешь изменения

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

Artem
10.05.2018
14:31:39
Pavel
10.05.2018
14:32:19
В программировании зелёные потоки (англ. green threads) — это потоки выполнения, управление которыми вместо операционной системы выполняет виртуальная машина (ВМ). Green threads эмулируют многопоточную среду, не полагаясь на возможности ОС по реализации легковесных потоков. Управление ими происходит в пользовательском пространстве, а не пространстве ядра, что позволяет им работать в условиях отсутствия поддержки встроенных потоков.

Тем не менее, по определению это то что никак не лезет ни в процессы ни в потоки, а справляется собственными силами.

Artem
10.05.2018
14:33:50
дело в том что если речь о горутинах, а не корутинах, т.е. именно реализации в Go, то там именно native threads используются

тут есть хорошее объяснение https://blog.nindalf.com/posts/how-goroutines-work/

Google
Pavel
10.05.2018
14:34:40
Это уже компилятор умеет их растаскивать по тредам, но все еще в одном треде горутины работают прекрасно асинхронно, переключая свой контекст

Gleb
10.05.2018
14:34:43
Жесть. Смотрю запрос в бд выполняется запрос 1.5 минуты))))

Pavel
10.05.2018
14:35:16
И почему то там не надо писать conn, err := await ln.Accept()

Artem
10.05.2018
14:36:12
И почему то там не надо писать conn, err := await ln.Accept()
там просто другой синтаксис, ты создаешь к примеру WaitGroup, добавляешь туда значение равное колличеству созданных горутин, а в них уже по выполнению просто вызываешь Done() суть та же

Artem
10.05.2018
14:38:01
Я склоняюсь к мысли что там не просто синтаксис, а наличие стека
waitgoup возможно именно стек, но это отдельный стек для счетчика, он просто вешает код, которые завершился, но не выходит. А когда дожидается исполенения зависимого и обнуления счетчика синхает результат и завершает

Pavel
10.05.2018
14:38:19
ну возьми js вместо go

Artem
10.05.2018
14:38:26
но это только один механизм, там есть мьютексы и простые каналы могут вешать поток, но опять таки это именно вопросы синхронизации

Pavel
10.05.2018
14:38:59
async function add1(x) { const a = await resolveAfter2Seconds(20); const b = await resolveAfter2Seconds(30); return x + a + b; } Вот пример из js

Artem
10.05.2018
14:39:21
js это вообще ад, там тупо колбеки же. Они просто не завершают процесс и ждут пока обсервер получит нотификицию

и не важно await или колбек в ф-ии, суть та же -весь процесс висит и ждет

Pavel
10.05.2018
14:39:48
Зачем ты столько текста пишешь но ответа так и не дал )

Artem
10.05.2018
14:40:42
я не понимаю вопроса совершенно. Ты говоришь о генераторах, которые есть абстракция и синтаксическая конструкция, а асинхронность -это уже уровень компилятора или интерпретатора

Pavel
10.05.2018
14:41:13
Ну вот на генераторах вполне себе делают асинхронный код

Есть вот amphp

Конечно писать через yield вызовы гораздо лучше чем колбеки городить. Но без них была бы вообще красота.

Artem
10.05.2018
14:42:54
я не понимаю асинхронности в одном потоке исполнения.

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

Pavel
10.05.2018
14:44:20
я не понимаю асинхронности в одном потоке исполнения.
GOMAXPROCS=1 ./path/to/program вот так запусти и поймешь

nodejs все в одном треде обрабатывает. Как и пшп

Google
Artem
10.05.2018
14:45:25
ну так даже если ты запускаешь на одном процессоре это не значит что оно работает в одном процессе. Он же разделяет память

все эти yield в генераторе это просто возращаемые значение, т.е. ты запуская одновременно несколько раз next() по сути просто несколько раз вызываешь функцию в разных состояниях. Зачем тут вообще генератор? ну напиши 10 функций на каждый yeild и результат тот же

Artem
10.05.2018
14:50:04
Как это не значит? Он будет плодить процессы?
ну да, при чем по желанию в зависимости от своей потребности. я никогда туда не лез и не уверен можно ли это контролировать. опция GOMAXPROCS -это именно колличество потоков операционной системе, но в рамках одного он сколько хочешь процессов может запустить, но я не уверен, можен он просто копию создает я не знаю зачем мне это знаять ) ну и да GOMAXPROCS равен 1 по умолчанию

Pavel
10.05.2018
14:52:07
По-моему ты втираешь какую-то дичь.? По твоему тексту выходит что в рамках одного потока он может создать несколько процессов.

Artem
10.05.2018
14:55:57
ну у него не совсем рандомное, но недетерминированно поведение. Я понятия если честно не имею создает ли он процесс внутри ОС, то, что потоки нативные это факт и то, но вообще там лежит в основе CSP но опять таки это модель взаимодействия скорее

Pavel
10.05.2018
14:56:54
Ну конечно же он создает процесс. Один процесс когда запускаешь бинарник.

Admin
ERROR: S client not available

Pavel
10.05.2018
14:57:12
А внутри процесса создается GOMAXPROCS тредов

тред==поток==thread==нить

?

Artem
10.05.2018
14:59:55
ну вот внутри этого 1 треда он и создает свои процессы по каждой горутине, только это конечно не процессы ОС уже, это горутины, т.е. то что есть реализация CSP(Communicating Sequential Processes) process но вообще да по сути эти горутины это просто "зеленые потоки". Хоть и с оговорками

Alexander
10.05.2018
15:04:28
чат по php.....

?
10.05.2018
15:05:39
Всем привет, подскажите пожалуйста как в одной ячейке массива передать сразу несколько переменных? $data = array ( 'userdata' => $row1.';'.$row2;'.$sesid, )

Alexander
10.05.2018
15:07:08
$data = [ 'userdata' => [$row1, $row2, $sesid], ];

?
10.05.2018
15:07:41
Спасибо, а не подскажешь как потом их получить?

Alexander
10.05.2018
15:08:01
$data['userdata'][0] $data['userdata'][1] $data['userdata'][3]

но как по мне лучше именованые ключи

$data = [ 'userdata' => [ 'row1' => $row1, 'row2' => $row2, 'sessid' => $sessid ] ] и получать $data['userdata']['row1'] $data['userdata']['row2'] $data['userdata']['sessid']

?
10.05.2018
15:10:38
Огромная благодарность за помощь

Google
dypa
10.05.2018
15:24:49
Docker не панацея.. есть баги который в докере не проявлются ? А проявляются уже на боевом.. Но для разворачивания окружения - разработки - тестирование самое оно..
ну при разработке под докером может вылезет: * проблемы с правами * проблемы производительности субд (потому что просто поставил докер) * проблемы с лежащим dockerhub и список можно продолжать...

dypa
10.05.2018
16:49:52
Можете пояснить какие проблемы производительности субд?
ну например деградация insert запросов в 10-100 раз

а что выбираете вы? docker, vagrant, lamp, denwer? :)
ну а все варианты то уж можно было перечислить: удаленный хост, lxc, rkt, vmware, kvm... многое зависит от проекта, заказчика, инфраструктуры и тд

Adel
10.05.2018
17:10:41
Все. последняя полезная статья на хабр с конфы :) https://habr.com/company/devconf/blog/358286/ довольно кратко и по делу Юра, который реально знает что такое хайлоад(работал в badoo), сделал обзор по трем перспективным базам для хайлоада.

Дмитрий
11.05.2018
05:28:29
кто нибудь использует clickhouse + php у себя? клиентов не так уж и много на php под это дело, а если есть, то нашёл только работающие через http api.

Дмитрий
11.05.2018
05:33:46
Только с yii2 делал связку
использовал уже готовый клиент или слал всё газлом/курлом?

Серёга
11.05.2018
05:34:31
И чей-то дописывал и хттп слал и готовый использовал

Дмитрий
11.05.2018
05:35:11
https://github.com/8bitov/clickhouse-php-client помочь чтоли человеку) раз уже всё равно писать)

или ты другой юзал?

Серёга
11.05.2018
05:36:53
На тот момент мне этот больше понравился https://github.com/smi2/phpClickHouse

Alexey
11.05.2018
06:16:16
Можете по XSLT канал посоветовать?

И книжку от начинающего и до гуру чтобы прокачаться :)

Plomipu
11.05.2018
06:54:24
Артём и остальные. Всё тщетно. 1. в php.ini прописал: mbstring.internal_encoding = UTF-8 2. в httpd.conf прописал: AddDefaultCharset utf-8 3. в php файле, где я применяю скрипт чтение имён директорий и получение списка ссылок на них в json формате даже если названия некоторых директорий русские прописал: header('content-type: application/json; charset=utf-8'); 4. файл php сохранён в utf-8 без BOM. 5. Даже в самой строчке кода конвертятся символы в utf-8: $img_dirs[$i] = utf8_encode(dirname(str_replace(getcwd(),dirname($_SERVER['PHP_SELF']),$found_file))); Мне выводится такая json строка:

две последние ссылки имеют закодированные в utf-8 коды символов, но когда они интерпретируются из такого формата, то получаются кракозябры. Что опять надо настроить/достроить на серваке httpd ? Что ему не нравится ?? Уже фантазии не хватает, как мне utf-8 вытянуть.

Alexander
11.05.2018
07:08:10
а json_encode($array, JSON_UNESCAPED_UNICODE); Пробовали?

Artem
11.05.2018
07:13:25
две последние ссылки имеют закодированные в utf-8 коды символов, но когда они интерпретируются из такого формата, то получаются кракозябры. Что опять надо настроить/достроить на серваке httpd ? Что ему не нравится ?? Уже фантазии не хватает, как мне utf-8 вытянуть.
я уже давно с такими проблемами не встречался, но это похоже на эскейпинг внутри json_encode. Он преобразуется символы, к примеру \u00d1 -это U+00D1, т.е. большая латинская N, это не кирилический символ. Атрибуты вроде accept-charset="UTF-8" это только указание браузеру и они не принуждают ни к чему, а рекомендуют, потому могут просто игнорироваться. В любом случае если ожидается кирилица ее нужно конвертировать в utf8 до сериализации в json

Страница 584 из 956