我們常常會碰到這樣一種情況,開發環境在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查看,希望的情景終於出現了。

#!/bin/bash # PHP 5.5 update scripts if [ ! $1 ];then Ver=5.5.9 else Ver=$1 fi Debugfile=20121212 echo "THANK YOU FOR USING UPDATE SCRIPT MADE BY HTTP://WWW.AREFLY.COM & HTTP://WWW.ITBULU.COM" echo "YOU ARE GOING TO UPDATE YOUR PHP TO ${Ver}" echo "YOU CAN JUST HAVE A REST" echo "IT MAY TAKE A LOT OF TIME" echo #read -p "PRESS ENTER IF YOU REALLY WANT TO UPDATE" read -p "DO YOU REALLY WANT TO UPDATE? (Y/N)" yn if [ "$yn" == "Y" ] || [ "$yn" == "y" ]; then echo "PHP IS NOW UPDATING!" else exit fi echo echo "-------------------------------------------------------------" echo ###yum yum install -y libmcrypt-devel libjpeg-devel libpng-devel freetype-devel curl-devel openssl-devel libxml2-devel zip unzip ### if [ ! -f php-${Ver}.tar.gz ];then wget -c http://us1.php.net/distributions/php-${Ver}.tar.gz fi if [ ! -f iconv_ins.sh ];then wget -c http://down.wdlinux.cn/in/iconv_ins.sh sh iconv_ins.sh fi ### if [ -f /www/wdlinux/mysql/lib/libmysqlclient.so.18 ];then if [ -d /usr/lib64 ];then LIBNCU="/usr/lib64" else LIBNCU="/usr/lib" fi ln -sf /www/wdlinux/mysql/lib/libmysqlclient.so.18 $LIBNCU fi tar zxvf php-${Ver}.tar.gz cd php-${Ver} if [ -d /www/wdlinux/apache_php ];then echo "START CONFIGURING PHP ON NGINX" sleep 3 make clean ./configure --prefix=/www/wdlinux/apache_php-${Ver} --with-config-file-path=/www/wdlinux/apache_php-${Ver}/etc --with-iconv=/usr --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt=/usr --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-ftp --enable-sockets --enable-zip --with-apxs2=/www/wdlinux/apache/bin/apxs --with-mysqli=/www/wdlinux/mysql/bin/mysql_config --with-pdo-mysql=/www/wdlinux/mysql --enable-opcache --enable-bcmath --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-maintainer-zts [ $? != 0 ] && echo "NO! CONFIGURE ERROR! TRY AGAIN OR ASK IN THE BBS! :(" && exit echo "START MAKE" sleep 3 make [ $? != 0 ] && echo "NO! MAKE ERROR! TRY AGAIN OR ASK IN THE BBS! :(" && exit echo "START MAKE INSTALL" sleep 3 make install [ $? != 0 ] && echo "NO! MAKE INSTALL ERROR! TRY AGAIN OR ASK IN THE BBS! :(" && exit cp php.ini-production /www/wdlinux/apache_php-${Ver}/etc/php.ini sed -i 's/short_open_tag = Off/short_open_tag = On/g' /www/wdlinux/apache_php-${Ver}/etc/php.ini rm -f /www/wdlinux/apache_php ln -sf /www/wdlinux/apache_php-${Ver} /www/wdlinux/apache_php if [ ! -d /www/wdlinux/apache_php-${Ver}/lib/php/extensions ];then mkdir -p /www/wdlinux/apache_php-${Ver}/lib/php/extensions/no-debug-zts-${Debugfile} ln -sf /www/wdlinux/apache_php-${Ver}/lib/php/extensions/no-debug-zts-${Debugfile} /www/wdlinux/apache_php-${Ver}/lib/php/extensions/no-debug-non-zts-${Debugfile} fi service httpd restart fi if [ -d /www/wdlinux/nginx_php ];then echo "START CONFIGURING PHP ON APACHE" sleep 3 make clean ./configure --prefix=/www/wdlinux/nginx_php-${Ver} --with-config-file-path=/www/wdlinux/nginx_php-${Ver}/etc --with-iconv=/usr --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt=/usr --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-ftp --enable-sockets --enable-zip --enable-fpm --with-mysqli=/www/wdlinux/mysql/bin/mysql_config --with-pdo-mysql=/www/wdlinux/mysql --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd [ $? != 0 ] && echo "NO! CONFIGURE ERROR! TRY AGAIN OR ASK IN THE BBS! :(" && exit echo "START MAKE" sleep 3 make [ $? != 0 ] && echo "NO! MAKE ERROR! TRY AGAIN OR ASK IN THE BBS! :(" && exit echo "START MAKE INSTALL" sleep 3 make install [ $? != 0 ] && echo "NO! MAKE INSTALL ERROR! TRY AGAIN OR ASK IN THE BBS! :(" && exit cp php.ini-production /www/wdlinux/nginx_php-${Ver}/etc/php.ini sed -i 's/short_open_tag = Off/short_open_tag = On/g' /www/wdlinux/nginx_php-${Ver}/etc/php.ini service php-fpm stop rm -f /www/wdlinux/nginx_php ln -sf /www/wdlinux/nginx_php-${Ver} /www/wdlinux/nginx_php cp /www/wdlinux/nginx_php-${Ver}/etc/php-fpm.conf.default /www/wdlinux/nginx_php-${Ver}/etc/php-fpm.conf sed -i 's/user = nobody/user = www/g' /www/wdlinux/nginx_php/etc/php-fpm.conf sed -i 's/group = nobody/group = www/g' /www/wdlinux/nginx_php/etc/php-fpm.conf sed -i 's/;pid =/pid =/g' /www/wdlinux/nginx_php/etc/php-fpm.conf cp -f sapi/fpm/init.d.php-fpm /www/wdlinux/init.d/php-fpm chmod 755 /www/wdlinux/init.d/php-fpm if [ ! -d /www/wdlinux/nginx_php-${Ver}/lib/php/extensions ];then mkdir -p /www/wdlinux/nginx_php-${Ver}/lib/php/extensions/no-debug-zts-${Debugfile} ln -sf /www/wdlinux/nginx_php-${Ver}/lib/php/extensions/no-debug-zts-${Debugfile} /www/wdlinux/nginx_php-${Ver}/lib/php/extensions/no-debug-non-zts-${Debugfile} fi fi cd .. rm -rf php-${Ver}/ rm -rf php-${Ver}.tar.gz rm -rf iconv_ins.sh echo echo "---------------------www.itbulu.com-------------------------------------" echo "PHP UPDATE FINISH! :D" echo "NOW YOUR PHP VERSION IS ${Ver}!" echo "UPDATE SCRIPT MADE BY HTTP://WWW.AREFLY.COM & HTTP://WWW.ITBULU.COM " echo "THANK YOU FOR USING" echo echo "WDCP (C) COPYRIGHT" echo echo "PS: I THINK YOU NEED RESTART SERVER AFTER UPDATE." echo "PS2: REMEMBER TO VISIT HTTP://WWW.AREFLY.COM & HTTP://WWW.ITBULU.COM! :D" echo
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/