首页 > 技术分享 > 原生PHP
收藏

一文熟练掌握Composer用法及常见问题

10/11 15:27
大潇博客 原创文章,转载请标明出处

初识Composer

现代高级编程语言,依赖管理工具是必不可少的。Java有Maven,Python有pip,Nodejs有npm,而在Composer出现之前,PHP只有被广为诟病的Pear。由于Pear实在太难用,很少PHP开发者用到这个工具,以致于PHP的开发生态很糟糕,连一个像样的依赖管理工具都没有,让PHP这门占据了web网站开发主流市场的语言很尴尬。开发过程中,要用到第三方的类库,需要去下载zip包,然后解压,放到相应的目录,处理好命名空间,自动加载的问题,如果这个第三方包还有其他依赖项,还要再次重复这个流程,看着隔壁家python和node.js一个命令行就搞定,显得php开发人员的操作既原始又滑稽。


所幸,金光闪闪的Composer驾着七彩祥云来了,PHP终于有了真正意义的依赖管理工具。可以说,Composer是现代PHP的基石。


Composer解决了项目的依赖关系,且实现了自动加载。开发人员只需要几个命令行,就能获取其他开发者的包,PHP开发工作因此变得如同堆积木,可以根据业务的需求,快速方便地拆解组合代码。


奇怪的是,即使Compoer已经诞生好些年了,而且所有主流框架都支持Composer,可竟然还有不少PHP开发者不用这个工具。甚至还有人觉得Composer加大了PHP的学习难度。


持有这种想法的人,就好像是一辈子都用纸笔手工记账,有朝一日,给他配置了电脑,跟他演示了excel是如何地强大。他不为新事物的强大感到震撼惊喜,而是蹙眉不满地说:“这东西太难学了,我还是习惯用纸笔”。


对于持有这种想法的人,只能是两手一摊。心态衰老的年轻人,如果内心一直在装睡,任谁也叫不醒。但时代的步伐可不会因为谁的拉后腿而停止前进,只会把他远远甩在身后...


Composer中文文档传送门:https://docs.phpcomposer.com/

注意:任何系统安装Composer,都要保证已安装PHP并且PHP已存在于环境变量中。



Linux安装Composer

#下载安装脚本composer-setup.php到当前目录

php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"


#安装

php composer-setup.php


#把生成的composer.phar移动到/usr/local/bin目录下,使composer命令可以全局使用

mv composer.phar /usr/local/bin/composer


安装完成后,输入composer,查看Composer信息



Windows安装Composer

在Windows中,可通过官方网站:https://getcomposer.org/下载最新版本的Composer,也可使用phpstudy开发环境,其内部支持一键下载Composer。


很多朋友在windows中下载了Composer,却不会全局使用,比如打开cmd输入composer,提示:'composer' 不是内部或外部命令,也不是可运行的程序或批处理文件。这个问题的根本原因,是由于环境变量并未添加Composer。讲到这里,就要多说一句,Compoer命令追根究底,最后还是要通过PHP执行,所以可将Composer理解为PHP的一个框架。这样一来,仅在环境变量中添加Composer还不够,PHP同样需要成为windows的环境变量。在cmd中输入“php -v”,如果没有出现版本信息,那就需要先在环境变量中添加PHP,然后再添加Composer。


拿phpstudy举例,找到当前运行的php版本目录(php.exe所在的文件夹),将路径添加到环境变量中,然后把composer.phar所在的文件夹路径,也添加到环境变量中,重启电脑后生效,此后composer命令可全局使用。

如果不想全局配置,可将composer.phar复制到项目根目录下,打开cmd输入composer,也能使用。

composer_v.png

php_v.png

出现这个,表示composer可以使用了。



Composer升级

若composer版本过低,也会出现一些问题,可使用“composer self-update”升级composer

composer升级.png



Composer镜像

Composer默认的镜像地址是https://packagist.org。‌Packagist是Composer的官方组件仓库,因此默认情况下,Composer会从这个地址下载包和依赖。

默认镜像由于墙的原因,处于几乎访问不到的状态,所以可以将镜像地址更换为Composer中国镜像或阿里云Composer全量镜像。

ps:在实际开发中,经常发现Composer中国镜像缺失包和依赖,所以更推荐阿里云Composer全量镜像。


Composer中国镜像网址:https://pkg.xyz/

阿里云Composer全量镜像网址:https://developer.aliyun.com/composer


修改Composer全局镜像,两种方式:

1、打开Composer安装目录,手动将composer.json中的url改成国内镜像地址,比如:"url": "https://packagist.phpcomposer.com";

2、通过命令修改:

⑴ 全局生效:

#Composer中国镜像

composer config -g repo.packagist composer https://packagist.phpcomposer.com

#阿里云Composer全量镜像(推荐)

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

⑵ 只修改当前项目的Composer镜像地址,打开项目根目录,输入以下命令:

#Composer中国镜像

composer config repo.packagist composer https://packagist.phpcomposer.com

#阿里云Composer全量镜像(推荐)

composer config repo.packagist composer https://mirrors.aliyun.com/composer/



取消Composer配置

取消当前项目配置

composer config --unset repos.packagist

取消全局配置

composer config -g --unset repos.packagist



使用Composer

创建新项目:

composer create-project 项目名称(composer仓库必须有此包)


从无到有安装某包时,使用:

composer require 包名称

此命令可在项目中快速安装需要的包,只需包名正确即可。

