PHP产生阻塞的用法与对策

in #cn7 years ago (edited)

1.PHP中用file_get_contents/file_put_contents读写文件系统,会发生阻塞
换成Swoole内置的异步文件读写客户端.
2.PHP中用curl发起HTTP请求会发生阻塞
换成Swoole内置的异步HTTP客户端.
3.PHP中用phpredis发起的subscribe订阅操作会阻塞
换成Swoole内置的异步Redis客户端.
4.PHP中用PDO/MySQLi发起的查询操作会阻塞
换成Swoole内置的异步MySQL客户端,还能配上数据库连接池.
5.PHP中用sleep配合while(1)能实现定时器,但会产生阻塞
换成Swoole内置的异步定时器(swoole_timer_tick/swoole_timer_after)。
注意:上面这些Swoole提供的异步编程API,需要跑在Swoole Server,而不能跑在PHP-FPM里.Swoole内置的HttpServer就是一个类似于Nginx的异步处理HTTP连接的服务器,你可以认为用了Swoole的HttpServer,就相当于给PHP装上了一台Nginx发动机,轻松实现C10K并发完全不是问题.
6.使用session过程中,开启session后,同一浏览器执行同一程序,不同页面会被锁。
用session_write_close(),自动放弃session锁。session_write_close函数,作用是Write session data and end session,也就是写session的数据,同时关闭这个session。因此,我们可以在用完session之后,调用这个函数关闭session 文件即可解除锁定。一般,session是用来记录用户身份信息的,以便PHP进行身份认证,因此完全可以将session的读写放在页面刚开始执行的时 候,在执行完以后,马上调用session_write_close函数即可。参考https://www.sunbloger.com/2018/08/24/608.html
7.php fsockopen阻塞模式和非阻塞模式使用不当
PHP非阻塞执行方法,参考
https://blog.csdn.net/somehow1002/article/details/81192908
https://blog.csdn.net/hxspace/article/details/80791078
8.php调用系统命令不当
调用系统命令常用的主要有以下几种方法:exec(), system(), passthru(), shell_exec(),使用这些方法时用了阻塞方式调用。
改用非阻塞调用,参考http://www.cnblogs.com/itshark/p/5861827.html
9.for循环的堵塞
for($i=0;$i<=10;$i++)
{
print "value is now".$i."

ob_flush();
flush();
sleep(1);
}
办法:a.修改服务器配置 :如检查lighttpd中fastcgi的配置问题,默认max-proce=1,改成其他数就可以了
b.nginx+php_fpm :修改配置

10.PHP默认的配置下,PHP本身会发生阻塞
因为默认的话PHP是单线程的
11.服务器配置问题

Sort:  

I really appreciate your work. It took me a long time to get the followers I have. Luckily their are tools like steemvoter, vote4vote. steemengine etc. to help out minnows like me.

Coin Marketplace

STEEM 0.04
TRX 0.32
JST 0.078
BTC 62838.61
ETH 1657.37
USDT 1.00
SBD 0.41