我们已经准备好了,你呢?

2024我们与您携手共赢,为您的企业形象保驾护航!

这篇【PHP死锁问题解析】由【或许我是传奇】上传分享,文档共【5】页,文档可免费在线阅读,如需了解更多关于【PHP死锁问题解析】的资讯,可使用淘豆网站内搜索功能选择合适的文档。 以下文字为文章中部分正文,如需获取完整电子版,请将此文档下载至您的设备,以方便您编辑、打印。 PHP死锁问题解析 简介:什么是PHP死锁?如何查看PHP死锁问题?以下是我提供的PHP死锁问题解析,大家可以参考一下,更多详情请关注应届毕业生(考试)网站。 发现问题 最近发现线上多台机器出现磁盘空间报警,日志文件已经清理,但是磁盘空间并没有释放。 通过psaux|-cgi发现很多进程的启动时间都是几天到几周甚至几个月前,我们线上的php-cgi执行次数有上限,一般1天内就会重启一次,初步断定是这些cgi进程有问题。通过lsof -p [pid]发现在启动很久的cgi进程中打开了一些日志文件句柄并且没有关闭,这些日志文件在文件系统中已经被删除,但是句柄并没有关闭,导致磁盘空间没有释放。至此基本确认特殊磁盘空间的问题,是由于cgi没有关闭文件句柄导致的。进一步分析进程,-p [pid]发现所有特殊进程都是block状态。

也就是说cgi进程死锁了。进程死锁导致打开的文件句柄无法关闭,所以磁盘空间死锁了。为什么cgi进程会死锁?什么是死锁?学过(操作系统)的同学都知道多线程的概念,在多线程中,访问普通资源是需要对资源加锁的,访问完成后再释放锁,如果不释放锁,那么下一个线程来获取资源的时候就永远无法获得资源锁了,所以线程死锁了。那么cgi是不是多线程访问普通资源导致的死锁呢?答案是NO,通过ps可以查到。(进程状态Sl是多线程进程)死锁发生在(PHP)过程中调用glibc中时间函数的位置,并不是php模块导致的,glibc中时间相关的函数是线程安全的,不会引起死锁。那么是什么原因导致死锁的呢? 通过分析Linux死锁的机制发现,除了多线程,信号处理函数也会引起死锁。那么cgi死锁是不是因为信号处理引起的呢?在此之前,我先介绍一个概念。函数可重入性与信号安全函数可重入性是指无论进入函数多少次,函数都能正常执行并返回结果。那么线程安全的函数是否可重入呢?答案是否定的。线程安全的函数在第一次访问公共资源时,会获取全局锁,如果函数没有执行完,没有释放锁,进程就会被中断。

那么在中断处理函数中,再次访问该函数就会造成死锁。那么在中断处理函数中可以访问哪些函数呢?除了不使用全局锁的函数外,还有一些系统调用可以使用。调用其他任何非全局的函数,都会产生不可预知的后果(比如死锁)。看看。在分析死锁原因之前,我们先来看看cgi的执行流程,分析一下是否存在死锁的可能。PHP-CGI的执行流程 Glibc中的time函数使用了全局锁,保证了函数的线程安全,但是不保证信号安全()。经过前面的分析,我们初步怀疑死锁是由于PHP-CGI进程接收到信号后,在执行了非全局的函数造成的。在中断发生之前,主进程正在执行glibc中的time函数,在函数获取的锁还未释放时,就进入了中断进程。而中断过程中又访问了glibc中的time函数。所以就造成了死锁。 PHP-CGI的执行流程如下图所示: 进一步分析发现,所有死锁的cgi进程都记录了错误信息“’,60s就是我们php-cgi中设置的执行超时时间。

于是我们确认cig在执行过程中确实产生了超时异常,进而进入了进程,在这个过程中,访问了glibc中的time函数,从而造成了死锁。 () { (); EG()=; if(!){ ; } (,t_r,NULL); (,);//这里会调用zend特殊处理函数 (); (,); } 通过gdb调试发现,所有PHP-CGI都阻塞在n处,n会调用用户定义的php脚本中实现的函数,如果是CGI执行超市,定时器就会产生信号,中断执行过程,如果此时脚本刚好处于调用time函数的状态,锁资源还没有释放,那么执行过程就进入函数,不断跳转到n处。

这时候如果在自定义函数中访问了时间函数,就会出现死锁。我们从代码中找到了证据:(::);我们在php代码中使用了系统在cgi执行结束时会注入一个钩子函数来分析cgi执行是否正常,如果不正常就会发出报警信息。而报警处理函数中又访问了时间函数。所以有一定概率出现死锁。结论通过以上分析,我们发现了cgi死锁的原因,就是在中使用了一个非函数,从而导致了死锁。解决方案将注册在的钩子函数移除或者简化。避免担心函数调用满的问题。

二维码
扫一扫在手机端查看

本文链接:https://by928.com/3569.html     转载请注明出处和本文链接!请遵守 《网站协议》
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。

项目经理在线

我们已经准备好了,你呢?

2020我们与您携手共赢,为您的企业形象保驾护航!

在线客服
联系方式

热线电话

13761152229

上班时间

周一到周五

公司电话

二维码
微信
线