如何讓您的php也支援pthreads多執行緒

無聲勝有聲發表於2015-05-10

  我們常常會碰到這樣一種情況,開發環境在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

View Code

 

  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/


相關文章