centos php安装pcntl扩展 进程控制

libevent扩展

https://www.cnblogs.com/sailrancho/p/3835940.html

http://re2c.org/install/install.html

http://pecl.php.net/package/libevent

PHP 使用pcntl和libevent 实现Timer功能

https://www.jb51.net/article/42447.htm

pcntl扩展不能在windows环境安装

* 查看当前php版本

$ /opt/lampp/bin/php --version

PHP 7.2.8 (cli) (built: Jul 26 2018 15:17:41) ( NTS )
Copyright (c) 1997-2018 The PHP Group

Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

https://pan.baidu.com/s/1eo-EgtQAeKWu-UPCULFhUw


* 下载一个同样版本的php

https://pan.baidu.com/s/1gHcmukHSJvQMqTankGvG-A

wget http://cn2.php.net/distributions/php-7.2.8.tar.bz2

* 解压php:

tar xvjf php-7.2.8.tar.bz2 -C .

* phpize

注意如果安装了多个版本的php 用哪个phpize

cd php-7.2.8/ext/pcntl
/opt/lampp/bin/phpize-7.2.8

* php-config

注意php-config版本

./configure  --with-php-config=/opt/lampp/bin/php-config-7.2.8

* make && make install

make
sudo make install

Installing shared extensions:     /opt/lampp/lib/php/extensions/no-debug-non-zts-20170718/
 

* php.ini 添加扩展

extension="pcntl.so"

或者写 extension="/opt/lampp/lib/php/extensions/no-debug-non-zts-20170718/pcntl.so"

* 重启xampp服务

$ sudo /opt/lampp/lampp restart

Restarting XAMPP for Linux 7.2.8-0...
XAMPP: Stopping Apache...ok.
XAMPP: Stopping MySQL...ok.
XAMPP: Stopping ProFTPD...ok.
XAMPP: Starting Apache...ok.
XAMPP: Starting MySQL...ok.
XAMPP: Starting ProFTPD...ok.

如果服务启动失败 比如80端口被nginx占用, 443 https 端口可能也被占用

$ grep -rn "80" /opt/lampp/lampp

修改106行 端口号为8086

106:    if testport 8086

修改113行443为1443

113:    if test $ssl -eq 1 && testport 1443

** 同时修改httpd.conf

/opt/lampp/etc/httpd.conf

Listen 80 改为  Listen 8086

ServerName localhost 改为 ServerName localhost:8086

** 再修改 https的配置   httpd-ssl.conf

/opt/lampp/etc/extra/httpd-ssl.conf

Listen 443 改为 Listen 1443

* 查看phpinfo(),是否有pcntl扩展;

http://172.16.0.224:8086/dashboard/phpinfo.php

$ /opt/lampp/bin/php -m | grep pcntl

PHP Warning:  Module 'pcntl' already loaded in Unknown on line 0
Warning: Module 'pcntl' already loaded in Unknown on line 0
pcntl
 

* 创建一个多进程的代码测试

cd ~/test/pcntl
emacs index.php

index.php

<?php
header('Content-Type: text/html; charset=UTF-8');

// 必须加载扩展                                                                                                                                           
if (!function_exists("pcntl_fork")) {
    die("pcntl extention is must !");
}

pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。                                                           

$pid_dir = __dir__."/pid_files";
if (!file_exists($pid_dir)) {
    mkdir($pid_dir, 0755, true);
}

for ($i = 0; $i < 3; $i++) {
    $pid = pcntl_fork(); //创建子进程                                                                                                                     

    if($pid == -1) {
        //错误处理:创建子进程失败时返回-1.                                                                                                               
        var_dump("fork failed");
    }
    if ($pid === 0) {
        // child                                                                                                                                          
        $pid = posix_getpid();
        $ppid = posix_getppid();
        $r = rand(0,100);  //随机数                                                                                                                       
        touch("$pid_dir/fork_child_process_{$i}_{$ppid}_{$pid}_{$r}");
        exit;
    } else {
        // parent                                                                                                                                         
        // 如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:                                                  
        pcntl_wait($status, WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。                                                                          
    }
}
$pid = posix_getpid();
$ppid = posix_getppid();
$r = rand(0,100); //随机数                                                                                                                                
touch("$pid_dir/fork_process_pid_{$ppid}_{$pid}_$r");

启动web服务测试:

$ /opt/lampp/bin/php -S 0.0.0.0:8088

[Fri Sep 21 08:00:54 2018] PHP Warning:  Module 'pcntl' already loaded in Unknown on line 0
<br />
<b>Warning</b>:  Module 'pcntl' already loaded in <b>Unknown</b> on line <b>0</b><br />
PHP 7.2.8 Development Server started at Fri Sep 21 08:00:54 2018
Listening on http://0.0.0.0:8088
Document root is /home/ubuntu/test/pcntl
Press Ctrl-C to quit

浏览器访问 http://172.16.0.224:8088/

* pcntl 重复加载

[Fri Sep 21 08:00:54 2018] PHP Warning:  Module 'pcntl' already loaded in Unknown on line 0

去掉php.ini中的

;; extension="pcntl.so"

;; extension="/opt/lampp/lib/php/extensions/no-debug-non-zts-20170718/pcntl.so"

重启服务

/opt/lampp/lampp restart

* 再创建一个测试文件 输出log

composer require monolog/monolog 

index.php

<?php
// composer require monolog/monolog
include './vendor/autoload.php';

use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$log = new Logger('easy_tech');
$log->pushHandler( new StreamHandler(__DIR__.'/log/my.log', Logger::DEBUG) );

// 必须加载扩展
if (!function_exists("pcntl_fork")) {
    die("pcntl extention is must !\n");
}

$logdir = __DIR__.'/log';
if (! file_exists($logdir)) {
    mkdir($logdir, 0755, true);
}

// 如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。
pcntl_signal(SIGCHLD, SIG_IGN);

for ($i = 0; $i < 3; $i++) {
    $pid = pcntl_fork(); //创建子进程

    if($pid == -1) {
        //错误处理:创建子进程失败时返回-1.
        $log->error("fork failed");
    }
    
    if ($pid === 0) {
        // child
        $pid = posix_getpid();
        $ppid = posix_getppid();
        $r = rand(0, 100);  //随机数
        $log->debug("${ppid} forked child process {$pid} [{$r}]");
        exit;
    } else {
        // parent
        pcntl_wait($status, WNOHANG);
        $log->debug("parent process waiting...");
    }
}

$pid = posix_getpid();
$ppid = posix_getppid();

$r = rand(0,100); //随机数
$log->debug("{$ppid} fork process pid={$pid} rand=${r}");

/opt/lampp/bin/php index.php

$ cat ./log/my.log 
[2018-09-21 10:37:25] easy_tech.DEBUG: parent process waiting... [] []
[2018-09-21 10:37:25] easy_tech.DEBUG: parent process waiting... [] []
[2018-09-21 10:37:25] easy_tech.DEBUG: parent process waiting... [] []
[2018-09-21 10:37:25] easy_tech.DEBUG: 1725 fork process pid=6345 rand=23 [] []
[2018-09-21 10:37:25] easy_tech.DEBUG: 6345 forked child process 6346 [89] [] []
[2018-09-21 10:37:25] easy_tech.DEBUG: 6345 forked child process 6347 [63] [] []
[2018-09-21 10:37:25] easy_tech.DEBUG: 6345 forked child process 6348 [77] [] []
 

猜你喜欢

转载自blog.csdn.net/fareast_mzh/article/details/82801596