导航:首页 > 编程语言 > php7pcntl扩展

php7pcntl扩展

发布时间:2024-03-07 03:46:18

㈠ 如何使用 php 构建一个高性能的弹幕后端服务

随着WEB2.0的流行,现在很多网站都流行使用“弹幕”这种形式来实现互动。
弹幕(barrage),中文流行词语,原意指用大量或少量火炮提供密集炮击。大量以字幕弹(dàn)出形式显示的评论同时在屏幕上飘过的现象也被称为弹幕。
作为PHPer的我们,看到现在各种网站都有酷炫的弹幕飞过,我们是不是也想给自己的网站加入弹幕功能呢?
首先弹幕的后端其实说白了和公共聊天室的后端原理十分相似,都是一个客户端发送消息给服务端,服务端再将收到的消息广播给其他的客户端。对于后端来说他们几乎没区别,区别就在于前端。
好在我们有一个前端弹幕插件,这个插件是一个jquery插件,github地址:https://github.com/chiruom/jquery.danmu.js,基本上会使用jquery语法,看看示例代码就可以傻瓜化使用。
前端已经有了解决方案,但是后端呢?前端如何与后端通讯?用传统的ajax轮询吗?不行,这样效率太低,想想各大火爆的直播平台都是同一时间几万人在线,几千人同时发弹幕,如果靠ajax轮询一个php接口的话服务器会吃不消的。且弹幕消息存储方案略显复杂,有人问为什么要存储呢?因为ajax使用的HTTP协议是无状态协议,A客户端和B客户端之间对于服务器来说没有任何标志,如果服务器要确保A客户端和B客户端分别在两次请求的时候服务器只返回这两个客户端没有获取过的弹幕消息,那么服务器端就必须使用一个缓存来标识某某客户端看过哪条弹幕消息。综上所述ajax可以实现小规模的弹幕通信方案,但是很麻烦。
好在最新的HTML5中加入了WebSocket协议,我们可以通过WebSocket这种基于HTTP协议之上的即时通信协议来替代ajax这种传统的我问你答的老旧通信模式。而我们是PHPer,对于我们这种只懂PHP的人该如何编写WebSocket服务端呢?好在我们又得知PHP有一个Swoole扩展,我们在PHP语言中使用它可以很方便的构建一个WebSocket服务端。
关于Swoole的介绍可以参照他的官网http://www.swoole.com/,下面引用官网对它的一段简短的介绍。
PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。
先别被Swoole这么多的功能吓到了。我们先关注这里面的重点Swoole内置了Http/WebSocket服务器端/客户端意味着我们可以通过它构建WebSocket的服务端。看到这里我们是不是就急急忙忙去拿官网的WebSocket服务端代码做测试呢?不,Swoole是一个PHP扩展,意味着我们还得去安装它。是不是直接去下载so文件然后在php.ini中加入extension=swoole.so就可以了呢?还不是,我们先去看看Swoole扩展的依赖,这也是我们使用任何语言的任何外部包,外部模块,外部扩展最先要了解的问题。
参考官网:http://wiki.swoole.com/wiki/page/7.html环境依赖
仅支持linux,FreeBSD,MacOS,3类操作系统
Linux内核版本2.3.32以上
PHP5.3.10以上版本,包括PHP7
gcc4.4以上版本或者clang
cmake2.4+,编译为libswoole.so作为C/C++库时需要使用cmakePHP版本依赖
swoole仅支持PHP5.3.10或更高版本,建议使用PHP5.4+swoole不依赖php的stream、sockets、pcntl、posix、sysvmsg等扩展。PHP只需安装最基本的扩展即可意味着我们Windows下是无法使用这个扩展了(其实可以借助cygwin在win下使用swoole,但是考虑到我们使用swoole扩展就是为了性能,也为了熟悉以后的生产环节部署做准备,强烈推荐在linux下开发),那么我们把开发环境转移到Linux下进行吧。
接着还要求Linux内核版本为2.3.32以上,PHP为5.3.10以上,那么我们就用最新的CentOS吧,这个版本的yum安装的php直接就是PHP7最新版,根本无需考虑其他问题,当然你喜欢图形界面,用Ubuntu也可以。其他的基本上最新的Linux发行版都是符合版本要求的。
接着我们便来安装这个扩展,推荐使用PECL来安装,只需要一条pecl install swoole
即可,非常方便。当然你要编译安装,具体步骤请参考http://wiki.swoole.com/wiki/page/6.html安装完扩展之后在命令行下输入
php -m
检查,如果有swoole那么说明安装成功了。
接下来就正式开始我们的编码旅程了。
开始编码旅程之前我们先看看最基础的效果原型是什么样子没错就是这个样子,两个浏览器之前完全独立使用Websocket连接服务端,因此对于服务端来说这两个浏览器就相当于两个完全处在不同机器上的客户端。
效果看完了就开始来讲代码吧。
我们先看看官网的WebSocket服务端示例代码。
$serv = new Swoole\Websocket\Server("127.0.0.1", 9502);$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
$serv->start();
我们看到这个代码的第一行先是new了一个WebSocket服务端对象,并且在构造方法中的第一个参数指定了服务端监听的IP,第二个参数指定了服务端监听的端口。然后使用on方法为每一个事件设置了回调函数,最后一行start方法正式开始运行服务端。
这种写法非常像javascript里面的异步调用,这也是Swoole中的事件驱动异步非阻塞特性,正因为是这种特性,每一个独立的事件(请求)会在服务端接收到之后分别异步处理,他们之间无需互相等待,这也是Swoole性能高的原因所在。
我们来分别剖析一下每一个事件的含义。
$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
顾名思义,Open表示打开一个新的链接,并且在事件触发之后echo出连接上服务端的客户端id,该客户端唯一id为回调函数第二个参数中的fd字段。这也是服务端区分客户端的唯一id。
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
同样顾名思义,Message表示消息到达服务端的事件,并且在事件触发之后echo出发送给服务端的数据,该数据为回调函数第二个参数的data字段。另外我们还看到它调用了$server->push,这是回调函数的第一个参数中的push方法,它是一个服务端给客户的发送数据的方法,第一个参数为要发送的客户端id,第二个为要发送的数据,这里的含义是向发给服务端消息的那个客户端发送["hello", "world"]这个数组(方括号写数组为PHP5.4的新特性,如果你是PHP5.3请使用传统的array工厂函数生成数组)经过json序列化之后的数据。
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
最后一个事件Close更加容易理解,就是关闭事件,当然关闭的不是服务端,而是客户端,可以理解为客户端与服务端断开连接的事件。回调函数中的代码含义为echo出与服务端断开连接的那个客户端id。
基本的API都清楚了,下面就直接看代码吧,短短二十行而已。
https://github.com/cw1997/danmu-demo/blob/master/server.php$server = new swoole_websocket_server("0.0.0.0", 1997);$server->on('open', function (swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id});
$server->on('message', function (swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";//$frame->fd 是客户端id,$frame->data是客户端发送的数据//服务端向客户端发送数据是用 $server->push( '客户端id' , '内容')$data = $frame->data;
foreach($server->connections as $fd){
$server->push($fd , $data);//循环广播
}
});
$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});
$server->start();
这里最核心的广播代码其实还用到了一个之前没有提到过的成员,也就是swoole_websocket_server对象的connections成员,这个成员中保存了所有已连接上该WebSocket服务端的fd,也就是客户端id。因此我们只要在message事件中使用foreach遍历该成员,循环将所有服务端收到的弹幕消息都发送给其他已连接上该服务端的客户端即可。
后端讲完了再讲讲前端吧。
前端代码也不是很多https://github.com/cw1997/danmu-demo/blob/master/index.htmlvar ws = new WebSocket("ws://192.168.1.107:1997");ws.onopen = function(){
console.log("握手成功");
ws.send('hello world!!!');
};
ws.onmessage = function(e){
console.log("message:" + e.data);
var time = jQuery('#danmu').data("nowtime") + 1;var text_obj = '{ "text":"' + e.data + '" , "color":"green" ,"size":"1","position":"0","time":"' + time + '" ,"isnew":" "}'; //构造加上了innew属性的字符串danmu对象console.log(text_obj);
var new_obj = eval('(' + text_obj + ')'); //转化为js对象jQuery('#danmu').danmu("add_danmu", new_obj); //向插件中添加该danmu对象};
ws.onerror = function(){
console.log("error");
};
核心代码都在这里,使用new WebSocket("ws://192.168.1.107:1997")创建一个WebSocket客户端连接对象,通过该对象的各种事件进行对应的操作,和服务端是不是很像?更多代码解释可以参考源代码中的注释,这里不做更多介绍。
看到这里相信作为一名PHPer的你也可以开发出属于自己的弹幕系统了。这里展示的只是一个最基础最原始的弹幕平台。我们也了解到了使用PHP开发一个弹幕平台需要涉及到的技术有WebSocket,Swoole扩展,甚至碰到了很多初级开发者平时不怎么接触的工具,比如说PECL,比如说Linux。
其实PHP结合Swoole扩展还可以做很多事情,比如说对接各种家电,对接各种硬件接口实现在Web端实时控制家电,又比如说结合树莓派做智能小车,通过web端进行遥控等等,各种新奇的玩法等你发现。谁说PHP只能做Web开发?PHP拥有了Swoole扩展其实能做的事情还有很多,Swoole就像他的宣传标题一样:重新定义PHP。

㈡ PHP7安装intl扩展和linux安装icu

一 PHP intl 是国际化扩展,是ICU 库的一个包装器。所以在安装PHP intl扩展前要先安装ICU库,安装ICU库的具体步骤::

二 安装intl扩展
1:进入php7.2.5源码

2:运行:phpize ,找不到命令时,将路径补全:/usr/local/php7/bin/phpize(是php的安装路径),出现如下:

Configuring for:
PHP Api Version: 20100412
Zend Mole Api No: 20100525

Zend Extension Api No: 220100525

3:运行配置

./configure --enable-intl --with-icu-dir=/usr/local/icu/ --with-php-config=/usr/local/php7/bin/php-config

注:前面路径为icu的安装路径,后面路径为php的安装路径。

4:编译扩展:make

5:复制扩展到目标文件夹

cp /user/local/php/php7.2.5/ext/intl/moles/intl.so /user/local/php7/lib/php/extensions/no-debug-non-zts-20170718

注意:也可以find / -name intl.so 查找。

6:设置扩展加入配置文件中:

[intl]
extension_dir = "/usr/local/php7/lib/php/extensions/no-debug-non-zts-20170718/"

extension=intl.so

大坑:::采用phpinfo()时,无法找到配置的intl扩展,说明配置没有生效。。。。。。

原因:在编译php时没有 --with-config-file-path=PATH 指定php.ini路径,默认的路径为/usr/local/php7/lib,只需要将php.ini放入这个默认的路径即可。你也可以安装配置php时加入,如下:

./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --with-curl --with-freetype-dir --with-gd --with-gettext --with-iconv-dir --with-kerberos --with-libdir=lib64 --with-libxml-dir --with-mysqli --with-openssl --with-pcre-regex --with-pdo-mysql --with-pdo-sqlite --with-pear --with-png-dir --with-xmlrpc --with-xsl --with-zlib --enable-fpm --enable-bcmath -enable-inline-optimization --enable-gd-native-ttf --enable-mbregex --enable-mbstring --enable-opcache --enable-pcntl --enable-shmop --enable-soap --enable-sockets --enable-sysvsem --enable-xml --enable-zip --enable-pcntl --with-curl --with-fpm-user=nginx --enable-ftp --enable-session --enable-xml --with-apxs2=/usr/bin/apxs
访问:index.php中phpinfo()文件。

㈢ php中pcntl_fork是什么意思,pcntl_fork创建子进程如何进行的

一、php中pcntl_fork函数概述

pcntl_fork()函数是php中用于创建子进程的一个函数,返回创建的子进程的pid。

该函数创建子进程具体fork的过程:

(1)调用该函数即创建一个子进程,创建成功父进程返回子进程的pid,子进程返回0;

(2)创建子进程实际上对父进程的一个拷贝,共享代码空间,拷贝父进程的数据,也就是说父进程改变父进程的数据,子进程改变子进程


二、示例代码分析

1.代码示例:

<?php

$curr_pid=posix_getpid();//获取当前的进程id

//将当前进程的id写入文件中

echo'当前进程:'.$curr_pid.PHP_EOL;

//开始创建子进程

$son_pid=pcntl_fork();//返回子进程的id

//查看当前进程

echo'创建子进程之后当前的进程为:'.posix_getpid().PHP_EOL;

//创建了子进程之后

if($son_pid>0){

echo'子进程id:'.$son_pid.PHP_EOL;

}

2.以上代码执行后结果为:

3.示例代码分析:

(1)发现创建了子进程之后,系统会切换到子进程中,而子进程中的代码是从含有pcntl_fork函数的那行执行的

(2)创建子进程之后,子进程的代码段是拷贝pcntl_fork函数及之后的代码段,之前的代码段并不拷贝,但是具体的数据变量子进程仍然会拷贝

(3)可见,fork之后程序会分叉执行,即子进程执行


三、pcntl_fork的业务场景举例

1.php的多进程中,常用pcntl_fork来实现并发,多用于一些简单工具的实现。

2.例如监控工具,想要监控几个不同指标的情形,可以使用主进程监控各指标的配置变化,然后对每个指标分别fork一个子进程来监控其具体的情形,当主进程发现指标的配置改变则kill掉之前的子进程重新创建子进程进行监控。

3.主进程进行业务分发操作,子进程进行具体的业务逻辑执行。(BY三人行慕课)

㈣ linux 怎么安装nginx

Centos7配置Nginx+PHP7Web服务

作者:JadeGlorious

1、安装相应的扩展支持;

yuminstallgcc-c++
yuminstallpcrepcre-devel
yuminstallzlibzlib-devel
yuminstallopensslopenssl-devel
yum-yinstalllibjpeglibjpeg-devellibpnglibpng-develfreetypefreetype-devellibxml2libxml2-develmysqlpcre-devel
yum-yinstallcurl-devellibxslt-devel

集成至一行命令一次安装
yum-yinstalllibjpeglibjpeg-devellibpnglibpng-develfreetypefreetype-devellibxml2libxml2-develmysqlpcre-develgcc-c++pcrepcre-develpcrepcre-developensslopenssl--develcurl-devellibxslt-devel

如有不能成功安装的,单独再安装一次即可;
2、编译安装Nginx最新版本
//检查是否已经安装nginx

$find/-namenginx

//如果已经安装nginx先卸载掉

$yumremovenginx

//进入习惯使用的下载目录,下载想要使用的nginx版

$wgethttp://nginx.org/download/nginx-1.7.4.tar.gz

//解压nginx安装包

$tar-zxvfnginx-1.7.4.tar.gz

//进入解压后的目录

$cdnginx-1.7.4

//配置安装信息,要加载什么扩展,安装到什么目录之类的
//使用--prefix参数指定nginx安装的目录,make、makeinstall安装

$./configure$默认安装在下载目录

//指定目录

$./configure--prefix=/usr/local/nginx//指定安装在/usr/local/nginx

//编译安装

$make&&makeinstall

//检查是否安装成功

$whereisnginx

3、编译安装PHP7

//下载、解压、进入目录:

$wgethttp://downloads.php.net/~ab/php-7.0.6RC1.tar.gz
$tar-zxvfphp-7.0.6RC1.tar.gz$cdphp-7.0.6RC1

//配置安装信息、扩展

$./configure--prefix=/usr/local/php--exec-prefix=/usr/local/php--bindir=/usr/local/php/bin--sbindir=/usr/local/php/sbin--includedir=/usr/local/php/include--libdir=/usr/local/php/lib/php--mandir=/usr/local/php/php/man--with-config-file-path=/usr/local/php/etc--with-mysql-sock=/var/run/mysql/mysql.sock--with-mhash--with-openssl--with-mysql=shared,mysqlnd--with-mysqli=shared,mysqlnd--with-pdo-mysql=shared,mysqlnd--with-gd--with-iconv--with-zlib--enable-zip--enable-inline-optimization--disable-debug--disable-rpath--enable-shared--enable-xml--enable-bcmath--enable-shmop--enable-sysvsem--enable-mbregex--enable-mbstring--enable-ftp--enable-gd-native-ttf--enable-pcntl--enable-sockets--with-xmlrpc--enable-soap--without-pear--with-gettext--enable-session--with-curl--with-jpeg-dir--with-freetype-dir--enable-opcache--enable-fpm--enable-fastcgi--with-fpm-user=nginx--with-fpm-group=nginx--without-gdbm--disable-fileinfo

//编译检查不通过,缺少什么扩展安装了重新检测,通过后编译安装

$makeclean&&make&&makeinstall

maketest

配置文件
#cpphp.ini-development/usr/local/php/lib/php.ini
#cp/usr/local/php/etc/php-fpm.conf.default/usr/local/php/etc/php-fpm.conf
#cp/usr/local/php/etc/php-fpm.d/www.conf.default/usr/local/php/etc/php-fpm.d/www.conf#cp-R./sapi/fpm/php-fpm/etc/init.d/php-fpm

//安装完成后修改nginx配置文件nginx.conf,添加对php的支持,指定项目目录,完成后重启nginx
//启动php-fpm

#/etc/init.d/php-fpm

㈤ debian8怎么安装php7

debian8 编译安装 php7
目录(?)[-]
Please reinstall the libcurl distributionCannot find OpenSSL
configure error Unable to locate gmph
Can not find recodeh anywhere under usr usrlocal usr optCannot find pspell
Please reinstall the mysql distribution
mcrypth not found Please reinstall libmcryptxml2-config not found
安装编译器
apt-get install build-essential autoconf automake libtool bison re2c获取PHP安装包
wget https://downloads.php.net/~ab/php-7.0.13RC1.tar.gz安装dev包
apt-get install libxml2-dev libssl-dev libbz2-dev libjpeg-dev libpng-dev libxpm-dev libfreetype6-dev libgmp-dev libgmp3-dev libmcrypt-dev libmysqlclient15-dev libpspell-dev librecode-dev进行编译安装
./buildconf //用来生成configure脚本
./configure \
--prefix=/usr \
--with-config-file-path=/etc \
--enable-mbstring \
--enable-zip \
--enable-bcmath \
--enable-pcntl \
--enable-ftp \
--enable-exif \
--enable-calendar \
--enable-sysvmsg \
--enable-sysvsem \
--enable-sysvshm \
--enable-wddx \
--with-curl \
--with-mcrypt \
--with-iconv \
--with-gmp \
--with-pspell \
--with-gd \
--with-jpeg-dir=/usr \
--with-png-dir=/usr \
--with-zlib-dir=/usr \
--with-xpm-dir=/usr \
--with-freetype-dir=/usr \
--with-t1lib=/usr \
--enable-gd-native-ttf \
--enable-gd-jis-conv \
--with-openssl \
--with-pdo-mysql=/usr \
--with-gettext=/usr \
--with-zlib=/usr \
--with-bz2=/usr \
--with-recode=/usr \
--with-mysqli=/usr/bin/mysql_config
备注:错误1:Cannot find OpenSSL's libraries 解决:
确认已安装过 openssl、libssl-dev 包,还是会提示该错误;解决办法:
root@test2:~/php-5.3.27# find / -name libssl.so输出结果为: /usr/lib/x86_64-Linux-gnu/libssl.so初步判断它可能只会在 /usr/lib/ 下寻找 libssl.so 文件,于是:
ln -s /usr/lib/x86_64-linux-gnu/libssl.so /usr/lib错误2:debian Please reinstall the libcurl distribution 解决:
# RetHat CentOS or Fedora 使用下面安装命令yum install curl curl-devel
# Debian or Ubuntu使用下面的安装命令
apt-get install curl
apt-get install libcurl4-gnutls-dev
错误3:Unable to locate gmp.h 解决:
在https://launchpad.net/debian/+source/gmp 下载 gmp源码包,接着 ./configure && make && make install编译 安装
make &&make install
报错处理
Please reinstall the libcurl distributionaptitude search libcurl4
aptitude install libcurl4-gnutls-dev
Cannot find OpenSSL’
wget https://www.openssl.org/source/openssl-1.0.2j.tar.gztar -zxvf openssl-1.0.2j.tar.gz
cd openssl-1.0.2j
./config
make && make install
configure: error: Unable to locate gmp.h
sudo apt-get install libgmp-dev libgmp3-devln -s /usr/include/x86_64-linux-gnu/gmp.h /usr/include/gmp.hCan not find recode.h anywhere under /usr /usr/local /usr /opt.
apt-get install librecode-dev
Cannot find pspell
apt-get install libpspell-dev
Please reinstall the mysql distribution
apt-get install libmysqlclient15-dev
mcrypt.h not found. Please reinstall libmcrypt.
apt-get install libmcrypt-dev
xml2-config not found
apt-get install libxml2-dev

㈥ 如何在linux下安装多个不同版本的PHP

Linux下部署php多版本共存
背景说明
自php7问世,身为最新版本控的我马上升级体验,但是由于服务器上还有旧程序在运行,只好部署一个php多版本共存环境。
现有环境是lnmp
- CentOS 6.7
- nginx 1.10.1
- mariadb-10.0.26
- php 7.0.8
为了更好兼容旧的php程序,推荐使用5.4.45. 主要是兼容mysql扩展。
开始安装
首先要下载php-5.4.45.tar.gz源码包。
通过源码安装
# tar xzvf php-5.4.45.tar.gz
# cd php-5.4.45

# ./configure --prefix=/usr/local/php54 --with-config-file-path=/usr/local/php54/etc --enable-fpm --with-fpm-user=www --with-fpm-group=www --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir --with-freetype-dir=/usr/local/freetype --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-mbstring --with-mcrypt --enable-ftp --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-gettext --disable-fileinfo --enable-intl --with-xsl

# make ZEND_EXTRA_LIBS='-liconv'
# make install
# cp php.ini-proction /usr/local/php/etc/php.ini

------------------------------------------------------------------------------------------------
php.ini 配置
post_max_size = 50M
upload_max_filesize = 50M
date.timezone = PRC
short_open_tag = On
cgi.fix_pathinfo=0
max_execution_time = 300
disable_functions=passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,popen,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server
------------------------------------------------------------------------------------------------
php-fpm.conf 配置
------------------------------
# vim /usr/local/php/etc/php-fpm.conf1
[global]
pid = /usr/local/php54/var/run/php-fpm.pid
error_log = /usr/local/php54/var/log/php-fpm.log
log_level = notice

[www]
listen = /tmp/php54-cgi.sock
listen.backlog = -1
listen.allowed_clients = 127.0.0.1:9001
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 40
pm.start_servers = 20
pm.min_spare_servers = 20
pm.max_spare_servers = 40
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

----------------------------------------------------------------------------------
启动 php-fpm
# cp sapi/fpm/init.d.php-fpm /etc/init.d/php54-fpm
# chmod +x /etc/init.d/php54-fpm
# /etc/init.d/php54-fpm start
-------------------------------------------------------------------------------------------
修改nginx配置,对需要的服务配置使用php-5.4.45
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php54-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}
----------------------------------------------------------------------------------------
配置php-5.4.45 的php54-fpm 开机自动启动
# chkconfig --add php54-fpm
# chkconfig php54-fpm on

