composer报错:received xxx bytes out of the 以及composer手动引入扩展包

一、前言

      如题所示,博主在下载laravel5.4Predis扩展的时候遇到的错误,本来只是个composer下载的报错,只是处理这个问题的时候,又遇到很多知识点,索性记录一下,也方便同样遇到这个问题的朋友们。

二、普通解决方案

      经过各种搜索查询,网上普遍的解决方案主要是下面两种。

1、设置国内的下载源

有一部分前辈说这个问题是因为源地址的问题,换成国内的源即可解决。

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

这种方式确实能替换源地址,只不过对于博主来说并没有解决实际问题。

2、设置compoer缓冲大小

后续百度发现有人说是缓存问题,缓存大小是:cache-files-maxsize

(1)查看composer配置文件

composer config -l

[cache-ttl] 15552000
[cache-files-ttl] 15552000
[cache-files-maxsize] 300MiB (1073741824)
[bin-compat] auto
[discard-changes] false
[autoloader-suffix]
[sort-packages] true
[optimize-autoloader] true
[classmap-authoritative] false
[apcu-autoloader] false

      缓存大小只有300M,这么说来的话,如果更新的包比较大,还真有可能下载不下来,因此更给为1024M试试。

(2)修改配置文件:

//修改缓存大小为1024MB

composer config --global cache-files-maxsize 1024MiB   

其他的:

composer config --global data-dir /www/.composer
composer config --global cache-dir /www/.composer

      修改的样式都是这样的,其实格式和更改源路径的时候差不多,只不过一时没想到,耗费了不少时间,这里需要注意格式是MiB。另外,对博主来说,修改完之后还是下载扩展包失败,那就没办法了,只能祭出我的大杀器。

三、手动引入Predis下载包

      博主用尽浑身解数加上等待composer下载实在是浪费时间,无奈只好下载扩展包,然后通过composer自动加载机制引入扩展包。只是想法很美好,原理很简单,实施很艰难呐。

1、下载predis的包

下载链接: https://makeoss.oss-cn-hangzhou.aliyuncs.com/%E7%BC%96%E7%A8%8B/predis.zip

下载完成后,把包放到vendor下面即可。

2、执行 composer dumpautoload

      一般都是把扩展包放到vendor之后,执行 composer dumpautoload 即可,但是博主这里执行之后,使用包的时候报错:

Class 'Predis\Client' not found

代表这个扩展包没有被框架自动加载。

3、修改composer.json,实现自动加载

      既然要composer自动加载不现实了,那咱们只能手动更改了。根据composer自动加载规则,单独文件的话可以直接在autoload里面的files直接加上路径,比如一些函数文件等。

      像咱们这种扩展包,需要在classmap里面给出目录,然后执行composer dump-autoload,自动加载才生效,它会把这个自动加载写入自动加载的配置文件中,这样我们的predis扩展才能用的到。

      感兴趣的话,可以去vendor/composer中看看autoload_classmap.php,我们会看到新增了predis加载标准,这样在框架运行的时候,自然就能依据psr-4自动加载规范找到咱们需要的方法。

  "autoload": {
        "classmap": [
            "database",
            "vendor/predis"
        ],
        "psr-4": {
            "App\\": "app/"
        },
        "files":[
            "app/Helpers/functions.php"
        ]
    },

4、执行 composer dumpautoload

      执行命令之后,刷新,错误消失 ,可以正常获取存储的值了

四、总结

      出现这个问题,本质上还是对于composer的理解不够透彻,总以为下载个包就可以了,只是当这个包下载不下来的时候,我们又如何手动下载这个包,并把包通过autoload加载进框架呢?composer的自动加载部分如何添加,类的自动加载又要经过哪些步骤?这些都是我们要了解的知识,加油吧各位!

end


你可能感兴趣的:(php日常bug)