2016-07-18 3 views
1

Это более общий вопрос, поскольку я не могу быть конкретным с фрагментами кода, поэтому, если возможно, ответьте в общем виде.Синхронизированный метод в PHP Thread, вызванный двумя разными пользователями

Если я создаю расширенный класс Thread, и я определяю синхронизированный метод, когда 2 посетителя создают новый экземпляр этого класса и вызывает синхронизированный метод, он будет работать или будет работать, только если он вызывается 2 раза тот же пользователь?

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

Я знаю, вопрос не слишком специфичен, но я не нашел никаких документов четко объяснить это ..

Примечания: Я прихожу с Java, поэтому некоторые термины могут быть неправильны для PHP.

EDIT: «Разрабатывайте то, что вы имеете в виду, когда говорите», открывается поток, так что последовательность команд выполняется параллельно с обычным сценарием »и« Я не хочу, чтобы эта последовательность команд запускалась больше посетителей в то же время." ».

  • 2 Различные посетители получают доступ к script.php в то же время.
  • script.php имеет где-то внутри:
    • $commands = new <class that extends Thread>();
    • $commands-><synchronised method>();
  • посетителей 2 ждет, пока Посетителя 1 по $commands-><synchronised method>(); завершается, и только затем запускает его $commands-><synchronised method>();.

Это цель.

+0

Можете ли вы уточнить, что вы имеете в виду, когда говорите «открывает поток, чтобы последовательность команд выполнялась параллельно с обычным сценарием» и «Я не хочу, чтобы эта последовательность команд выполнялась больше посетителей в в то же время." Просьба также привести пример, который иллюстрирует, что вы имеете в виду. –

+0

@ DanielA.Thompson Edited. –

ответ

0

PHP Threaded::synchronized реализует функциональность, похожую на Java synchronized и описан here.

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

$commands = new <class that extends Thread>(); 
$commands-><synchronised method>(); 

Новый объект создается за сценарий вызова.

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