首页 > 编程技术 > php

PHP Libevent扩展安装配置及简单应用

发布时间:2016-11-25 15:27

Libevent 是一个用C语言编写的、轻量级的开源高性能网络库,主要有以下几个亮点:事件驱动( event-driven),高性能;轻量级,专注于网络,下文我们就一起来看PHP Libevent扩展安装配置及简单应用的例子。


libevent是一个基于事件驱动的高性能网络库。支持多种 I/O 多路复用技术, epoll、 poll、 dev/poll、 select 和 kqueue 等;支持 I/O,定时器和信号等事件;注册事件优先级。
PHP libevent扩展安装:
libevent扩展依赖于原始的libevent库,必须先把libevent库安装。
(1)安装libevent库
wget http://cloud.github.com/downloads/libevent/libevent/libevent-2.0.20-stable.tar.gz
tar zxvf libevent-2.0.20-stable.tar.gz
cd libevent-2.0.20-stable/
./configure --prefix=/usr/local/libevent-2.0.20/
make
make install

(2)安装libevent扩展(http://pecl.php.net/package/libevent)
wget http://pecl.php.net/get/libevent-0.1.0.tgz
tar -zxvf libevent-0.1.0.tgz
cd libevent-0.1.0
./configure --with-php-config=/usr/local/php54/bin/php-config --with-libevent=/usr/local/libevent-2.0.20/
make && make install
#php.ini添加extension=libevent.so

PHP Libevent扩展介绍:
(1)常量
libevent1.png
(2)函数
event_base_free() 释放资源,这不能销毁绑定事件
event_base_loop() 处理事件,根据指定的base来处理事件循环
event_base_loopbreak() 立即取消事件循环,行为各break语句相同
event_base_loopexit() 在指定的时间后退出循环
event_base_new() 创建并且初始事件
event_base_priority_init() 设定事件的优先级
event_base_set() 关联事件到事件base
event_buffer_base_set() 关联缓存的事件到event_base
event_buffer_disable() 禁用一个缓存的事件
event_buffer_enable() 启用一个指定的缓存的事件
event_buffer_fd_set() 改变一个缓存的文件系统描述
event_buffer_free() 释放缓存事件
event_buffer_new() 建立一个新的缓存事件
event_buffer_priority_set() 缓存事件的优先级设定
event_buffer_read() 读取缓存事件中的数据
event_buffer_set_callback() 给缓存的事件设置或重置回调hansh函数
event_buffer_timeout_set() 给一个缓存的事件设定超时的读写时间
event_buffer_watermark_set 设置读写事件的水印标记
event_buffer_write() 向缓存事件中写入数据
event_add() 向指定的设置中添加一个执行事件
event_del() 从设置的事件中移除事件
event_free() 清空事件句柄
event_new() 创建一个新的事件
event_set() 准备想要在event_add中添加事件

PHP Libevent扩展使用:
例1:5s后触发callback
$base = event_base_new();
$event = event_new();
 
event_set($event, 0, EV_TIMEOUT, function() {
    echo "function called";
});
event_base_set($event, $base);
 
event_add($event, 5000000);
event_base_loop($base);

例2:打印输入流
function print_line($fd, $events, $arg)
{
    static $max_requests = 0;
    $max_requests++;
    if ($max_requests == 10) {
        // exit loop after 10 writes
        event_base_loopexit($arg[1]);
    }
    echo  fgets($fd);
}
 
// create base and event
$base = event_base_new();
$event = event_new();
 
$fd = STDIN;
// set event flags
event_set($event, $fd, EV_READ | EV_PERSIST, 'print_line', array($event, $base));
// set event base
event_base_set($event, $base);
// enable event
event_add($event);
// start event loop
event_base_loop($base);

例3:实现简单web server
在cli执行后,打开浏览器2000端口试试看。
$socket = stream_socket_server ('tcp://0.0.0.0:2000', $errno, $errstr);
stream_set_blocking($socket, 0);
 
$base = event_base_new();
$event = event_new();
event_set($event, $socket, EV_READ | EV_PERSIST, 'ev_accept', $base);
event_base_set($event, $base);
event_add($event);
event_base_loop($base);
 
function ev_accept($socket, $flag, $base)
{
    $connection = stream_socket_accept($socket);
    stream_set_blocking($connection, 0);
 
    $buffer = event_buffer_new($connection, 'ev_read', NULL, 'ev_error',  $connection);
    event_buffer_base_set($buffer, $base);
    event_buffer_timeout_set($buffer, 30, 30);
    event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);
    event_buffer_priority_set($buffer, 10);
    event_buffer_enable($buffer, EV_READ | EV_PERSIST);
 
    $GLOBALS['_'] = $buffer;  //这个buffer一定要赋给个全局的变量 貌似是传值过程中的bug 或者5.3.8的闭包还是有问题?
}
 
