【问题解决】PHP命令行安装composer报错Unable to find the wrapper https

最近搭建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

顺利完成。

猜你喜欢

转载自blog.csdn.net/kiramario/article/details/106227950