Closed AskSword closed 4 years ago
阿里网易的都可以跑起来,就这个composer安装后一引用就报错,服了
我觉得确实是写的真水,反正我点进来一脸懵逼,没看到怎么使用。example里面一堆名词,注释不少,有用的注释真的不多。
搞了 3天了 心里十万个 X composer 方式也试过安装了 还是没能跑起DEMO
这sdk可能只针对大佬吧。 composer安装跑不起来+1
用composer安装之后,报错说缺少functions.php。我查看之后,确实是缺少了。不过我是用阿里云的composer镜像。不知道有没有关系
去除密钥,直接贴代码和composer.json文件看看吧,虽然我不会php,但我自己照着文档做一路跑下来没遇到问题 @rexana3
用composer安装之后,报错说缺少functions.php。我查看之后,确实是缺少了。不过我是用阿里云的composer镜像。不知道有没有关系
composer 下来的包 没有vendor.... 所以有了以上的问题
在项目根目录 创建 TCloudAutoLoader.php
<?php
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'guzzlehttp' . DIRECTORY_SEPARATOR . 'guzzle' . DIRECTORY_SEPARATOR . 'src'. DIRECTORY_SEPARATOR . 'functions.php');
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'guzzlehttp' . DIRECTORY_SEPARATOR . 'psr7' . DIRECTORY_SEPARATOR . 'src'. DIRECTORY_SEPARATOR . 'functions.php');
require_once(__DIR__ . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'guzzlehttp' . DIRECTORY_SEPARATOR . 'promises' . DIRECTORY_SEPARATOR . 'src'. DIRECTORY_SEPARATOR . 'functions.php');
spl_autoload_register(function ($class_name) {
$clsName = str_replace("\\", DIRECTORY_SEPARATOR, $class_name);
if (is_file(__DIR__ . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . $clsName . '.php')) {
require_once(__DIR__ . DIRECTORY_SEPARATOR . "src" . DIRECTORY_SEPARATOR . $clsName . '.php');
}
});
spl_autoload_register(function ($class_name) {
$clsName = str_replace("\\", DIRECTORY_SEPARATOR, $class_name);
if (is_file(__DIR__ . DIRECTORY_SEPARATOR . "vendor" . DIRECTORY_SEPARATOR . $clsName . '.php')) {
require_once(__DIR__ . DIRECTORY_SEPARATOR . "vendor" . DIRECTORY_SEPARATOR . $clsName . '.php');
}
});
这文档无力吐槽
建议去实习百度的接口,超级好用!------------------ 原始邮件 ------------------ 发件人: "邓学文"<notifications@github.com> 发送时间: 2020年6月4日(星期四) 下午5:57 收件人: "TencentCloud/tencentcloud-sdk-php"<tencentcloud-sdk-php@noreply.github.com>; 抄送: "rexana3"<497014168@qq.com>;"Mention"<mention@noreply.github.com>; 主题: Re: [TencentCloud/tencentcloud-sdk-php] 这是demo吗,无法运行,你们写文档的技术是真的菜 (#27)
受楼上各位启发,去体验了下阿里的PHP SDK。
为避免找错了,我看的是最重要的业务云服务器的,地址是https://help.aliyun.com/document_detail/25699.html?spm=a2c4g.11174283.6.1421.d9bb52feTS1a5e 跳转的链接是:https://github.com/aliyun/aliyun-openapi-php-sdk?spm=a2c4g.11186623.2.14.659a3ee7vxavD3 ,也就是https://github.com/aliyun/aliyun-openapi-php-sdk 这个仓库,但是已被废弃了,README最后更新是四个月前 根据废弃的声明,新的sdk是https://github.com/aliyun/openapi-sdk-php
根据readme的使用方法,添加了alibabacloud/sdk的依赖 composer update更新,报错 依赖的mbstring模块缺失,readme里压根没提这个,但我会百度啊,apt-get install php-mbstring解决 composer update更新,报错 依赖的xmlwriter模块缺失,readme里也没提这个,继续apt-get install php-xmlwriter安装完毕。
直接复制了readme里的示例, 目前master commit的示例代码:https://github.com/aliyun/openapi-sdk-php/blob/61b563211b3e44167315f25c09f57b2e031ba18a/README.md#quick-examples
放在项目根目录src/ali.php文件,执行结果是 报错,类找不到,应该是缺乏引用,手动添加引用,require "vendor/autoload.php";再次执行,报错 报错,Client 'client1' not found,非常奇怪的错误,在src/ali.php中搜索,发现 但是我不知道为何要有client1,这个client1看起来是字符串,为什么会报错,这时候是不是该直接骂娘了?但我推测应该是一种对client的命名,继续翻找源码,发现client对象初始化的时候可以指定别名,->name('client1');做出如下修改 继续执行,之前的错误消失,新的报错出来了 看起来是超时了,看示例源码,是在演示用法,第一个示例直接就设置超时0.01秒,连https连接都不够建立的,当然失败了,那我该怎么办呢?继续骂娘?但我推测这里只是演示用法,应该注释掉第一个调用就可以了,继续执行,报错 奇怪的报错,Client 'default' not found,但我有经验了,知道是上面对client起了别名,没有默认的client引起的,继续注释掉上面自己添加的命名代码,如下 执行,继续报错 cURL error 28: Resolving timed out after 12 milliseconds (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) 又是超时,一个示例代码,10ms超时合理吗?但我推测这里只是展示用法,调整为10000ms。如图 执行,继续报错 好在都是基础的英文单词,我知道是没有填写真实密钥导致的,那我该去哪里搞到密钥呢?根据readme中的指引,要去阿里云控制台搞到密钥,弹出安全提示,让我选,我一个新用户能明白该选哪个,当然是不推荐的那个,不然又要花时间学习我目前还用不到的高端玩法 申请了主帐号的密钥调用,这里涉及到账号,我就不截图了。执行,继续报错 看起来是指定的机型不合法,回过头来看示例代码,看起来是代码中的值都是虚假的,不是真实的,示例调用的是查询地域,公开的信息,为什么要填一个假的值呢,这么写不是坑人吗? 没办法,到官网文档查看有哪些合法的机型,找到这个DescribeRegions接口文档看示例,https://help.aliyun.com/document_detail/25609.html?spm=a2c4g.11174283.6.1393.d9bb52feyNVczG 照着示例填 修改代码如下 继续报错 得,官网示例都跑不通,但是我推测可能跟sdk 示例代码下面那一段有关,只是展示覆盖参数的用法,实际值是很奇怪的,保险起见,还是先注释看看 还是不行,报同样的错误,没办法,肯定是DescribeRegion接口文档中的示例有问题,报错杭州区现在没有这个resourcetype,但是杭州区作为默认区没有预付费实例,可能吗?保险起见,连regionId都换成接口文档示例中的qingdao,在client对象中设置后,再重新执行,还是报同样的错误。 没办法,回过头看接口入参,还使用了API Explorer进行调试,最终发现参数描述里枚举的resourcetype和示例中不一样,示例中的是大写,表格里枚举的是小写的 继续修改代码,改为小写的, 执行,没有报错,也没有任何输出!! 继续翻sdk源码,发现返回的result对象有toArray方法,修改示例如下 执行,终于成功了,打印了地域信息。
上面各位大佬,我还没用更多的更复杂的功能,也许阿里云的sdk比这个项目的sdk好用无数倍,但是要说这个项目的demo文档菜,要学习阿里的,我是不敢学的。 这个项目虽然最初不是我开发的,但demo我照着做是一把过的,安装的时候composer指定了guzzlehttp依赖,可以顺利安装,至少我在ubuntu16.04,php7.0,composer1.8.4是直接成功的。依赖的php curl扩展也在readme里说明了(这个应该算比较常见,一般会开的吧,但文档依然指出了)。第一个示例极其简单,除了必不可少的密钥之外,连参数都没有设置,不可能出现参数问题导致的失败。 我上面体验阿里云php sdk这些操作过程,你们随便起一个ubuntu16.04的虚拟机,安装php7.0,重复一遍就知道了。 说实话,我是有点酸的,嫉妒使我扭曲,我感受到了不一样的对待,这是有失公平的。 虽然我比不上各位前辈高人,但我会尽我所能继续改进这个项目的。我希望大家反馈问题的时候,能贴出具体的报错信息,截图。不要只说报错啦,文档太菜执行不起来啦。我只是个普通的码农,无法单靠一句话诊断问题。没有足够的信息复现问题,怎么解决呢?
你终于把万恶的 TCloudAutoLoader.php
文件删除了
准确的说,是把源码安装的方式和指引删除了。以前有些用户不使用composer管理依赖,要直接用源码复制进自己的项目,为了满足这些用户,SDK一开始就试图兼顾两种场景,把vendor目录搞进来了,但实际是和composer冲突的,不得不设置不导出。前天我删除了这些内容,想尽量只用composer一种方式,也许composer并不像某些用户说的那样难学。
你这么说我倒是有点明白了。看起来还是依赖管理的问题,从源码安装的方式,没法管理依赖。我前两天检查原先的vendor目录里的文件根本不是使用composer装起来的,导致如果使用comnposer,又引用的是 TCloudAutoLoader 这个文件,会发生冲突。 所以如果是composer安装的,就直接用vendor/autoload.php就可以了。如果是源码安装的,反而只能使用提供的vendor目录下的文件,不能和composer混用,也不能自己另外安装guzzlehttp。 不过现在我已经移除了这些,都用composer吧
On Thu, Jun 11, 2020 at 11:02 AM Eden Leung notifications@github.com wrote:
项目升级了第三方的包(GuzzleHttp), TCloudAutoLoader 文件又没更新导入的代码 (路径都是是错的),导致上面的开发者运行都运行不了。
— You are receiving this because you modified the open/close state. Reply to this email directly, view it on GitHub https://github.com/TencentCloud/tencentcloud-sdk-php/issues/27#issuecomment-642376560, or unsubscribe https://github.com/notifications/unsubscribe-auth/AAQUO675N54JVYTS42BIAYTRWBCK3ANCNFSM4HYSTACQ .
点个赞,
无力吐槽...去隔壁阿里看看吧