PHP并无完善的线程支持,甚至部署到基于线程模型的httpd服务器都会产生一些问题,但即便是多进程模型下的PHP,也不免出现多进程共同访问同一资源的状况。数据库
好比整个程序共享的数据缓存,或者由于资源受限而必须对特定处理过程进行排队,以及针对每一个用户生成惟一的某种标识的情形。编程
PHP语言自身没有提供进程互斥和锁定机制,于是使得在这些状况下的编程遇到了困难,目前了解到的可选的办法有如下这些:缓存
1 利用MySQL的锁定机制来实现互斥。缺点是增大了数据库服务器的链接负担,而且使得程序依赖于数据库服务才能正常工做。
2 利用文件锁机制。 也就是利用flock函数经过文件实现锁定和互斥机制,来模拟通用编程模型下的锁定原语的工做方式。这种方式在之前以纯文本文件为存储引擎的时代成为保护 数据完整性的必备元素,如今在使用文本文件做为缓存媒介的场合也至关常见。PmWiki应该也是使用了这个机制来对多人同时编辑一个页面的情形进行提醒。 不过文件锁机制多少会调用到宿主操做系统上的文件锁特性,所以在使用时必定要检查服务器操做系统是否为PHP环境提供了完善可靠的文件锁机制。
3 利用共享内存空间计数。 PHP能够利用shmop_open函数开辟一块内存空间,在服务进程之间共享数据,为了保证共享数据的互斥安全访问,可使用sem_get、 sem_acquire和sem_release这组函数实现共享计数锁定机制。这种办法在后台实际是调用了系统的ipc 服务来实现。安全