function ev_error($buffer, $error, $connection)
{
    event_buffer_disable($buffer, EV_READ | EV_WRITE);
    event_buffer_free($buffer);
    fclose($connection);
}
 
function ev_read($buffer, $connection)
{
    while ($read = event_buffer_read($buffer, 256)) {
 
    }
    fwrite($connection , date('Y-m-d H:i:s'));
    ev_error($buffer , '' , $connection);
}

我们一起来看一个PHP CLI模式下PCNTL扩展实现多进程服务的例子,有面要了解这个问题的朋友可以和小编一起来看看。


PHP可通过PCNTL扩展实现进程控制,如进程创建,信号处理,进程中断判断等。但只能在CLI模式下操作。
PCNTL的信号机制是基于 ticks 机制实现的。因此在使用信号相关函数时需要在前面添加declare(ticks = n) 语法结构。
pcntl_alarm ( int $seconds )指定秒数后向进程发送一个 SIGALRM 信号
pcntl_signal ( int $signo , callback $handler [, bool $restart_syscalls ])给指定信号$signo设置回调函数
declare(ticks = 1);
 
function signal_handler($signal) {
    print "Caught SIGALRM\n";
    pcntl_alarm(3);
}
 
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(3);
 
for(;;) {
}

pcntl_exec ( string $path [, array $args [, array $envs ]] )执行指定命令,执行完即结束,后面将不会执行
$dir = '/root/';
$cmd = 'ls';
$option = '-l';
$pathtobin = '/bin/ls';
 
$arg = array($cmd, $option, $dir);
pcntl_exec($pathtobin, $arg);
 
echo 'will not exec here';

pcntl_fork ( void )为当前进程fork子进程
此时,父进程执行过程中,得到的fork返回值为子进程号(>0),失败时,在 父进程上下文返回-1,不会创建子进程,并且会引发一个PHP错误;
父进程的阻塞同时会阻塞子进程。但是父进程的结束不影响子进程的运行;
子进程会从执行pcntl_fork()的那条语句开始执行(包括此函数),但是此时它返回的是零(代表这是一个子进程)。在子进程的代码块中最好有exit语句,即执行完子进程后立即就结束。
int pcntl_wait ( int &$status [, int $options = 0 ] ) 等待或返回fork的子进程状态
说明子进程调用结束后,并没有完全销毁,而是变成了僵尸进程,不占内存,仅存在进程列表。此时需要调用父进程调用wait来等待子进程结束。如果父进程在子进程前退出了,那么init进程将会对僵尸进程进行管理,它还是可以被清除的。第二个参数可设置阻塞方式:
1. WUNTRACED 阻塞方式调用的,函数返回值为子进程的pid,如果没有子进程返回值为-1;
2. WNOHANG 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回0。
$pid  =  pcntl_fork ();
//父进程和子进程都会执行下面代码
if ( $pid  == -1 ) {
    //错误处理:创建子进程失败时返回-1.
    die( 'could not fork' );
} else if ( $pid ) {
    //父进程会得到子进程号,所以这里是父进程执行的逻辑
    pcntl_wait ($status, WUNTRACED);  //等待子进程中断,防止子进程成为僵尸进程。
    echo "ok".PHP_EOL;
} else if ($pid == 0){
    //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
    echo "子进程运行" . getmypid() .PHP_EOL;
    sleep(5);
    exit;
}
 
