这更像是一个一般性的问题,因为我不能具体说明代码片段,所以如果可能的话,请以一般的方式回答。
如果我创建一个 Thread 扩展类,并定义一个同步方法,当 2 个访问者创建该类的新实例并调用同步方法时,它会起作用还是仅在同一用户调用 2 次时才有效?
我试图实现的是:每个访问者打开一个线程,以便与普通脚本并行运行一系列命令,但我不希望该命令序列由更多访问者同时运行。
我知道这个问题不是太具体,但我没有找到任何文档来清楚地解释这一点。
注意:我来自Java,所以有些术语对于PHP来说可能是错误的。
编辑:"详细说明你说"打开一个线程,以便命令序列与普通脚本并行运行"和"我不希望该命令序列在同一时间由更多访问者运行"时的意思。'.
- 2个不同的访客同时访问
script.php
。 -
script.php
里面有:-
$commands = new <class that extends Thread>();
-
$commands-><synchronised method>();
访客 -
- 2 等到访客 1 的
$commands-><synchronised method>();
终止,然后运行他的$commands-><synchronised method>();
。
这就是目标。
PHP的Threaded::synchronized
实现了类似于Java synchronized
的功能,并在此处进行了描述。
您将在 PHP 中遇到的问题是,您尝试让两个会话对同一对象执行相同的同步方法,而普通 PHP 不支持在会话之间共享内存中的对象。您会注意到,在示例脚本中,
$commands = new <class that extends Thread>();
$commands-><synchronised method>();
每个脚本调用都会创建一个新对象。
您可以通过使用外部资源来控制方法中的访问来实现类似的东西,例如锁定文件(可能是最快和最不优雅的方式)。根据软件堆栈中的其他内容,您可能能够将互斥锁存储在数据库或正在使用的其他存储中。