• 如何让您的php也支持pthreads多线程


      我们常常会碰到这样一种情况,开发环境在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/

  • 相关阅读:
    python进程监控及恢复
    Linux 命令行工具使用小贴士及技巧 ——(一)
    【未完待续】STP协议详解
    H3C路由交换设备配置的备份与恢复
    Linux小技巧2:如何修改SSH登陆端口
    supervisor error: <class 'socket.error'>, [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket.py line: 224
    Route Tools 知识点
    FirewallD常用命令及设置
    循环语句格式
    人脉就是钱脉,培养人脉的106个技巧
  • 原文地址:https://www.cnblogs.com/rwxwsblog/p/4492251.html
Copyright © 2020-2023  润新知