【问题标题】:Does PHP have the equivilant to Java 'synchronized' , or is this not required?PHP 是否具有与 Java 'synchronized' 等效的功能,或者这不是必需的?
【发布时间】:2025-11-26 12:35:02
【问题描述】:

我熟悉 Java,目前正在自学 PHP。为了防止竞争条件和死锁,Java 使用关键字“synchronized”。

来自 Oracle 文档:

public synchronized void increment() {
        c++;
}

我在一个单独的类中使用准备好的语句来访问我的数据库。我希望避免竞争条件、死锁等,但我看不到 PHP 是如何处理这些的。

PHP 是否具有与 Java 相同的功能,它是特定于操作系统的吗?我正在使用 Windows。最佳做法是什么?

【问题讨论】:

    标签: php


    【解决方案1】:

    PHP 不做线程。不用担心*。

    我很肯定,您可能会担心死锁和竞争条件,但前提是您要处理跨多个前端与同一后端通信的大型应用程序。

    但是,是的,别担心。

    【讨论】:

    • PHP 文档不同意您的观点。 php.net/manual/en/class.thread.php
    • @LukeA.Leber 您确实意识到答案已经超过 5 年,并且在 pthreads 被添加为 PECL 扩展之前回答了 2 年?版本 0.0.33 (alpha) 是 2012 年 9 月 25 日,扩展直到 2014 年 3 月才标记为稳定?
    • 不,不知道。
    【解决方案2】:

    在单线程应用程序中,这不是问题。然而,对于数据库情况,我会选择事务。事务基本上会按照您对同步操作的期望执行 - 在一个原子操作中执行多个操作,要么全部成功,要么全部失败。l

    【讨论】:

    • 感谢 Dmitri 的建议,我将调查交易!
    【解决方案3】:

    PHP 文件不是并行运行的,因此在一个不使用函数pcntl-fork 的实例中不会出现竞争条件。当你看 MySQL 的一面时,它是完全并行的。

    【讨论】:

    • MySQL 会不会有问题?还是我错过了重点?
    • MySQL 是完全异步的,所以没问题。 PHP 脚本从上到下运行,因此只需将其视为食物食谱或其他东西。 ;)
    【解决方案4】:

    我认为 sem_acquire 是最好的方法。 “阻塞(如有必要)直到可以获取信号量。如果获取信号量会导致超过其最大信号量,则尝试获取它已经获取的信号量的进程将永远阻塞。”http://us3.php.net/manual/en/function.sem-acquire.php

    【讨论】:

      【解决方案5】:

      如果您正在编写一个多线程应用程序,您可以使用pthreads 扩展,并且您的用于多线程使用的对象应该扩展具有synchronized 方法的Threaded 类。

      pthreads 扩展不是特定于操作系统的,但需要 PHP 的 ZTS(Zend 线程安全)构建。

      【讨论】:

        【解决方案6】:

        是的,使用过程控制扩展 http://php.net/manual/ru/threaded.synchronized.php

        【讨论】:

          【解决方案7】:

          不,最好的办法是使用“lock”,在这种情况下是文件锁。

          有关文件锁定的更多信息,请参阅http://us3.php.net/flock

          【讨论】:

            最近更新 更多