若已存在composer.json和composer.lock文件,此命令会修改composer.json文件,在require中加入当前包名,并生成新的composer.lock文件。


有“composer.json”时,比如下载了某些sdk,使用“composer install”进行安装

composer install

也可以在这条命令后面,使用“&&”拼接其它命令一起执行,通常用来验证加载的包是否完整或有错误,如“composer install && php src/Sample.php”,表示安装后执行“src/Sample.php”文件。


更新所有依赖:

composer update

不要轻易的使用 composer update 更新所有的依赖, 因为它会去读取 composer.json 中依赖,拉取满足条件的最新依赖包,很容易出现问题。

当本地不存在 composer.lock 文件时, composer instal 和 composer update 作用相同, 都会去读取 composer.json 中定义的依赖, 并且去拉取符合条件的最新版本的依赖, 然后把所拉取到的依赖放入 vendor 目录下, 最后把所有拉取的依赖的精确版本号写入 composer.lock 文件

当本地存在 composer.lock 文件时, composer install 将会去读取 composer.lock 中存储的版本号, 并且以此标准去下载依赖; 而 composer update 则不会去读取 composer.lock 中的版本号, 他仍然会去读取 composer.json 中定义的依赖, 生成新的 composer.lock 文件


更新某个依赖:

composer update 包名称

此命令要求composer.json中必须包含要更新的包名与新版本号。

通过composer update也可实现安装指定的包,功能类似composer require,只不过composer update可以通过composer.json指定要安装的包的版本。


移除不再需要的包:

composer remove 包名称

运行此命令后,composer.json文件require中的依赖信息也将被移除,以后执行composer install或composer update时,均不会再有被移除包的相关操作。


查看已安装的依赖:

composer show


清理缓存:

composer clear-cache


说明:

通过“composer.json”描述文件安装时,“composer.json”中可能包含某些要求和依赖,如:

composer依赖.png

若所需依赖不存在,或与规定依赖不匹配,composer安装类库会报此类错误:... ... it does not match the constraint

遇到这种情况可以先安装依赖包,composer提示缺失哪些依赖, 根据提示操作即可。

也有说法可忽略依赖冲突,暂未尝试成功,先记在这里,也算一种可尝试的方法。



常见问题

1、输入composer的相关命令后,出现“Search for a package”后便没了下文,大概率是因为composer对参数的识别问题,打开composer.bat文件,把最后的“%1”改成“%*”。

phpStudy\tools里面的composer.bat,其中最后一个参数是%1,其实是有问题的,这样会导致只能接收一个参数,比如输入composer require topthink/think-migration,只能接收到require而接收不到topthink/think-migration,所以才会出现:Search for a package。将“%1”改成“%*”就可以接受所有的参数。

image.png

文件如图,若没有composer.bat,请按照上面图片内容自行创建,注意自己使用php的路径和版本。


2、在linux中出现:proc_open(): fork failed - Cannot allocate memory

这是因为物理内存或交换内存不足导致,官方文档故障排除页面同样提到了这个问题,并提出解决方法,传送门:https://getcomposer.org/doc/articles/troubleshooting.md#proc-open-fork-failed-errors

也可尝试通过以下命令,为swap交换分区分配空间,然后腾出物理空间。

注解:交换分区,英文的说法是swap,意思是“交换”、“实物交易”。它的功能就是在内存不够的情况下,操作系统先把内存中暂时不用的数据,存到硬盘的交换空间,腾出内存来让别的程序运行,和Windows的虚拟内存(pagefile.sys)的作用是一样的。

#dd从/dev/zero设备复制出一个1G大小的文件/var/swap.1

/bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024 

#mkswap设置交换文件 /var/swap.1

/sbin/mkswap /var/swap.1

#swapon启用交换分区 /var/swap.1

/sbin/swapon /var/swap.1

新添加交换分区并启用之后,请使用cat /proc/swaps或free命令的查看交换分区是否被启用


3、Fatal error: Uncaught GuzzleHttp\Exception\RequestException: cURL error 60: SSL certificate problem: unable to get local issuer certificate (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) for..

composer错误.png这是由于本地curl的CA证书过期导致,打开链接:http://curl.haxx.se/ca/cacert.pem下载新的CA证书,默认名称一般是“cacert.pem”,保存到php的bin目录下,编辑“php.ini”,去掉“curl.cainfo”前面的注释“;”,然后在后面写上“cacert.pem”证书的完整路径(包括文件名)。

cacert文件路径.png

curl.cainfo = "C://phpstudy_pro/Extensions/php/php7.3.4nts/bin/cacert.pem",

配置文件参考下图:

php引用cacert.png

配置完成后,重启服务就可以了。


4、在linux中出现:Do not run Composer as root/super user! See https://getcomposer.org/root for details

意思是不要在root超级用户下执行,输入Y可继续,或者更换一个用户执行composer

[root@linux local]#useradd test

[root@linux local]#passwd test

[root@linux local]#su test

[test@linux local]$composer -V

Composer version 1.7.3 2018-11-01 10:05:06



composer调错方法:

composer错误示例.png

这类问题算比较小白,如果遇到,这是因为安装命令中带有“&& php ...”,安装后要求执行php程序,而程序报错了,Fatal error是php中的致命错误,这里只需根据错误提示,正常排错即可。



打赏

阅读排行

大家都在搜

博客维护不易,感谢你的肯定
扫码打赏,建议金额1-10元
  • 15601023311