echo "父进程运行" . getmypid() .PHP_EOL;

php扩展有许多了而xcache配置只是php扩展中的一个比较常用的扩展了,下面我们就一起来看看php扩展xcache安装步骤吧,希望下文能够为各位带来帮助。

1、安装xcache扩展


tar -xvf xcache-3.2.0.tar.gz
 cd xcache-3.2.0
 ./configure --with-php-config=/usr/local/php/bin/php-config  --enable-xcache
 make && make install

会生成类似如下信息

[root@master xcache-3.2.0]# make install
<span style="line-height: 1.714285714;">Installing shared extensions:     /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/</span>

2、编辑php配置文件


vim /usr/local/php/etc/php.ini
 extension = /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/xcache.so

重启新加载php配置

service php-fpm reload

 

4、编辑XCache Cacher的配置文件


上只是企业的Xcach的功能,而XCache的具体配置需要另外定义,在安装包目录下有个”xcache.ini
可以根据该文件的内容在php.ini中添加如下内容


xcache.shm_scheme = "mmap"
xcache.size = 60M
xcache.count = 1
xcache.slots = 8K
xcache.ttl = 0
xcache.gc_interval = 0
xcache.var_size = 4M
xcache.var_count = 1
xcache.var_slots = 8K
xcache.var_ttl = 0
xcache.var_maxttl = 0
xcache.var_gc_interval = 300

本文我们来讲讲 PHP_CodeSniffer 的介绍、Centos下安装、检查代码、卸载及使用实例,是一篇非常不错的教程,不可错过。

1.简介

PHP_CodeSniffer是PEAR中的一个用PHP5写的用来检查和嗅探PHP代码是否有违反一组预先设置好的编码标准的一个包,它是确保你的代码简洁一致的必不可少的开发工具,甚至还可以帮助程序员减少一些语义错误。

PHP_CodeSniffer中的编码标准是一组嗅探文件的集合,每一个嗅探文件只检查一部分编码标准。一次安装即可实现多个不同项目的编码标准的检查。PHP_CodeSniffer使用的默认的编码标准是 PEAR编码标准。

2.安装

快速安装(需要先安装php和pear)

pear install PHP_CodeSniffer

使用sublime text的同学可以直接安装插件phpcs,安装方法(Ctrl+Shift+P->pi(package install)->phpcs,安装成功后右键即可看到PHP Code Sniffer选项)
Pyrus安装

php pyrus.phar install pear/PHP_CodeSniffer

3.查看安装

[root@vb002 ~]# /usr/local/php/bin/phpcs -i
The installed coding standards are PSR1, Squiz, PHPCS, MySource, PEAR, Zend and PSR2


4.检查代码

[root@vb002 ~]# /usr/local/php/bin/phpcs /root/.jenkins/jobs/zentaotest/workspace/src/Money.php

FILE: /root/.jenkins/jobs/zentaotest/workspace/src/Money.php
----------------------------------------------------------------------
FOUND 6 ERRORS AFFECTING 6 LINES
----------------------------------------------------------------------
  2 | ERROR | Missing file doc comment
  3 | ERROR | Missing class doc comment
  5 | ERROR | Private member variable "amount" must be prefixed with
    |       | an underscore
  7 | ERROR | Missing function doc comment
 12 | ERROR | Missing function doc comment
 17 | ERROR | Missing function doc comment
----------------------------------------------------------------------

Time: 29ms; Memory: 3Mb


5.卸载安装

[root@vb002 ~]# pear uninstall PHP_CodeSniffer-2.3.3


6.使用示例

想要检查某个文件是否符合PEAR编码标准, 只需要指定文件的路径即可:

