0

我有一个奇怪的情况。我有一个对 php 文件进行多次 AJAX 调用的网页。其中一些调用会卡住几秒钟到几分钟 - 请注意在 Google Chrome 上的 Inspect Element -> 网络中。

我检查了 apache 日志,并注意到这些调用需要很长时间才能处理,这可以从服务 php 页面的时间中看出。该页面有一些 db 调用,但 sql 非常快,并且不会阻止任何内容。事实上,我注释掉了 php 页面中的代码,但 apache 日志仍然显示这些调用需要很长时间才能加载。

我检查了服务器状态并注意到进程卡在 W 状态几分钟。由于 ajax 调用发生在循环中,我们有几个调用同时到达同一个页面,具有不同的 GET 变量。其中一些完成得很快,而另一些则需要时间。每次都延迟的调用不同。进入 W 状态的调用每次都会更改(GET 变量不同)。

相同的代码在我们的测试服务器中运行良好。问题出在生产服务器上。生产启用了 SSL,但除此之外我看不出服务器之间有任何区别。

我在卡住的 apache 进程上尝试了 pstack PID,但我不确定如何读取结果输出。这里是。

root# pstack 14759
#0  0x00007f0352a4d1d7 in flock () from /lib64/libc.so.6
#1  0x00007f034b50742a in ?? () from /etc/httpd/modules/libphp5.so
#2  0x00007f034b50752e in ?? () from /etc/httpd/modules/libphp5.so
#3  0x00007f034b5062e7 in php_session_start () from /etc/httpd/modules/libphp5.so
#4  0x00007f034b506aa9 in ?? () from /etc/httpd/modules/libphp5.so
#5  0x00007f034b685568 in ?? () from /etc/httpd/modules/libphp5.so
#6  0x00007f034b61f42b in execute () from /etc/httpd/modules/libphp5.so
#7  0x00007f034b5fe026 in zend_execute_scripts () from /etc/httpd/modules/libphp5.so
#8  0x00007f034b5abfb6 in php_execute_script () from /etc/httpd/modules/libphp5.so
#9  0x00007f034b68d132 in ?? () from /etc/httpd/modules/libphp5.so
#10 0x000055d5e59ea840 in ap_run_handler ()
#11 0x000055d5e59eac09 in ap_invoke_handler ()
#12 0x000055d5e59f7da0 in ap_process_request ()
#13 0x000055d5e59f4cc8 in ?? ()
#14 0x000055d5e59f0f20 in ap_run_process_connection ()
#15 0x000055d5e59fc9fb in ?? ()
#16 0x000055d5e59fce72 in ?? ()
#17 0x000055d5e59fddc7 in ap_mpm_run ()
#18 0x000055d5e59d487e in main ()```

Can someone help me figure out why this process is waiting? 

Btw, I have disabled mod_evasive so it cannot be due to some kind of rate limiting. But it seems like the issue is very similar to that I would observe when I hit a rate limit. 
4

1 回答 1

0

php_session_start ()在 pstack 中是提示。在 ajax/php 调用中搜索会话。这就是问题所在。Ajax 进行异步调用,而 php 无法同时处理多个调用。每次调用都会为会话锁定文件,然后会话必须在下一次调用锁定它之前变得空闲。

我将会话从文件更改为 mysql db,这解决了问题。

于 2021-07-15T06:14:13.887 回答