㈦ php多线程

以下都是转载, 简单说下, php是不支持多线程的。。。。

PHP语言本身是不支持多线程的. 总结了一下网上关于PHP模拟多线程的方法, 总的来说, 都是利用了PHP的好伙伴们本身所具有的多线程能力. PHP的好伙伴指的就是LINUX和APACHE啦, LAMP嘛.

另外, 既然是模拟的, 就不是真正的多线程. 其实只是多进程. 进程和线程是两个不同的概念. 好了, 以下方法都是从网上找来的.

1. 利用LINUX操作系统

<?php
for ($i=0;$i<10;$i++) {
echo $i;
sleep(5);
}
?>

上面存成test.php, 然后写一段SHELL代码

#!/bin/bash
for i in 1 2 3 4 5 6 7 8 9 10
do
php -q test.php &
done

2. 利用fork子进程(其实同样是利用LINUX操作系统)

<?php
declare(ticks=1);
$bWaitFlag = FALSE; /// 是否等待进程结束
$intNum = 10; /// 进程总数
$pids = array(); /// 进程PID数组
echo ("Startn");
for($i = 0; $i < $intNum; $i++) {
$pids[$i] = pcntl_fork();/// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息
if(!$pids[$i]) {
// 子进程进程代码段_Start
$str="";
sleep(5+$i);
for ($j=0;$j<$i;$j++) {$str.="*";}
echo "$i -> " . time() . " $str n";
exit();
// 子进程进程代码段_End
}
}
if ($bWaitFlag)
{
for($i = 0; $i < $intNum; $i++) {
pcntl_waitpid($pids[$i], $status, WUNTRACED);
echo "wait $i -> " . time() . "n";
}
}
echo ("Endn");
?>