使用PHP_CodeSniffer检查文件

$ phpcs /path/to/code/myfile.php

FILE: /path/to/code/myfile.php

--------------------------------------------------------------------------------

FOUND 5 ERROR(S) AFFECTING 2 LINE(S)

--------------------------------------------------------------------------------

2 | ERROR | Missing file doc comment

20 | ERROR | PHP keywords must be lowercase; expected "false" but found "FALSE"

47 | ERROR | Line not indented correctly; expected 4 spaces but found 1

51 | ERROR | Missing function doc comment

88 | ERROR | Line not indented correctly; expected 9 spaces but found 6

--------------------------------------------------------------------------------

或者,如果你想要检查整个目录,你可以指定目录路径而不是文件路径:

使用PHP_CodeSniffer检查目录

$ phpcs /path/to/code

FILE: /path/to/code/myfile.php

--------------------------------------------------------------------------------

FOUND 5 ERROR(S) AFFECTING 5 LINE(S)

--------------------------------------------------------------------------------

2 | ERROR | Missing file doc comment

20 | ERROR | PHP keywords must be lowercase; expected "false" but found "FALSE"

47 | ERROR | Line not indented correctly; expected 4 spaces but found 1

51 | ERROR | Missing function doc comment

88 | ERROR | Line not indented correctly; expected 9 spaces but found 6

--------------------------------------------------------------------------------

FILE: /path/to/code/yourfile.php

--------------------------------------------------------------------------------

FOUND 1 ERROR(S) AND 1 WARNING(S) AFFECTING 1 LINE(S)

--------------------------------------------------------------------------------

21 | ERROR   | PHP keywords must be lowercase; expected "false" but found

|         | "FALSE"

21 | WARNING | Equals sign not aligned with surrounding assignments

--------------------------------------------------------------------------------

本文我们告诉你一个在mac系统下,最快速度安装php的方法,不过前提是要安装Homebrew,我们也把安装Homebrew步骤一起讲进来。

先安装Homebrew

获取 Homebrew

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

打开终端窗口, 粘贴以上脚本。

脚本会解释它的作用,然后在您的确认下执行安装。高级安装选项请看 这里(需要10.5)。



What Does Homebrew Do?

又提示缺少套件啦?别担心,Homebrew 随时守候。

$ brew install wget

Homebrew 会将套件安装到独立目录,并将文件软链接至 /usr/local 。

$ cd /usr/local
$ find Cellar
Cellar/wget/1.16.1
Cellar/wget/1.16.1/bin/wget
Cellar/wget/1.16.1/share/man/man1/wget.1

$ ls -l bin
bin/wget -> ../Cellar/wget/1.16.1/bin/wget

Homebrew 的所有文件均会被安装到预定义目录下,所以您无需担心 Homebrew 的安装位置。

轻松创建您的 Homebrew 程式。

$ brew create https://foo.com/bar-1.0.tgz
Created /usr/local/Library/Formula/bar.rb

以 git、 ruby 为其筋骨,所以借助您的相关知识,自由修改,并且可以简单撤回您的调改或者合并上游更新。

$ brew edit wget # 使用 $EDITOR 编辑!

Homebrew 的程式都是简单的 Ruby 脚本:

class Wget < Formula
  homepage "https://www.gnu.org/software/wget/"
  url "https://ftp.gnu.org/gnu/wget/wget-1.15.tar.gz"
  sha256 "52126be8cf1bddd7536886e74c053ad7d0ed2aa89b4b630f76785bac21695fcd"

  def install
    system "./configure", "--prefix=#{prefix}"
    system "make", "install"
  end
end

Homebrew 使 OS X 更完美。使用 gem 来安装 gems、用 brew 来搞定那些依赖包。


正式安装php

# 添加源
brew tap josegonzalez/homebrew-php

# 一键安装php各个版本
brew install php54 php54-mcrypt
brew install php55 php55-xdebug
brew install php56

标签:[!--infotagslink--]

您可能感兴趣的文章: