我正在编写一个 wordpress 插件来包含一个定制的单点登录。
我有一个无法重现的问题,但它经常发生:有时您登录,单击另一个页面,该页面会一直加载。来自同一会话的所有其他请求也将从此时卡住。重新启动 apache 可以修复它,但不是真正的解决方案。
服务器没有很多流量,所以只有几个 apache 进程在运行。如果我深入研究它们,我会看到很多人坚持semop
:
(gdb) bt
#0 0x00002af60c22b2d7 in semop () from /lib64/libc.so.6
#1 0x00002af60bbf612c in ?? () from /usr/lib64/libapr-1.so.0
#2 0x000055555559e614 in ?? () from /usr/sbin/httpd2-prefork
#3 0x000055555559e9ea in ?? () from /usr/sbin/httpd2-prefork
#4 0x000055555559f25d in ap_mpm_run () from /usr/sbin/httpd2-prefork
#5 0x000055555557a080 in main () from /usr/sbin/httpd2-prefork
看起来他们正在等待一个文件:
strace -p 3069
....
read(7, 0x7fff16a04df7, 1) = -1 EAGAIN (Resource temporarily unavailable)
semop(286162952, 0x2af60bd07dc0, 1 <unfinished ...>
read(7 ,..)
指向管道:
# ls -la /proc/3069/fd/7
lr-x------ 1 root root 64 Nov 7 17:24 7 -> pipe:[157329520]
所有 apache 进程都使用该管道:
# lsof | grep 157329520
httpd2-pr 2430 root 7r FIFO 0,5 157329520 pipe
httpd2-pr 2430 root 8w FIFO 0,5 157329520 pipe
httpd2-pr 3061 wwwrun 7r FIFO 0,5 157329520 pipe
httpd2-pr 3061 wwwrun 8w FIFO 0,5 157329520 pipe
...
它可能与问题无关,但我仍然想知道这是什么类型的管道。
这里的人们猜测这毕竟不是服务器问题,但从我在回溯中看到的 PHP 甚至还没有被调用。根本没有 libphp5.so。
我很想发布一些 PHP 代码供您查看,但我只是不知道哪一部分...我的脚本在同一会话中对另一个脚本进行 curl 调用。也许这是在制造某种阻塞?或者可能是https问题?
我真的不知道它是 PHP 还是 Apache,但问题的关键可能是了解 apache 在这里做什么。
知道如何修复或调试这个吗?