最近搭建laravel项目,看官方文档进行操作,首先安装composer,在按照官方指导操作时,不出意外又采坑了,经过不懈努力,完成安装任务,其中某个问题印象深刻,特此记录。
【环境介绍】 :
- 操作系统: centos-release-7-3.1611.el7.centos.x86_64
- Apache httpd: Apache/2.4.43 (Unix), 安装在了/usr/httpd/
- PHP: PHP 7.4.5
【问题描述】:
安装composer的时候,按照官方文档,首先执行php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
,报错如下:Unable to find the wrapper “https” - did you forget to enable it when you configured PHP? in Command line code on line 1。
这种报错一般是php没有安装openssl.so的扩展导致的,但是我的php是支持openssl的啊,这样就很伤脑筋了,网上也没找到类似的解决方法。
【解决方案】:
如果php安装的时候就编译了openssl.则不会出问题,而我是单独下载编译openssl.so后动态添加到php里面的(在php.ini配置extension=openssl
),刚才查看支持openssl的信息是在网页通过phpinfo()
打印,我这里是php-fpm执行的,也的确支持openssl。
现在的区别是php命令工具执行代码(php -r “php代码” 的意思是通过php命令行执行此php代码,php的执行文件路径已经加入环境变量),这里的php环境的配置文件通过执行php -i|grep .ini
可以看到是/usr/local/php7.4.5/lib,因为php执行的时候通过php.ini去找到动态扩展,而我的/usr/local/php7.4.5/lib里面没有php.ini文件,一般在安装php的时候,是将php.ini放在php安装的根目录/usr/local/php7.4.5/,所以报错。
这里只需要指定下配置文件即可:php -c "/usr/local/php7.4.5/" -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
到这里问题就解决了,下面就是我在解决过程中的思考过程,纯因本人兴趣而记录。
【第一次尝试】
刚开始以为编译的openssl有问题,所以就重新编译(现在觉得是异想天开,和电脑出毛病后先重启电脑是一个解决思路),
这次编译加上--with-openssl
。
$ /usr/local/php7.4.5/bin/phpize
$ ./configure --with-openssl
--with-php-config=/usr/local/php7.4.5/bin/php-config
然后再试果然没用,不过排除一个错误选项也好,免得后面惦记。
【第二次尝试】
这次重新编译php,把openssl直接打进去,编译时加上参数**–enable-ssl**,这个方法也是网上找的(不知道是不是翻得帖子太久了,大部分都没有用)
./configure --prefix=/usr/local/php7.4.5/
--enable-fpm --with-apxs2=/usr/httpd/bin/apxs
--with-zlib-dir=/usr/lib64 --with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd --with-openssl
运行后提示 –with-openssl无效 ,可能PHP7已经不支持了吧,这个方法也暂时放弃,而且 感觉也没有找到问题的原因。
网上还有个说是要依赖libcurl动态扩展,也不靠谱。
【第三次尝试】
网上的方法基本都用完了,仍然未找到原因。
我突然想到,是不是机器请求https资源都会出问题,毕竟https资源涉及到数字证书校验等(之前有了解过一点)。
执行curl https://www.baidu.com
,结果返回正确,用php -r "fopen('https://www.baidu.com','r');"
,却又报 Unable to find the wrapper “https” - did you forget to enable it when you configured PHP? in Command line code on line 1 。
结果更加迷离,简直不知道如何排查。
【第四次尝试】
我突然想在php的代码里面写fopen('https://www.baidu.com','r');
,然后通过网页去访问看下行不行。
<?php
$fopen_res = fopen('https://www.baidu.com','r');
while(! feof($fopen_res))
{
echo fgets($fopen_res,1024). "<br />";
}
echo "end<br/>";
fclose($fopen_res);
?>
访问页面,发现可以获取https资源,感到正在向真相迈进。
这证明用php -r 的时候没有用到php的扩展openssl,只要让命令行用到openssl就解决问题。
可惜,在离真相最近的时候,被凤毛麟角的线索带偏,排查了这么久,思考了这么久,脑子已经开始迟钝,这时很容易钻进死胡同,走错路,要是脑子清醒,稍微再分析,即可大功告成。
【第五次尝试】(走偏之路)
openssl是啥? 查了好久总算是有个概念,然后扩散到centos,NSS,TSL,SSL等等,一下子暴露在这么多陌生概念里让我手足无措,这种情况下极易让人产生很多不切实际的想法,我都开始认为我需要安装数字证书或者把curl的NSS支持换成openssl才能解决这类问题。
这段时间正好回家结婚,隔了一个周后,再次毫无头绪的登录服务器,一阵懊恼,难道我要慢慢去了解centos下的TSL,https细节吗?上天是如此不公为什么让我这位初学者会遇到如此困难。
稍微搜索了下https实现思路,tsl的说明,数字证书概念,连TCP/IP协议的资料也找了下,迷茫到想放弃,主要还是对这些概念不理解,所以也无法确认这些层面上的问题,如果真是这样反而更无从下手,排查必将是一个很漫长的过程,比我安装composer还要久。
【成功安装composer和laravel】
这时我突然警醒,我的毛病就是容易钻牛角尖,非得理解不可才放手,这样过于执念的把有限的精力放在无限的问题中去,芝麻西瓜同时捡,最后都捞不着,心里建设了一番后,顺带承认了下自己的平凡,毕竟是菜鸟,不要对自己太严格,不纠结原理细节,大致知道概念即可,后面慢慢系统学习。
回到问题上来,先去看最近一次类似且运行成功的案例,即我之前运行成功的获取https资源的php代码,他们的区别在哪里?带着这个问题,我想到去文档里面查看php -r这个命令,是不是有其他参数,搜索出来的一行文字映入我的眼帘,
-c <path>|<file> Look for php.ini file in this directory
我突然明白他们的区别,php-fpm运行的时候我指定了配置文件,这里我也指定下呢。
php -c "/usr/local/php7.4.5/" -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
。
成功!
按部就班,把剩余的安装步骤做完。
- php -c “/usr/local/php7.4.5/” composer.phar
- php -r "if (hash_file(‘sha384’, ‘composer-setup.php’) === ‘e0012edf3e80b6978849f5eff0d4b4e4c79ff1609dd1e613307e16318854d24ae64f26d17af3ef0bf7cfb710ca74755a’) { echo ‘Installer verified’; } else { echo ‘Installer corrupt’; unlink(‘composer-setup.php’); } echo PHP_EOL;"
- php -c “/usr/local/php7.4.5/” composer-setup.php (这个也需要指定下)
- php -r "unlink(‘composer-setup.php’);"
安装好composer后(生成了composer.phar),再安装laraval,php -c "/usr/local/php7.4.5/" /usr/local/composer/composer.phar global require laravel/installer
。
顺利完成。