изображение apache может быть открыто отображено, тогда как образу fpm нужен другой веб-сервер, который затем подключается к fpm
, чтобы представить его в перспективе - следующие docker-compose практически идентичны (для второго требуется vhost будет добавлен, но я думаю, что вы поняли):
php с apache:
services:
php:
image: php:7.3-apache-stretch
ports:
- 80
php с fpm (для работы требуется apache / nginx):
services:
php:
image: php:7.3-fpm-stretch
apache:
image: apache
ports:
- 80
links:
- php
Как вы можете видеть, версия fpm дает вам больше контроля - т.е. использовать другой веб-сервер
.Это могло быть крупно , список - считал Joe Duffy, превосходного" Параллельное Программирование В Windows " для намного большего количества детали. Это - в значительной степени "разгрузка мозга"...
С точки зрения отладки, у меня нет особого совета. Использование Потока. Сон для повышения возможностей наблюдения условий состязания и мертвых блокировок может работать, но у Вас должно быть вполне разумное понимание что случилось перед знанием, куда поместить его. Вход очень удобен, но не забывайте, что код входит в своего рода квантовое состояние - наблюдение, что это через вход почти обязано изменить свое поведение!
Я не уверен, как хорошо это поможет для конкретного приложения, Вы работаете с, но здесь являетесь двумя подходами, одолженными от функционального программирования для написания многопоточного кода:
Неизменные объекты
, Если необходимо совместно использовать состояние между потоками, состояние должно быть неизменным. Если один поток должен внести изменение в объект, он создает совершенно новую версию объекта с изменением вместо того, чтобы видоизменить состояние объекта.
Неизменность по сути не ограничивает вид кода, который можно написать, и при этом это не неэффективно. Существует много реализаций неизменных стеков, множества неизменных деревьев, которые формируют основание карт и наборов и других видов неизменных структур данных и многих (если не все), неизменные структуры данных так же эффективны как их изменяемые дубликаты.
, Так как объекты неизменны, не возможный для одного потока видоизменять общее состояние под Вашим носом. Это означает, что Вы не должны получать блокировки для написания многопоточного кода. Этот подход устраняет целый класс ошибок, связанных с заведением в тупик, livelocking, и raceconditions.
передача сообщений Erlang-стиля
Вы не должны выучить язык, но взглянуть на Erlang, чтобы видеть, как это приближается к параллелизму. Приложения Erlang могут масштабироваться в значительной степени неограниченно долго, потому что каждый процесс является абсолютно отдельным от всего другие (примечание: это не точно процессы, но не точно распараллеливает любого).
Процессы разжигают и просто вращают цикл, ожидающий сообщений: сообщения получены в форме кортежей, против которых процесс может затем скопировать соответствие видеть, значимо ли сообщение. Процессы могут отправить другие сообщения, но они равнодушны тому, кто бы ни получает сообщение.
Advantanges к этому стилю является устранением блокировок, когда сбои процесса он не снижает Ваше целое приложение. Вот хорошая сводка параллелизма Erlang-стиля: http://www.defmacro.org/ramblings/concurrency.html
Используйте FIFOs. Многие из них. Это - древний секрет аппаратного программиста, и это убралось подобру-поздорову несколько раз.
Это шаги к записи качества (легче читать и понять) многопоточный код: