相关疑难解决方法(0)

PHP互斥(互斥)

阅读一些关于在PHP中锁定的文章.
它们主要指向http://php.net/manual/en/function.flock.php.

这个页面讨论了在硬盘上打开文件!!

真的是这样吗?我的意思是,这使得锁定非常昂贵 - 这意味着每次我想要锁定我都必须访问硬盘)=

可以用一个令人愉快的消息来安慰我吗?

编辑:

由于我有一些回复,我想问这个;
我的脚本只能运行一个或几个线程?因为如果它是一个然后我显然不需要互斥量.有简明的答案吗?

究竟我想要做什么

由ircmaxell提问.
这是故事:

我有两个ftp服务器.我希望能够在我的网站上显示有多少在线用户在线.
所以,我认为这些ftp服务器会将他们的统计信息"POST"到某个PHP脚本页面.我们假设此页面的URL是" http://mydomain.com/update.php ".

在网站的主页(" http://mydomain.com/index.php ")上,我将显示累积统计信息(在线用户).

而已.

我的问题是,我不确定当一个ftp服务器更新他的统计数据而另一个ftp服务器也是如此时,信息会变得混杂.
就像多线程时一样; 两个线程同时增加一些"int"变量.除非您在它们之间进行同步,否则它不会按预期发生.
那么,我有问题吗?是的,不,也许吧?

可能解决方案

一整天都在努力思考,我在这里有一个想法,我想让你发表意见.
正如所说的这些ftp服务器将发布他们的统计数据,每60秒一次.
我正在考虑将此文件设为"stats.php".
它将包含在ftp服务器转到的更新脚本("update.php")和"index.php"页面中,访问者可以看到有多少用户在线.
现在,当ftp服务器更新时,"update.php"中的脚本将使用新的累积统计信息修改"stats.php".
首先,它将读取"stats.php"中包含的统计信息,然后累积,然后重写该文件.

如果我没弄错,PHP将检测到文件("stats.php")已更改并加载新文件.正确?

php mutex mutual-exclusion

22
推荐指数
1
解决办法
2万
查看次数

防止PHP中竞争条件的最可靠和安全的方法

我需要在PHP中使用互斥锁或信号量,这让我很害怕.为了澄清,我并不害怕编写无死锁的代码,这些代码可以正常同步或者担心并发编程的危险,但是PHP处理边缘情况的程度如何.

快速背景:编写位于用户和第三方信用卡网关之间的信用卡处理程序界面.需要防止重复请求,并且已经有一个适用的系统,但是如果用户点击提交(w/out JS启用,所以我无法为他们禁用按钮)相隔毫秒,一个竞争条件接着我的PHP脚本没有意识到已经发出了重复的请求.需要一个信号量/互斥量,这样我才能确保每个唯一的事务只有一个成功的请求.

我通过PHP-FPM在多核Linux机器上运行多个进程,在nginx后面运行PHP.我想确定一下

  1. 所有php-fpm进程和所有内核(i686内核)之间共享信号量.
  2. php-fpm在持有互斥锁/信号量时处理PHP进程崩溃并相应地释放它.
  3. php-fpm在持有互斥锁/信号量时处理会话中止并相应地释放它.

是的我知道.非常基本的问题,认为任何其他软件都不存在适当的解决方案是愚蠢的.但这是PHP,它肯定不会考虑并发性,它经常崩溃(取决于你加载了哪些扩展),并且处于易变的环境中(PHP-FPM和Web).

关于(1),我假设如果PHP使用POSIX函数,这些条件在SMP i686机器上都适用.至于(2),我从简要略读文档看到有一个参数决定了这种行为(虽然为什么人们希望PHP不释放互斥锁是会话被杀死我不明白).但是(3)是我的主要关注点,我不知道是否可以安全地假设php-fpm正确地为我处理所有边缘情况.我(显然)不想要死锁,但我不确定我是否可以信任PHP,永远不会让我的代码处于无法获取互斥锁的状态,因为抓住它的会话要么优雅地还是不合理地终止.

我考虑使用MySQL LOCK TABLES方法,但更令人怀疑是因为虽然我相信MySQL锁定比PHP锁定更多,但我担心如果PHP在持有MySQL会话锁定时中止请求(带*out*崩溃),MySQL可能会保持表格锁定(特别是因为我可以很容易地设想会导致这种情况发生的代码).

老实说,我最熟悉一个非常基本的C扩展,在那里我可以确切地看到POSIX正在调用什么以及使用什么params来确保我想要的确切行为..但我不期待编写该代码.

任何人都有关于他们想要分享的PHP的并发相关最佳实践吗?

php concurrency

22
推荐指数
1
解决办法
1万
查看次数

标签 统计

php ×2

concurrency ×1

mutex ×1

mutual-exclusion ×1