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

摘要:
最近,我在用PHP多线程开发一个小函数时遇到了类似的问题。让我们在这里记录下来。1.数据发现,只有PHP 5.3或更高版本和线程安全版本支持多线程。通过phpinfo(),我们发现PHP版本太低,而且是非线程安全的。因此,需要首先升级PHP版本。因为使用了集成的wdlinux,所以直接使用官网升级方式。http://www.wdlinux.cn/bbs/thread-8044-1-1.html但是,升级后,PHPinfo会进行检查。“威胁安全”仍然是假的,所以继续搜索。发现PHP支持多线程。编译时,需要添加配置项--enable maintainer zts,以便线程安全。在检查phpinfo之后,最终出现了所需的场景。

  我们常常会碰到这样一种情况,开发环境在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查看,希望的情景终于出现了。

  

如何让您的php也支持pthreads多线程第1张如何让您的php也支持pthreads多线程第2张
#!/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/

免责声明:文章转载自《如何让您的php也支持pthreads多线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ArcGSIServer服务无法远程连接给首页添加遮罩层,添加提示框下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【Go语言】连接数据库SQLite、MySQL、Oracle

本文目录 1.Go连接SQLite 1_1.SQLite推荐驱动 1_2.SQLite连接示例代码 2.Go连接MySQL 2_1.MySQL推荐驱动 2_2.MySQL连接示例代码 3.Go连接Oracle 3_1.Oracle推荐驱动以及准备事项 3_2.Oracle连接示例代码 说明:go语言连接数据库不像Java那么方便,本文分...

Visual Studio 2013新建工程导入现有代码文件夹并且保持目录结构

本文提供了一个在Windows环境下使用Visual Studio 2013编辑现有源代码并且保持目录结构的方法。本文使用VS2013中文社区版做示例(本版本为免费版,可在VS官网下载),其他版本的VS操作方式类似。打开VS2013,选择【菜单】-【新建】-【从现有代码创建项目】 选择项目类型:Visual C++ 项目文件位置:创建完成后会在这个目录生成...

linux系统上nginx配置按天生成日志文件

nginx日志默认把日志都写到一个文件中,这样不方便管理,而且文件容量会越来越大,所以为了方便管理分析日志把日志按天切割,即每天生成一个新的日志文件。 实现步骤 1. 找到nginx日志文件 我的文件在/usr/local/nginx/logs这个路径下,有个access.log文件就是nginx的日志文件 2. 进入该路径创建个sh文件(称为批处理日志...

如何找出 nginx 配置文件的所在位置?

nginx: 查找 nginx 配置文件的位置 原文地址:https://www.cnblogs.com/qianpangzi/p/10922420.html 另外补充:通过 where nginx 可以找出 nginx 命令(可能是链接文件)所在地址: ➜ bin where nginx /usr/local/bin/nginx 如果您要查找到目标源...

DOCKER 从入门到放弃(二)

搜索镜像 从docker官方镜像仓库搜索镜像 docker search [OPTIONS] TERM OPTIONS: --automated :只显示自动创建的镜像,默认值为fasle --filter,-f :显示过滤后的搜索结果 --limit :显示的最大搜索结果,默认值为25 --no-trunc : 显示完整的镜像描述,默认值为fasle...

Ruby开发入门

开发环境搭建 首先安装Ruby SDK,我安装的版本是2.0。之后安装IDE,这里用的是Jetbrain的RubyMine 5.4.3,注意是否支持对应版本的Ruby SDK。 一段神奇的注册码... 现在最新版本是4.0.2, 使用这个key仍然有效, 对于这个没什么好说的, 如有必要,请支持购买正版。 No.1: name:rubymine...