linux下composer小记:Do not run Composer as root/super user!以及php利用PCNTL库进行多进程脚本的开发-多进程消化队列程序逻辑

一、linux下composer小记:Do not run Composer as root/super user!

    之前在测试一段PHP程序时,总是报找不到PHP类文件,当前因为需要着急解决问题,就把文件直接引入从而解决了问题,今天看了一下,因为文件里面加载了vendor,而vendor目录下面在autoload_real.php引入的其它文件autoload_classmap.php,autoload_namespaces.php,autoload_psr4.php这些文件里都有绝对路径(因为是composer生成的),导致的加载不上。于是要解决就必须重新composer,以更新路径。centos下安装composer,注(我这里也对比发现了程序里用的是老一代的vendor,新一代的vendor都的路径$vendorDir和$baseDir都是通过绝对目录得来的,这样路径变更就不会同时涉及修改几个文件内容) publish:November 26, 2018 -Monday。

[root@123 download]# curl -sS https://getcomposer.org/installer | php
All settings correct for using Composer
Downloading...
Composer (version 1.7.3) successfully installed to: /opt/download/composer.phar
Use it: php composer.phar
[root@123 download]# mv composer.phar /usr/local/bin/composer
[root@123 download]# composer -V
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Composer version 1.7.3 2018-11-01 10:05:06

     从上面可以看到,安装很简单,基本就是下载一个文件,然后执行命令就看到结果了。但有一个提示:Do not run Composer as root/super user! See https://getcomposer.org/root for details,意思是不要在root超级用户下执行,所以就更换一个用户吧,如下,就不会报这个提示了:

[root@123 download]# useradd kermit
[root@123 download]# passwd kermit
Changing password for user kermit.
New password: 
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password: 
passwd: all authentication tokens updated successfully.
[root@123 download]# su kermit
[kermit@123 download]$ 
[kermit@123 download]$ composer -V
Composer version 1.7.3 2018-11-01 10:05:06
#进入目录招待composer install安装即可
[root@123 queue]# composer install
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 0 installs, 1 update, 0 removals
  - Updating phpmailer/phpmailer dev-master (3ea8425 => 028acee):     The package has modified files:
    M docs/generatedocs.sh
    M language/phpmailer.lang-am.php
    M test/fakepopserver.sh
    M test/fakesendmail.sh
    M test/runfakepopserver.sh.....
    Discard changes [y,n,v,d,s,?]? y
 Checking out 028aceea3d
Writing lock file
Generating autoload file
#然后看一下composer下的主要涉及路径的文件已经更新:
[root@123 queue]# ll vendor/composer
total 44
-rw-r--r-- 1 root root   147 Nov 26 10:32 autoload_classmap.php
-rw-r--r-- 1 root root   222 Nov 26 10:32 autoload_namespaces.php
-rw-r--r-- 1 root root   280 Nov 26 10:32 autoload_psr4.php
-rw-r--r-- 1 root root  1762 Nov 26 10:32 autoload_real.php
-rw-r--r-- 1 root root  1480 Nov 26 10:32 autoload_static.php
-rw-r--r-- 1 root root 13459 Nov 26 10:32 ClassLoader.php
-rw-r--r-- 1 root root  3750 Nov 26 10:32 installed.json
-rw-r--r-- 1 root root  1070 Nov 26 10:32 LICENSE

     composer下的主要涉及路径的文件已经更新,再执行代码就能正常加载类文件了。上述中Discard changes [y,n,v,d,s,?]? 表示是否放弃已经做过的一些修改,这里要注意,如果你composer里的代码有些重要的地方经过了自己修改处理,这里就需要填写N了,我这里没有什么重要的东西,估计也就是查看代码时不小心导致了一些文件的小变更,所以就放弃更改。
对于我这里碰到的问题,可能还有一个更好的解决办法,这是一开始我没有想到的,composer有一个config命令,这个可以配置很多选项,其中有涉及目录的两项,[vendor-dir]和[bin-dir],把这两个目录进行更改后,composer里的所有和目录有关的代码应该就会自动更改,当然这个我也没有尝试。应该是可以的。

二、php利用PCNTL库进行多进程脚本的开发-多进程消化队列程序逻辑

        php多进程开发不适合于WEB开发,主要是用于的任务处理,比如对前端提交的数据进行入库或者计算等,php多进程模块依赖php中的pcntl扩展,此扩展在Windows平台上是不可用的。我这里今天只用一个很简单的例子 publish:November 26, 2018 -Monday。

        功能:使用php启动两个单独进程向redis写入数据,每个进程写10条数据然后关闭此进程,重新启一个进程再进行写。新建一个test.php文件,代码及解释如下:

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

//初始化一些参数
$worker_pids = array();
$running = true;
posix_setsid();
declare(ticks=1);

//记录循环
$cirle=0;
while($running){

    //只启动两个进程 
    if(count($worker_pids) == 2) {
        $child_id = pcntl_wait($status);
        if($child_id > 0) {
            unset($worker_pids[$child_id]);
        }
    }

    $cirle++;
    $pid = pcntl_fork();
    //子进程创建失败
    if($pid == -1) {
        exit("无法产生子进程!");

    //成功创建子进程
    } else if($pid) {
        $worker_pids[$pid] = $pid;

    // 子进程逻辑
    } else {
        $test = new stdClass();
        $test->num=0;
        while($running && $test->num<5)
        {
            $redis = new Redis();
            $redis->connect('192.168.90.123',6380);
            $ppid = posix_getpid();
            $redis->set('key_'.time(),$cirle.'__'.$ppid);
            $test->num++;
            echo $cirle.'__'.$ppid."\n";
            print_r($worker_pids);
            sleep(2);
        }
        //退出进程
        exit();
    }
}

        使用php执行以上文件,redis中的数据插入截图如下,从图中可以看到11022和11023在插入5条redis数据之后就exit,然后就生成11026和11027进程来插入数据。cirle的值也由1,2变成了3,4.

        下图是在执行php的时候,可以查看到php的相关进程。见框里的进程ID值:

        这里只是做为一个实验来实现php多进程的目的,用到的函数也不多,主要有posix_setsid,pcntl_wait,和pcntl_fork,php里是使用posix_setsid()来在这个子进程中创建会话,使得这个进程成为会话组组长,从而脱离启动的进程。在上面执行命令的时候如果带上&进入后台执行的话,关闭窗口命令依然会执行,效果就像和nohup一样,实际就是php在内部脱离了启动进程自己启动了单独的管理进程以及业务进程。pcntl_fork即是用来创建子进程的,而pcntl_wait($status,WUNTRACED);则是用来等待子进程的信号。

        这个功能在数据采集、邮件群发、数据源更新、消化队列等业务中很常用,可以应对大规模的消化队列场景,那样就不是这么简单,需要进行异常管理、信号处理函数、及进程控制(特别是僵尸进程的处理)及扩展考虑等。

#. 文章评论转载:

Level : 1.    User:us20200417141907-233    Time:2020-04-17 14:56:09
不错学习了。

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林戈的IT生涯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值