Там по дороге, асинхронность можно использовать. Кстати, архитектура питоновских асинхронных фреймворков намекает.
Кусок миддлевари фастапи. (аиохттп похожий принцип: оперируем 3 объектами app, request, response)
self.request_parameters(request) # request.state.content вначале {} response = await call_next(request) # request.state.content: оброс по дороге {'title': '****', 'meta': '****', ...} self.response_set_headers(request, response) return response
В процессе обрастания данных для вывода пользователю, например, с запросами к бд, попытаться провернуть, похожее на то, что мы увидели в примерах с парсингом. Как только появляется новый (например, определен ИД документа, по которому можно достать его контент), его тут же в таски. Параллельно, обрабатывая данные в нужном нам виде. Короче, так, чтобы итоговое время работы было меньше суммы времени исполнения запросов, каждого по отдельности.
Совсем просто: (10 запросов по 2мс (20) выполнены за 10 мс) ? "асинк во всей красе" : "плохой асинк, хотя кругом авайты"
Мой пост был местами провокационный. Просто, хотелось разбавить абстрактные рассуждения о каких то либах примерами для понимания сути. И, может быть, дойти до каких то практических вариантов применения.
В вебстроительстве главная польза от асинк/авайт, это операции ввода-вывода, когда надо подождать (то, что на скрине 0.455 сек). Это же справедливо для запросов к базе данных. Примеры, что на пхп, что на питоне показывают - да, существенная выгода есть. Но, зачастую, выгода нивелируется практическим применением.
Для расширения кругозора, хотел пример кода с использованием какой то асинхронной библиотеки на пхп, когда скрипт, выполняя 2 задачи, отрабатывает за x сек, тогда как время затраченное на 2 документов составило 2х.
Вероятно, на базе этого: https://www.php.net/manual/ru/intro.parallel.php , что то типа аиохттп у питона. Чтобы в несколько строк, реализовать какой то асинхронный парсер например.
А есть примеры
Т.е, скрипт отработал за 0.62932, тогда как время затраченное на доставку 2 документов с этой темы составило 1.22971
0.625237226486206PHP асинхронность, многопоточность, параллельность - Веб-строительство - Сайтостроение - Форум об интернет-маркетингеhttps://searchengines.guru/ru/forum/1074587/page10.6044747829437256PHP асинхронность, многопоточность, параллельность - Веб-строительство - Сайтостроение - Форум об интернет-маркетинге - Страница 2https://searchengines.guru/ru/forum/1074587/page2
Не помню как пма, лет 10 не юзал. На локале пгадмин есть, тоже давно не юзал. Пма, вероятно, аналогично. Как то так в nginx
server{ listen 80; server_name pg.uwsgi; client_max_body_size 75M; error_log /var/www/uwsgi/pgadmin/pg-nginx-err.log; location / { include uwsgi_params; uwsgi_pass unix:///var/www/uwsgi/pgadmin/uwsgi.sock; }}
Так что формально, база на улицу не светит, только прокладка. Но, любой сайт такая же прокладка к базе.
Я тоже не вижу смысла в веб интерфейсах к бд, но понимаю проблемы тех кто работает с клиентами у которых сайты на шареде.
Какая то странная дискуссия. На шареде, не всегда есть возможность поймать что то, когда кто то запустил
#!/usr/bin/bashcd /home/pyapptar --exclude='*/node_modules' --exclude='*/__pycache__' -zcf /home/pyapp/files.tar.gz you__app__1scp -i ~/.ssh/1 /home/pyapp/files.tar.gz uuuu@xxx.xxx.xxx.xxx:/home
А когда, там, где лежит сайт, что то поменялось, то systemctl restart что то типа
[Unit]Description=YouTubeTrack ServiceAfter=docker.serviceRequires=docker.service[Service]TimeoutStartSec=2Restart=alwaysExecStartPre=docker stop $(docker ps -a -q)...
что бы в итоге
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 481b26c50b93 pg-postgis "docker-entrypoint.s…" 5 minutes ago Up 5 minutes 0.0.0.0:5432->5432/tcp, :::5432->5432/tcp db_pg....
Там просто нет инструментов для этого. Поэтому и используют, то чем можно
Очень правильный подход, поверить все самому.
Только добавьте добавьте в тесты:
<?php$test_contains = function ($s, $f){return str_contains($s, $f);};$test_strstr = function ($s, $f){return strstr($s, $f) ? 1 : 0;};$test_preg = function ($s, $f){return preg_match("&$f&", $s);};$test_strpos = function ($s, $f){return strpos($s, $f);};function __($cnt, $fu, $s, $f) { sleep(1); $start_time = microtime(1); for($i=0; $i<$cnt; ++$i) { $s = $s . $i; $r = $fu($s, $f); } echo 'Time: ', number_format(microtime(1) - $start_time, 5), '; Mem: ', memory_get_usage(1), '/', memory_get_peak_usage(1), ', Last RES: ', $r, "\n";}function test(int $cnt, callable $fu, string $test_name) { $data = file_get_contents('./12.txt'); echo "!!", $test_name, " / ", $cnt, " раз: "; __($cnt, $fu, $data, 'dfhggdfhdfhfdghert');}echo "Test search:\n", PHP_VERSION, "\n";echo ' Mem usage: ', memory_get_usage(1), '/', memory_get_peak_usage(1), "\n";$c = 100000;test($c, $test_contains, "test_contains"); test($c, $test_preg, "test_preg");test($c, $test_strstr, "test_strstr");test($c, $test_strpos, "test_strpos");
Результат:
Когда 1 раз, то strpos быстрее, а когда много, то не очень. Но, это не точно.