一、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
不错学习了。