联系QQ 284710375
首页 > 技术分享 > 原生PHP
收藏

PHP中guzzle相关错误解决方法,curl_setopt_array(): cannot represent...2023-02-14 14:30:27

大潇博客 原创文章,转载请标明出处

今天使用阿里云通信号码认证服务PHP-SDK,由于项目太老旧,所以使用了V1.0版本,仅要求PHP5.5起步。


在本地wnmp环境中完成配置后,测试SDK抛出这样的警告:

Warning: curl_setopt_array(): cannot represent a stream of type Output as a STDIO FILE* in E:\MyWeb\ali_dypnsapi\vendor\guzzlehttp\guzzle\src\Handler\CurlFactory.php on line 59

cURL error 0: The cURL request was retried 3 times and did not succeed. The most likely reason for the failure is that cURL...

如图:

guzzle错误.png


大致可以看出,是curl环节出了问题,但更换php.ini中的curl证书,或者修改php.ini中sys_temp_dir路径等,问题都没得到解决。


于是我把sdk上传到几个linux服务器中测试,结果代码均正常运行,这样分析看来,问题可能和系统有关。


于是查阅资料,得到最终的解决方案:

在guzzle设置了option中debug为true的时候,

linux下可以使用fopen('php://output', 'w');

windows下需要将debug设置为 fopen('php://stdout','w'); 或者 fopen('php://stderr', 'w');


在此sdk中,修改vendor/guzzlehttp/guzzle/src/functions.php第92行即可。


php://output 与 php://stderr、php://stdout的差别

php://stdin、php://stdout 和 php://stderr 

允许直接访问 PHP 进程相应的输入或者输出流。 数据流引用了复制的文件描述符,所以如果你打开 php://stdin 并在之后关了它, 仅是关闭了复制品,真正被引用的 STDIN 并不受影响。 推荐你简单使用常量 STDIN、 STDOUT 和 STDERR 来代替手工打开这些封装器。


php://stdin 是只读的

php://stdout 和 php://stderr 是只写的。


php://output 是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。


打赏

阅读排行

大家都在搜

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