我们常常会碰到这样一种情况,开发环境在windows下开发,而生产环境确是linux。windows下能正常运行,上传到linux后却无法好好地玩耍了。然后开始了一轮尼玛式的疯狂的查找原因,最后发现是服务器环境问题。这时只能默默地爆一句shit。最近在用php多线程开发一个小功能也碰到类似的问题,在此记录一下。
1、查找资料发现php5.3或以上,且线程安全版本,才支持多线程。于是通过phpinfo()查看,发现php版本过低且为非线程安全版本。因而首先需要升级php版本,由于采用了集成式的wdlinux,因而直接采用官网的升级方式。
http://www.wdlinux.cn/bbs/thread-8044-1-1.html
然而升级后,PHPinfo查看。Thread Safety仍为false,于是继续查找。发现PHP多线程支持,编译时需要添加配置项 --enable-maintainer-zts,这样线程才是安全的(Thread Safety)。创建线程时才不会报错。
于是修改下升级脚本,添加--enable-maintainer-zts,然后一步步编译运行。再phpinfo查看,希望的情景终于出现了。
2、接下来是添加pthreads扩展
PHP扩展下载:https://github.com/krakjoe/pthreads
安装pthreads扩展
unzip pthreads-master.zip cd pthreads-master /usr/local/php/bin/phpize ./configure –with-php-config=/usr/local/php/bin/php-config make make install
3、更改php.ini配置(phpinfo Loaded Configuration File 节点)
vim /usr/local/php/etc/php.ini
添加节点:
上一步编译完成之后,会告诉你一个 pthreads.so 文件路径
extension='/usr/local/php/lib/php/extensions/no-debug-zts-20121212/pthreads.so'
以上节点是我机器路径,你们根据自己的情况更改
保存、退出
4、重启Apache
/usr/local/apache/bin/httpd -k restart
5、测试,直接写个php文件,new Thread,如果能输出类Obj,说明安装成功。
参考资料:
http://www.wdlinux.cn/bbs/thread-8044-1-1.html
------------php多线程---------------
http://www.thinkphp.cn/topic/22676.html
http://www.laozuo.org/4387.html
----------线程安全编译要求---------
http://www.45it.com/net/201503/38547.htm
http://zyan.cc/pthreads/