PHP产生阻塞的用法与对策

in #cn6 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.服务器配置问题