那么大多数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 user level locks GET_LOCK(‘name’,’timeout’),或者使用像APC或XCache这样的东西来创建自己的(注意,这不会是一个真正的锁,因为可以创建竞争条件有人在您的检查和验收锁之间获得锁定).
编辑:回答编辑过的问题:
这一切都取决于您的服务器配置. PHP可以运行多线程(每个请求由不同的线程提供),或者可以运行多进程(每个请求由不同进程提供).这一切都取决于你的服务器配置…
PHP非常罕见,PHP将连续提供所有请求,只有一个进程(和一个线程)为所有请求提供服务.如果你使用CGI,那么默认情况下是多进程的.如果您使用FastCGI,它可能是多进程和多线程.如果您使用mod_php与Apache,那么这取决于工作类型:
> mpm_worker将是多进程和多线程,并且由ServerLimit变量指定的进程数.
> prefork将是多进程的
> 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;
}