3. 利用WEB SERVER, PHP不支持多线程, APACHE可是支持的, 呵呵.

假设我们现在运行的是a.php这个文档. 但是我在程式中又请求WEB服务器运行另一个b.php

那么这两个文档将是同时执行的.

<?php
function runThread()
{
$fp = fsockopen('localhost', 80, $errno, $errmsg);
fputs($fp, "GET /a.php?act=brnrn");
fclose($fp);
}
function a()
{
$fp = fopen('result_a.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
function b()
{
$fp = fopen('result_b.log', 'w');
fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
fclose($fp);
}
if(!isset($_GET['act'])) $_GET['act'] = 'a';
if($_GET['act'] == 'a')
{
runThread();
a();
}
else if($_GET['act'] == 'b') b();
?>

当然啦,也可以把需要多线程处理的部分交给JAVA去处理, 然后在PHP里调用, 哈哈.

<?php
system('java multiThread.java');
?>

㈧ php常用扩展有哪些

php基本使用到的扩展有如下:

bcmath(精确数值处理)

bz2

calendar

Core

ctype

curl

date

dom

ereg

exif

fileinfo

filter

ftp

gettext

hash

iconv

igbinaryinotify 文件监控

json

libxml

mbstring

mhash

mysql

mysqli

mysqlnd

openssl

pcntl

pcre

PDO

pdo_mysql

pdo_sqlite

Phar

posix

readline

redis Redis缓存

Reflection

session

shmop

SimpleXML

sockets

SPL

sqlite3

standard

sysvmsg

sysvsem

sysvshmswoole 通信引擎

tokenizer

wddx

xml

xmlreader

xmlwriter

xslyaf YAF框架必须

zip

zlib

其中最常用的扩展有:curl date json mysql mysqli openssl pdo_mysql redis session zip等

查看当前php安装了哪些扩展,可以使用命令:php -m

㈨ PHP + Mysql多个表并行查询如何实现

在PHP-FPM处理HTTP请求时,有时会遇到一个请求需要进行多次MySQL查询(在报表类应用中比较常见)。通常我们会以串行方式查询:

$link=newmysqli();
$rs1=$link->query('SELECT*FROMtable1');
while($row=$rs1->fetch_row()){...}
$rs2=$link->query('SELECT*FROMtable2');
while($row=$rs2->fetch_row()){...}
$rs3=$link->query('SELECT*FROMtable3');
while($row=$rs3->fetch_row()){...}

串行查询方式有个缺点:在MySQL返回数据之前,PHP一直是处于空等的状态,不会继续往后执行。如果数据量大或者查询复杂,MySQL响应可能会比较慢,那么以串行方式查询会有一些延迟。给用户最直接的感受就是 Loading… 的圈圈一直打转。

那么有什么办法可以减少查询MySQL的时间?用多进程并行查询不行,因为PHP-FPM 中不允许用 pcntl_fork 一类的调用。

幸好还有 mysqlnd,mysqlnd提供了类似 stream_select 的机制(见 这篇文章) ,可以做到在单进程中对MySQL并行查询。这主要运用了mysqli_poll 和 reap_async_query 两个函数。

还是通过例子来介绍MySQL并行查询的实施方法。假设要并行地向MySQL发出10个查询,最基本的代码应该是这样的:

1.$links=[];
2.for($i=0;$i!==10;$i++){
3.$links[$i]=newmysqli('127.0.0.1','user','password','db1');
4.$links[$i]->query('SELECTSLEEP(1)',MYSQLI_ASYNC);
5.}
6.$allResult=[];
7.while(!empty($links)){
8.$reads=$links;
9.$errors=$reject=[];
10.if(!mysqli_poll($reads,$errors,$reject,null)){
11.continue;
12.}
13.foreach($readsas$read){
14.$idx=array_search($read,$links,true);
15.$allResult[$idx]=[];
16.$result=$read->reap_async_query();
17.while($row=$result->fetch_row()){
18.$allResult[$idx][]=$row;
19.}
20.$read->close();
21.unset($links[$idx]);
22.}
23.}

解释下这段代码的含义:

2~5行,同时发起10个MySQL连接,并发出查询

注意query() 的第二个参数带上了 MYSQLI_ASYNC 表示非阻塞查询

10行,使用mysqli_poll 轮询10个连接的查询有无返回

mysqli_poll 的第一个参数$reads是个数组,包含需要轮询那些连接。mysqli_poll 执行完后,会改写$reads,改写后$reads包含的是那些已经有数据返回连接。

mysqli_poll的第四个参数,控制的是轮询的等待时间,单位是“秒”。如果像本例当中设置为null,那么mysqli_poll轮询是阻塞的:只有监听的连接中,任意一个连接有数据返回了,mysqli_poll才会返回。如果等待时间设置为0,那么每次执行mysqli_poll会立即返回,外层的while会频繁循环。

第11~19行,遍历已经有数据返回的连接

reap_async_query和普通query一样,返回的是mysqli_result,可以一行行fetch数据

20~21行,对于已经获得了数据的连接,下次mysqli_poll就不需要再轮询这个连接了,所以关闭连接,并从$links数组删除这个连接

当所有的连接都返回了数据,$links数组空了,while循环也就终止了。

使用并行查询的方式,可以大大缩短处理HTTP请求的时间,假设本例中的10个SQL查询,每个需要执行1秒。因为是并行,处理所有的查询,也只需要1秒左右。

阅读全文

与php7pcntl扩展相关的资料

热点内容
最新民生通讯app从哪里下载 浏览:378
如何在发短信时给自己手机号加密 浏览:773
扩展单片机ram寻址方式是什么 浏览:318
phpide是什么 浏览:752
单片机相关软件 浏览:818
eclipse如何编译c11 浏览:286
加密游戏app 浏览:73
vs2010编译嵌套太深 浏览:980
程序员面试注意事项 浏览:740
scratch编译为h5 浏览:208
威联通套件编译 浏览:231
清刻pdf 浏览:982
可编程延时发生器 浏览:93
滨州用服务器织梦要怎么上传文件 浏览:866
java7与java8 浏览:958
真空压缩袋什么材质好 浏览:935
excel批量见建文件夹 浏览:557
黑马程序员就业班笔记 浏览:370
单片机供电自锁电路设计 浏览:56
pythongui测试工具 浏览:835