hi,你好!欢迎访问本站!登录
本站由简数采集腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - PHP问题 - 正文 请牢记本站网址www.sosophp.cn

php文件锁死锁怎么办【php题目】

2019-11-26PHP问题搜搜PHP网47°c
A+ A-

什么是死锁

学过操作体系的通同砚,都相识多线程的观点。在多线程中接见公共资本,需要对资本加锁。接见完毕后,开释锁。假如没有开释锁,那末下一个线程来猎取资本的时刻就会永久都没法猎取资本的锁,因而这个线程死锁了。那末CGI是多线程的公共资本接见致使的死锁吗? 答案是NO。

1. CGI 是单线程历程,经由过程ps 就能够看到。(历程状况 Sl的才是多线程历程)。

2. 即使是多线程的,死锁发生在PHP的shutdown过程当中挪用glibc 中time 函数的位置,不是php模块形成的。而glibc 中的time相干函数是线程平安的,不会发生死锁。

什么致使的死锁呢?

经由过程剖析linux中死锁发生的机制,发明除了多线程会发生死锁外,信号处置惩罚函数同样会发生死锁。那末cgi是因为信号处置惩罚致使的死锁吗?在这之前引见一个感念。

函数的可重入性与信号平安

函数可重入是指,不管第几次进入该函数,函数都能一般实行并返回效果。那末线程平安函数是可重入的吗?答案是NO。 线程平安函数,在第一次接见公共资本时,会猎取全局锁。假如函数没有实行完成,锁还没开释,此时历程被中断。那末在中断处置惩罚函数中,再次接见该函数,就会发生死锁。

那末什么样的函数才能够在中断处置惩罚函数中接见呢?

除了没有运用全局锁的函数,另有一些signal safe的体系挪用能够运用。挪用任何其他的非signal safe的函数都邑发生不可预知的效果(比方 死锁)。详见 man signal。在剖析死锁的缘由前,我们先看看cgi实行的流程,剖析个中有无发生死锁的能够。

PHP-CGI的实行流程

Glibc中的时候函数运用到了全局锁,保证函数的线程平安,但没有保证信号平安(signal safe)。经由之前的剖析,我们开端疑心死锁是因为PHP-CGI历程吸收到了一个信号,然后在signal handle中实行了非signal safe的函数。主流程在中断前,正在实行glibc中的时候函数。在函数猎取的锁没开释前,进入中断流程。而中断过程当中又接见了glibc中的时候函数。因而致使了死锁。

PHP-CGI的实行流程,如下图所示:

解决办法:

去掉或简化qalarm注册到shutdown中的钩子函数。防止不平安的函数挪用。

以上内容仅供参考!

引荐教程:PHP视频教程

以上就是php文件锁死锁怎么办的细致内容,更多请关注ki4网别的相干文章!

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  选择分享方式
  移步手机端
php文件锁死锁怎么办【php题目】

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章