PHP асинхронность, многопоточность, параллельность

123
lealhost
На сайте с 07.06.2014
Offline
133
#11
ArbNet #:

Модуль считается неподдерживаемым и мёртвым.

ЗЫ. Не очень хочется использовать, то что может перестать работать.

Ну там вроде модуль parallel на замену пришел, но я его не тестировал. К тому времени уже активно подсев на Golang.

А с помощью pthreads в свое время сократил выполнение с баш скриптов (30-40с) до 3 секунд на PHP в потоках, а потом до 500 мс переписав код на Golang. Можно еще в сторону rust посмотреть, но топик ведь не о том :)

Aisamiery
На сайте с 12.04.2015
Offline
259
#12

Таких инструментов же уже вагон и маленькая тележка:

- swoole
- reactphp
- workerman
- amphp
- roadrunner (app server)

Это то что я знаю, тестил и живее всех живых. Но писать асинхронный код в php идея не очень благодарная, большинство драйверов блокирующие, надо писать а потом поддерживать обертки неблокирующие, большая часть библиотек написана в той парадигме что после запроса все чистится и в 98% случаев сторонних либ потечет память..... в целом это узкий инструмент достаточно, например чтоб реализовать свой сокет сервер и то если прям очень нужно, а то лучше на голанг все таки глянуть или на крайний случай на ноду

ReactPHP: Event-driven, non-blocking I/O with PHP - ReactPHP
ReactPHP: Event-driven, non-blocking I/O with PHP - ReactPHP
  • reactphp.org
Event-driven, non-blocking I/O with PHP.
Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
Sly32
На сайте с 29.03.2012
Offline
276
#13
lealhost #:
А с помощью pthreads в свое время сократил выполнение с баш скриптов (30-40с) до 3 секунд на PHP в потоках, а потом до 500

В питоне использование потоков довольно специфично из-за наличия GIL, а вот использованеи процессов дает толк. Конечно если это многоядерный проц. Например добавление 10000 записей в базу в 4 потока сокращает время с 77 сек до 17 примерно.

Aisamiery
На сайте с 12.04.2015
Offline
259
#14
Sly32 #:
В питоне использование потоков довольно специфично из-за наличия GIL, а вот использованеи процессов дает толк. Конечно если это многоядерный проц. Например добавление 10000 записей в базу в 4 потока сокращает время с 77 сек до 17 примерно.

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

Но вот на го у меня есть сервер tcp который принимает подключения от IoT и там мне нужна многопоточность так как эти соединения постоянные с передачей данных в обе стороны =)) в общем все зависит от специфики, но сделать большой энтерпрайз (монолит) на пхп проще чем на го =))

X
На сайте с 21.11.2008
Offline
107
#15
может Golang c 600.000  с  корутин  ???   --  не неслышал
Строю -=К.О.С.М.О.Л.Ё.Т=- https://searchengines.guru/ru/forum/1065492
Dreammaker
На сайте с 20.04.2006
Offline
569
#16
Aisamiery #:

Таких инструментов же уже вагон и маленькая тележка:

- swoole
- reactphp
- workerman
- amphp
- roadrunner (app server)

Это то что я знаю, тестил и живее всех живых. Но писать асинхронный код в php идея не очень благодарная, большинство драйверов блокирующие, надо писать а потом поддерживать обертки неблокирующие, большая часть библиотек написана в той парадигме что после запроса все чистится и в 98% случаев сторонних либ потечет память..... в целом это узкий инструмент достаточно, например чтоб реализовать свой сокет сервер и то если прям очень нужно, а то лучше на голанг все таки глянуть или на крайний случай на ноду

Для вебсокет-сервера использовали в своё время (лет 5 назад) https://github.com/ratchetphp/Ratchet , кажется, поверх reactPHP написан. Пришлось, правда, копнуться поглубже, так как в лоб текла память, но когда понял логику, то исправил ошибку у нас в коде (деталей уже не помню, кажется, реальность и документация отличались) и проект заработал.  Через некоторое время проект задвинулся на задний план и я о нём призабыл. Через какое-то длительное время (может через несколько месяцев, если не через полгода) решил зайти глянуть, что там - все ок, утечек не было, сам вебсокет-сервер работал. Из одного источника, если мне память не изменяет данные получались.  С другого - нет, но там чисто программно нужно было что-то типа сессии перезапускать раз в несколько дней, то есть, это не  проблема ни php, ни его ассинхронности, а чисто организационный вопрос. 

То есть, асинхронность в пхп уже давно есть, но да, согласен, нужно писать с оглядкой на окружение на сервере.

