小编典典
好吧,大多数PHP在不同的进程空间中运行(几乎没有线程实现)。容易的是羊群。保证可以在所有平台上使用。
但是,如果在支持方面进行编译,则可以使用其他一些功能,例如信号量扩展。(使用–enable-
sysvsem编译PHP)。然后,您可以执行类似的操作(请注意,sem_acquire()应该阻止。但是如果由于某些原因而无法执行操作,它将返回false):
$sem = sem_get(1234, 1);
if (sem_acquire($sem)) {
//successful lock, go ahead
sem_release($sem);
} else {
//Something went wrong...
}
您拥有的其他选项是MySQL 用户级别锁 GET_LOCK('name',
'timeout'),或者使用APC或XCache之类的东西创建自己的锁(注意,这不是真正的锁,因为可以在其他人在两次检查之间获得锁的情况下创建竞争条件并接受锁)。
编辑:要回答您编辑过的问题:
这完全取决于您的服务器配置。PHP可以运行多线程(每个请求由不同的线程处理),也可以运行多进程(每个请求由不同的进程处理)。这完全取决于您的服务器配置…
PHP只能连续处理所有请求,而只有一个进程(和一个线程)处理所有请求,这是非常罕见的。如果您使用的是CGI,则默认情况下它是多进程的。如果您使用的是FastCGI,则可能是多进程和多线程。如果您在Apache上使用mod_php,则取决于工作程序类型:
mpm_worker将是多进程和多线程的,进程数由ServerLimit变量决定。
预叉将是多过程的
perchild也将是多进程的
编辑:要回答您的第二个编辑问题:
这很容易。将其存储在文件中:
function readStatus() {
$f = fopen('/path/to/myfile', 'r');
if (!$f) return false;
if (flock($f, LOCK_SH)) {
$ret = fread($f, 8192);
flock($f, LOCK_UN);
fclose($f);
return $ret;
}
fclose($f);
return false;
}
function updateStatus($new) {
$f = fopen('/path/to/myfile', 'w');
if (!$f) return false;
if (flock($f, LOCK_EX)) {
ftruncate($f, 0);
fwrite($f, $new);
flock($f, LOCK_UN);
fclose($f);
return true;
}
fclose($f);
return false;
}
function incrementStatus() {
$f = fopen('/path/to/myfile', 'rw');
if (!$f) return false;
if (flock($f, LOCK_EX)) {
$current = fread($f, 8192);
$current++;
ftruncate($f, 0);
fwrite($f, $current);
flock($f, LOCK_UN);
fclose($f);
return true;
}
fclose($f);
return false;
}
2020-05-29