近两天在做的一个App后端项目中,整合了阿里云的短信服务。
PHP利用的是Yii和composer,在整合过程中碰着了一些坑,在这里把它们记录下来,期望方便同类的新手朋友查阅并得到帮助。
先放上干系的文档网址:
1. 阿里云的短信服务PHP SDK文档及其下载网址;
https://help.aliyun.com/document_detail/44368.html?spm=5176.doc44364.6.131.2PUN6r
2. Yii基于composer安装文档;
http://www.yiiframework.com/doc-2.0/guide-start-installation.html
3. Composer官网;
https://getcomposer.org/
下面逐个列举碰着的几个坑,你跌进去了几个呢?⊙_⊙
坑 1:
阿里云的短信服务PHP SDK并不是基于Composer实现的,以是文档也没有解释如果要跟Composer整合到一起要怎么做,咋整合呢?
填坑方法:
利用composer.json配置引入阿里云短信服务PHP SDK的类,以及初始化代码。
composer.json示例如下:
{
\"大众description\公众: \"大众Demo.\"大众,
\"大众keywords\"大众: [\公众demo\"大众],
\"大众type\"大众: \"大众project\公众,
\"大众require\"大众: {
\"大众yiisoft/yii2-app-basic\"大众: \公众2.\公众
},
\公众autoload\"大众: {
\公众psr-0\公众: {
\公众Sms\"大众: \公众lib/aliyun/aliyun-php-sdk-sms/\公众
},
\"大众classmap\"大众: [
\"大众lib/aliyun/aliyun-php-sdk-core/\"大众
],
\"大众files\公众: [
\"大众lib/aliyun/aliyun-php-sdk-core/Config.php\"大众
]
},
\公众repositories\"大众: {
\"大众packagist\"大众: {
\公众type\"大众: \"大众composer\公众,
\"大众url\"大众: \"大众https://packagist.phpcomposer.com\"大众
}
}
}
如果对composer不同的引入类和文件的办法(psr-0,classmap,files等)不清楚,可参考Composer官网文档。
坑 2:
Composer install下载Yii为啥如此之慢呢?怎么提升下载速率呢?
填坑方法:
由于composer的开源库都在国外,包括github也是在国外,海内访问速率会非常慢,好在海内有开拓者专门做了镜像做事,只需在composer.json文件底部加上repositories配置指向海内镜像做事器即可提升软件源码下载速率。
配置示例(完全见坑 1):
\"大众repositories\公众: {
\"大众packagist\公众: {
\公众type\公众: \公众composer\"大众,
\"大众url\"大众: \"大众https://packagist.phpcomposer.com\"大众
}
}
海内镜像网站见:http://www.phpcomposer.com/
坑 3:
用Composer安装Yii的时候,为啥总是报错呢?提示啥asset没有,又提示啥php扩展没有,咋办?
填坑方法:
Yii官方的基于composer的安装方法中有写到:
composer global require \"大众fxp/composer-asset-plugin:^1.2.0\"大众
composer create-project --prefer-dist yiisoft/yii2-app-basic basic
个中第一句便是先安装composer-asset-plugin插件,直接实行一样会碰到上面坑 2,下载速率太慢,可直接编辑~/.config/composer/composer.json文件(如果没有可手动创建),按照坑 2的填坑方法,设置好海内镜像作为软件仓库地址。
完全的~/.config/composer/composer.json示例:
{
\"大众require\公众: {
\公众fxp/composer-asset-plugin\"大众: \公众~1.2.0\"大众
},
\"大众repositories\"大众: {
\"大众packagist\"大众: {
\公众type\"大众: \公众composer\"大众,
\"大众url\"大众: \公众https://packagist.phpcomposer.com\公众
}
}
}
坑 4:
Yii安装好之后,阿里云的短信SDK要若何基于Composer引入到代码中来呢?
填坑方法:
这个问题实在坑 1中已经给出了答案,但是还是有必要单独拿出来再说一次。
利用composer的autoload来自动加载阿里云的短信SDK代码,要搞明白怎么配置,须要知道:
阿里云的短信SDK代码怎么利用,利用的时候要引入哪些类;
composer的autoload方法有哪些,利用哪几种方法来引入对应的短信SDK代码;
先看阿里云短信SDK目录的构造:
.
├── aliyun-php-sdk-core
│ ├── AcsRequest.php
│ ├── AcsResponse.php
│ ├── Auth
│ │ ├── Credential.php
│ │ ├── ISigner.php
│ │ ├── ShaHmac1Signer.php
│ │ └── ShaHmac256Signer.php
│ ├── Autoloader
│ │ └── Autoloader.php
│ ├── Config.php
│ ├── DefaultAcsClient.php
│ ├── Exception
│ │ ├── ClientException.php
│ │ └── ServerException.php
│ ├── Http
│ │ ├── HttpHelper.php
│ │ └── HttpResponse.php
│ ├── IAcsClient.php
│ ├── Profile
│ │ ├── DefaultProfile.php
│ │ └── IClientProfile.php
│ ├── Regions
│ │ ├── EndpointConfig.php
│ │ ├── Endpoint.php
│ │ ├── EndpointProvider.php
│ │ └── ProductDomain.php
│ ├── RoaAcsRequest.php
│ └── RpcAcsRequest.php
└── aliyun-php-sdk-sms
└── Sms
└── Request
└── V20160927
├── QuerySmsDetailByPageRequest.php
├── QuerySmsFailByPageRequest.php
├── QuerySmsStatisticsRequest.php
└── SingleSendSmsRequest.php
阿里云官方文档(见顶部文档网址)中底部的示例代码最前面两句,便是引入必要的类,并引入命名空间:
<?php
include_once 'aliyun-php-sdk-core/Config.php';
use Sms\Request\V20160927 as Sms;
再看第一句的Config.php代码中的内容,会看到:
include_once 'Autoloader/Autoloader.php';
include_once 'Regions/EndpointConfig.php';
//config sdk auto load path.
Autoloader::addAutoloadPath(\"大众aliyun-php-sdk-sms\"大众);
再打开Autoloader/Autoloader.php文件,就会看到自动加载类时会去aliyun-php-sdk-core目录及其子目录下去找。
综合这三个文件,就可以得出我们须要引入aliyun-php-sdk-sms目录和aliyun-php-sdk-core目录下的类。
由于aliyun-php-sdk-core核心代码并没有利用命名空间,以是可以利用classmap来加载;
而aliyun-php-sdk-sms下的文件利用了命名空间,可以利用psr-0办法来加载。
composer.json配置示例:
\"大众psr-0\"大众: {
\"大众Sms\"大众: \"大众lib/aliyun/aliyun-php-sdk-sms/\"大众
},
\"大众classmap\"大众: [
\公众lib/aliyun/aliyun-php-sdk-core/\"大众
]
坑 5:
利用Composer引入了短信SDK,可一调用示例代码为啥报错DefaultProfile类不存在呢?
填坑方法:
PHP中如果在利用了命名空间的类中,去调用一个没有利用命名空间的类,在这个类的类名前面加个反斜杠\,见告php直接去找这个类,而不要在当前的命名空间下去找。
示例代码:
$iClientProfile= \DefaultProfile::getProfile(\公众cn-hangzhou\"大众, ‘accessKey’, ‘accessSecret’);
$client=new \DefaultAcsClient($iClientProfile);
坑 6:
看起来统统都很顺利,一发送短信为啥提示找不到Endpoint节点呢?不是明明代码里指定了获取“cn-hangzhou”节点吗?
填坑方法:
坑 1中也已经给了示例,这里单独再重点提一下:
\"大众files\"大众: [
\"大众lib/aliyun/aliyun-php-sdk-core/Config.php\"大众
]
在autoload配置中,利用files指定须要加载aliyun-php-sdk-core/Config.php文件。
综上所述,
看似一个大略的功能,基于composer把它跟Yii集成到一起,须要节制composer的用法,以及php autoload的机制,并节制利用composer集成Yii的方法。
-本文由“6分钟师长西席”(6fenzh.com)首发于今日头条的“头条号”,转载请注明出处。