composer基础与实践-上篇
composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。
目前,yii2.0或者laravel等web框架都在使用composer作为依赖管理工具,不仅可以很方便的升级框架本身代码,并且可以方便的安装各种第三方开源库,所以对composer做一个基本的了解是必要的。
下面从0搭建一个基于composer的小项目,重在掌握项目开发中必备的知识点。
1,创建一个空的项目目录。
1 2 |
mkdir project cd project/ |
2,下载composer程序自身(国内服务器会被墙,需要使用国外服务器或者翻墙)
1 2 3 4 5 6 7 8 9 10 |
[work@vultr project]$ curl -sS https://getcomposer.org/installer | php All settings correct for using Composer Downloading 1.2.0... Composer successfully installed to: /home/work/project/composer.phar Use it: php composer.phar [work@vultr project]$ ll total 1668 -rwxr-xr-x 1 work work 1705467 Aug 6 13:46 composer.phar |
3,编写针对该项目的composer配置文件,叫做composer.json。
composer支持配置很多项目的基础信息,例如项目名称,作者,项目的开源协议等等,如果你的项目是准备开源给他人使用,那么一般都要写的比较详细(有利于增加自己知名度)。
由于我们是自己写项目不开源,所以这一块我们就写一个name项目名称试验一下即可,所以composer.json文件一开始长这样。
1 2 3 4 |
[work@vultr project]$ cat composer.json { "name": "project" } |
4,现在可以基于composer.json文件,为项目初始化composer环境(一个项目只需要初始化一次)。
1 2 3 4 5 6 7 8 |
[work@vultr project]$ php composer.phar install Loading composer repositories with package information Updating dependencies (including require-dev) mmap() failed: [12] Cannot allocate memory PHP Fatal error: Out of memory (allocated 52953088) (tried to allocate 4718592 bytes) in phar:///home/work/project/composer.phar/src/Composer/Repository/ComposerRepository.php on line 547 Fatal error: Out of memory (allocated 52953088) (tried to allocate 4718592 bytes) in phar:///home/work/project/composer.phar/src/Composer/Repository/ComposerRepository.php on line 547 |
这里遇到一个插曲:遇到了内存不足的报错,已分配过的内存是52M,继续分配4M的时候就mmap失败内存不足了。52M内存肯定是有的,毕竟vps是768MB内存的机器,free -m看了一下果真剩余了40M内存,ps aux看了一下1个php-fpm进程占用了130M内存,根据经验立即怀疑了opcache,其配置中默认是128M的缓存空间,关闭opcache重启php-fpm,内存恢复。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
[work@vultr project]$ php composer.phar install Loading composer repositories with package information Updating dependencies (including require-dev) Nothing to install or update Generating autoload files [work@vultr project]$ ll total 1676 -rw-rw-r-- 1 work work 23 Aug 6 13:53 composer.json -rwxr-xr-x 1 work work 1705467 Aug 6 14:08 composer.phar drwxrwxr-x 3 work work 4096 Aug 6 14:32 vendor [work@vultr project]$ ll vendor/ total 8 -rw-rw-r-- 1 work work 183 Aug 6 14:32 autoload.php drwxrwxr-x 2 work work 4096 Aug 6 14:32 composer [work@vultr project]$ ll vendor/composer/ total 44 -rw-rw-r-- 1 work work 147 Aug 6 14:32 autoload_classmap.php -rw-rw-r-- 1 work work 149 Aug 6 14:32 autoload_namespaces.php -rw-rw-r-- 1 work work 143 Aug 6 14:32 autoload_psr4.php -rw-rw-r-- 1 work work 1681 Aug 6 14:32 autoload_real.php -rw-rw-r-- 1 work work 317 Aug 6 14:32 autoload_static.php -rw-rw-r-- 1 work work 12466 Aug 6 14:32 ClassLoader.php -rw-rw-r-- 1 work work 3 Aug 6 14:32 installed.json -rw-rw-r-- 1 work work 1075 Aug 6 14:32 LICENSE |
可见,composer生成了自己需要的目录,以及若干“自动加载”功能相关的php代码。先继续往下试验,我们会看一下这些文件大概做了什么事情,加深理解。
5,接下来,我想安装一个第三方日志库monolog,比较好的方法是通过网站packagist.org来查找关键字(另一种方法是通过composer.phar的search命令,但是没有办法查看历史版本),我找到了https://packagist.org/packages/monolog/monolog这个库,里面列举了若干历史版本,其中dev-master是正在开发中的主干(可能不稳定),我们一般都是取一个历史版本,我选择1.21.0,通过命令安装一下即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
[work@vultr project]$ php composer.phar require monolog/monolog:1.21.0 ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) - Installing psr/log (1.0.0) Downloading: 100% - Installing monolog/monolog (1.21.0) Downloading: 100% monolog/monolog suggests installing aws/aws-sdk-php (Allow sending log messages to AWS services like DynamoDB) monolog/monolog suggests installing doctrine/couchdb (Allow sending log messages to a CouchDB server) monolog/monolog suggests installing ext-amqp (Allow sending log messages to an AMQP server (1.0+ required)) monolog/monolog suggests installing ext-mongo (Allow sending log messages to a MongoDB server) monolog/monolog suggests installing graylog2/gelf-php (Allow sending log messages to a GrayLog2 server) monolog/monolog suggests installing mongodb/mongodb (Allow sending log messages to a MongoDB server via PHP Driver) monolog/monolog suggests installing php-amqplib/php-amqplib (Allow sending log messages to an AMQP server using php-amqplib) monolog/monolog suggests installing php-console/php-console (Allow sending log messages to Google Chrome) monolog/monolog suggests installing rollbar/rollbar (Allow sending log messages to Rollbar) monolog/monolog suggests installing ruflin/elastica (Allow sending log messages to an Elastic Search server) monolog/monolog suggests installing sentry/sentry (Allow sending log messages to a Sentry server) Writing lock file Generating autoload files |
这里:1.21.0明确指定了版本,composer支持其他几种形式定义版本,例如>=1.21.0指不低于1.21.0的版本,这里不展开。
我们重点要知道require命令背后做了什么事情,最后我们完全可以模拟整个过程而绕开require命令实现相同的效果。
a)首先它把monolog这个依赖写到了composer.json配置文件里,也就是require字段里的内容。
1 2 3 4 5 6 7 |
[work@vultr project]$ cat composer.json { "name": "project", "require": { "monolog/monolog": "1.21.0" } } |
b)其次composer会执行php composer.phar update命令,这个命令会根据当前的composer.json文件生成一个composer.lock文件(一个执行计划),lock文件里包含了更详细的描述信息,以及monolog的二级依赖等。接下来,会根据lock文件,从网络上下载monolog需要的安装包到本地进行部署,最终都会安装到vender目录下。最后,会更新vender下的各类autload_前缀的文件,以便后续开发者能够方便的引入monolog,这是后话。
1 2 3 4 5 6 7 |
[work@vultr project]$ ll vendor/ total 20 -rw-rw-r-- 1 work work 183 Aug 6 15:07 autoload.php drwxrwxr-x 2 work work 4096 Aug 6 14:50 bin drwxrwxr-x 2 work work 4096 Aug 6 15:00 composer drwxrwxr-x 3 work work 4096 Aug 6 15:00 monolog drwxrwxr-x 3 work work 4096 Aug 6 15:00 psr |
6,monolog安装完成,现在写一个项目主文件index.php,来调用一下monolog打印一条日志。
1 2 3 4 5 6 7 8 9 10 11 12 |
[work@vultr project]$ cat index.php <?php require __DIR__ . '/vendor/autoload.php'; use Monolog\Logger; $logger = new Logger('test'); $logger->info('hello'); [work@vultr project]$ php index.php [2016-08-06 15:24:33] test.INFO: hello [] [] |
这里引入了vender目录下的autoload.php文件,这个文件是composer生成的,它基于php的autoload能力,当你引入一个不存在的类或者函数的时候,composer的autoload函数将被唤起来找到对应的文件,保证你通过composer管理的库可以自动引入,所以composer使用是非常简单的,只需要引入这一个文件在你的代码入口即可方便的使用各种开发库了~
下一篇博客里,会通过学习composer的autoload功能,进一步理解composer如何实现“自动加载”以及支持哪些具体的自动加载协议。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