GitHub - ratchetphp/Ratchet: Asynchronous WebSocket server
GitHub - ratchetphp/Ratchet: Asynchronous WebSocket server
  • ratchetphp
  • github.com
A PHP library for asynchronously serving WebSockets. Build up your application through simple interfaces and re-use your application without changing any of its code just by combining different components. Requirements Shell access is required and root access is recommended. To avoid...
Aisamiery
На сайте с 12.04.2015
Offline
259
#17
Dreammaker #:
Для вебсокет-сервера использовали в своё время (лет 5 назад) https://github.com/ratchetphp/Ratchet , кажется, поверх reactPHP написан.

Для вебсокетов я использую центрифугу не используя какие то велосипеды =))

Dreammaker #:
То есть, асинхронность в пхп уже давно есть, но да, согласен, нужно писать с оглядкой на окружение на сервере.

Сообщество пока не готово =)) Другая парадигма, мало готовых библиотек, а те что есть могут вполне себе не поддерживаться и иметь кучу багов (open source во всей красе). В целом как оказалось, асинхронность в пхп нужна только тогда, когда у вас уже есть php разрабы и узкая задача под это, в остальных случаях, вот мое мнение и мнение наверное большинства, запилить на Go. Язык простой, кодить продакшен реди код можно буквально за выходные (если ты конечно Senor XXX). При том там "настоящая" многопоточность с горутинами. Я раньше так себе относился к Go, но теперь пилю на нем многие вещи и заказчикам и себе компонуя его с php, так как сейчас большая часть проектов это "api first" проекты. Хотя за проектами асинхронности в php пристально слежу, ведь я люблю php не зависимо от того что у меня большой достаточно стэк.

GitHub - centrifugal/centrifugo: Scalable real-time messaging server in a language-agnostic way. Set up once and forever.
GitHub - centrifugal/centrifugo: Scalable real-time messaging server in a language-agnostic way. Set up once and forever.
  • centrifugal
  • github.com
Centrifugo is an open-source scalable real-time messaging server. Centrifugo can instantly deliver messages to application online users connected over supported transports (WebSocket, HTTP-streaming, SSE/EventSource, GRPC, SockJS, WebTransport). Centrifugo has the concept of a channel – so it's a user-facing PUB/SUB server. Centrifugo is...
T7
На сайте с 19.09.2018
Online
63
#18
Dreammaker #:
То есть, асинхронность в пхп уже давно есть

А есть примеры


Т.е, скрипт отработал за 0.62932, тогда как время затраченное на доставку 2 документов с этой темы составило 1.22971

0.625237226486206
PHP асинхронность, многопоточность, параллельность - Веб-строительство - Сайтостроение - Форум об интернет-маркетинге
https://searchengines.guru/ru/forum/1074587/page1
0.6044747829437256
PHP асинхронность, многопоточность, параллельность - Веб-строительство - Сайтостроение - Форум об интернет-маркетинге - Страница 2
https://searchengines.guru/ru/forum/1074587/page2
Artmon
На сайте с 24.01.2017
Offline
52
#19

Посмотрите в сторону SSE:

Разрабатывать web-приложения, использующие Server-Sent Events намного проще, чем с использованием websockets. Нужно всего лишь немного кода на стороне сервера, чтобы переправлять события web-приложению, но клиентская часть кода для обработки этих событий работает почти точно так же, как и для любых других событий.

Песочница

Server-sent events - Интерфейсы веб API | MDN
Server-sent events - Интерфейсы веб API | MDN
  • 2022.10.21
  • developer.mozilla.org
По традиции, web-страница должна отправить запрос на сервер, чтобы получить новые данные; это то, как страница получает данные с сервера. Server-sent events дают возможность серверу...
Dreammaker
На сайте с 20.04.2006
Offline
569
#20
Aisamiery #:

Для вебсокетов я использую центрифугу не используя какие то велосипеды =))

Ну, мне тогда нужно было бы, чтобы программеру было меньше разбираться. То есть, PHP был первым вариантом выбора + нужно было с реактом (который JS, а не reactPHP) разобраться, потому что сторонняя библиотека, которую я решил использовать в проекте, был на нём написана. И чтобы я мог подключаться время от времени не тратя время на изучения нового. :)

timo-71 #:
Т.е, скрипт отработал за 0.62932, тогда как время затраченное на доставку 2 документов с этой темы составило 1.22971

Подскажите, что какую мысль вы хотите донести, суммируя время доставки двух страниц?

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий