Я знаком с Java и на данный момент я преподаю PHP. Чтобы предотвратить условия гонки и взаимоблокировки, Java использует ключевое слово «synchronized».
Из документов Oracle:
public synchronized void increment() { c++; }
Я использую подготовленные инструкции в отдельном классе для доступа к моей базе данных. Я хочу избегать условий гонки, тупиков и т. Д., Но я не вижу, как PHP справляется с этим.
Имеет ли PHP эквивалент Java, и является ли он конкретной операционной системой? Я использую Windows. Каковы будут лучшие практики?
Нет, лучше всего использовать « блокировку », в данном случае блокировку файла.
См. http://us3.php.net/flock для получения дополнительной информации о блокировке файлов.
PHP не выполняет потоки. Не беспокойтесь об этом *.
Я уверен, что есть причины, по которым вы можете беспокоиться о взаимоблокировках и состояниях расы, но только в том случае, если вы обрабатываете большое приложение на многих интерфейсах, обменивающихся с одним и тем же внутренним концом.
Но, как, да, не беспокойтесь об этом.
В однопоточном приложении это не проблема. Однако для ситуации с базой данных я бы пошел с транзакциями. Транзакции будут в основном делать то, что вы ожидаете от синхронизированного – выполнить несколько операций в одной атомной операции, либо все успешно, либо все failed.l
PHP-файл не запускается параллельно, поэтому в одном экземпляре, не использующем функцию pcntl-fork, состояние гонки не может произойти. Когда вы смотрите на сторону MySQL, она полностью параллельна.
Я думаю, что sem_acquire – лучший способ сделать это. «блоки (если необходимо) до тех пор, пока семафор не будет получен. Процесс, пытающийся приобрести семафор, который он уже приобрел, будет блокироваться навсегда, если приобретение семафора приведет к превышению максимального количества семафора». http: // us3. php.net/manual/en/function.sem-acquire.php
Если вы пишете многопоточное приложение, вы можете использовать расширение pthreads
а ваши объекты, предназначенные для многопоточного использования, должны расширить класс Threaded
который имеет synchronized
метод.
Расширение pthreads
не зависит от операционной системы, но требует создания PHP- ZTS
(Zend Thread Safety).
да, с расширениями управления процессом http://php.net/manual/ru/threaded.synchronized.php