近两天在做的一个App后端项目中,整合了阿里云的短信服务。

PHP利用的是Yii和composer,在整合过程中碰着了一些坑,在这里把它们记录下来,期望方便同类的新手朋友查阅并得到帮助。

先放上干系的文档网址:

aliyunphpsdkcorePHP基于Composer若何集成阿里云短佩服务的SDK Bootstrap

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示例如下:

{

\公众name\"大众: \公众test\"大众,

\"大众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)首发于今日头条的“头条号”,转载请注明出处。