lnmp php 安装多线程 pthreads 扩展

阅读 (886)
lnmp 将php升级成ZTS,开启Thread Safety,安装 pthreads 扩展

一、环境

ubuntu 14 + lnmp一键安装

二、问题

使用Lnmp安装自然是方便,一键部署,但正因为全自动部署,很多配置选项都是Lnmp自动设置好了,比如php的线程安全,默认就被disabled了

Thread Safety disabled

一开始查阅了很多资料,php要支持多线程,可以选择安装pthreads拓展,但这个拓展必需要php 的 Thread Safety 是 enabled,这就必需要重新编译php了,百度了一大堆有的没有,都没能解决,即然后我用了lnmp一键安装包,那就从官方找找解决方案,我用的是lnmp 1.4, 果然官方说要升级PHP时,如果要加自定义参数,可在 lnmp.conf 中自行加入参数

PHP_Modules_Options='' // 在引号中加入自定义参数

通过查询资料得知,需开启PHP ZTS 需在编译时加入 --enable-maintainer-zts 参数

那就简单啦,修改成:

PHP_Modules_Options='--enable-maintainer-zts'

保存好配置文件,再升级PHP版本,即执行lnmp目录中的 upgrade.sh

下面只剩等待了~~~~

更新完成后,使用

[root@localhost ~]# php -v
PHP 7.1.32 (cli) (built: Sep 16 2019 11:40:03) ( ZTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies

看到上面的 (ZTS)即表示已经是线程安全了

三、pthreads的安装

[root@localhost ~]# wget https://codeload.github.com/krakjoe/pthreads/zip/master

[root@localhost ~]# unzip master

[root@localhost ~]# cd pthreads-master/

[root@localhost pthreads-master]# phpize 

[root@localhost pthreads-master]#./configure --with-php-config=/usr/local/php/bin/php-config

[root@localhost pthreads-master]# make && make install

[root@localhost pthreads-master]# cd /usr/local/php/etc/

[root@localhost etc]# cd /usr/local/php/etc/

[root@localhost etc]# cp php.ini php_bak.ini // 备份一下

[root@localhost pthreads-master]# echo extension = /usr/local/php/lib/php/extensions/no-debug-zts-20170718/pthreads.so >> /usr/local/php/etc/php.ini

再确认下拓展

[root@localhost ~]# php -m| grep pthreads
pthreads

测试代码

将下面代码存为PHP文件test.php

<?php 
//实现多线程必须继承Thread类
class test extends Thread {
    public function __construct($arg){
        $this->arg = $arg;
    }
 
    //当调用start方法时,该对象的run方法中的代码将在独立线程中异步执行。
    public function run(){
        if($this->arg){
            printf("Hello %s\n", $this->arg);
        }
    }
}
$thread = new test("World");
 
if($thread->start()) {
    //join方法的作用是让当前主线程等待该线程执行完毕
    //确认被join的线程执行结束,和线程执行顺序没关系。
    //也就是当主线程需要子线程的处理结果,主线程需要等待子线程执行完毕
    //拿到子线程的结果,然后处理后续代码。
    $thread->join();
}
?>

运行测试下即可

更新于:2019-10-16 16:55:11
返回顶部