PHP
本文為您介紹如何使用阿里云視覺智能開放平臺(tái)相關(guān)服務(wù)的PHP SDK,包括SDK的獲取和安裝方法,以及SDK代碼示例。
阿里云視覺智能開放平臺(tái)各類目視覺AI能力SDK接入、接口使用或問題咨詢等,請(qǐng)通過(guò)釘釘群(23109592)加入阿里云視覺智能開放平臺(tái)咨詢?nèi)郝?lián)系我們。
該版本SDK最低環(huán)境要求PHP 5.6,如不滿足請(qǐng)升級(jí)PHP版本。
準(zhǔn)備工作
在安裝和使用阿里云SDK前,確保您已經(jīng)注冊(cè)阿里云賬號(hào)并生成訪問密鑰(AccessKey)。具體操作,請(qǐng)參見創(chuàng)建AccessKey。
安裝相應(yīng)AI類目的SDK包。 具體操作步驟如下:
下載并安裝Composer:
curl -sS https://getcomposer.org/installer | php
。執(zhí)行Composer命令安裝相應(yīng)類目SDK包的最新版本,例如人臉人體服務(wù):
php composer.phar require alibabacloud/facebody-20191230
。詳細(xì)信息可參照如下表格。在代碼中引入Composer自動(dòng)加載工具:
<?php require __DIR__ . '/vendor/autoload.php';
。說(shuō)明PHP: >=5.5
AI類目
SDK鏈接
Github鏈接
生成專區(qū)
人臉人體
文字識(shí)別
商品理解
內(nèi)容審核
圖像識(shí)別
圖像生產(chǎn)
分割摳圖
目標(biāo)檢測(cè)
視覺搜索
圖像分析處理
視頻生產(chǎn)
視頻理解
視頻分割
異步任務(wù)管理
自學(xué)習(xí)
人臉核身服務(wù)端20200910專用版本
配置環(huán)境變量
配置環(huán)境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
阿里云賬號(hào)AccessKey擁有所有API的訪問權(quán)限,建議您使用RAM用戶進(jìn)行API訪問或日常運(yùn)維,具體操作,請(qǐng)參見創(chuàng)建RAM用戶。
請(qǐng)不要將AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導(dǎo)致AccessKey泄露,威脅您賬號(hào)下所有資源的安全。
Linux和macOS系統(tǒng)配置方法
在IntelliJ IDEA中打開終端Terminal。
執(zhí)行以下命令,配置環(huán)境變量。
<access_key_id>
需替換為您RAM用戶的AccessKey ID,<access_key_secret>
替換為您RAM用戶的AccessKey Secret。如果后續(xù)需要進(jìn)行更多權(quán)限相關(guān)的配置,具體操作請(qǐng)參見使用RAM Policy控制訪問權(quán)限。export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
Windows系統(tǒng)配置方法
新建環(huán)境變量文件,添加環(huán)境變量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并寫入已準(zhǔn)備好的AccessKey ID和AccessKey Secret。然后重啟Windows系統(tǒng)。本操作以Windows 10為例進(jìn)行說(shuō)明。打開文件資源管理器,在此電腦上右鍵單擊屬性。
在右側(cè)導(dǎo)航欄,單擊高級(jí)系統(tǒng)配置。
在系統(tǒng)屬性對(duì)話框的高級(jí)頁(yè)簽下,單擊環(huán)境變量。
在環(huán)境變量對(duì)話框中,單擊新建(W)。
在彈出的新建系統(tǒng)變量對(duì)話框中,添加環(huán)境變量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并寫入已準(zhǔn)備好的AccessKey ID和AccessKey Secret。重啟Windows系統(tǒng),使配置生效。
代碼示例
本文以RecognizeBankCard為例。
文件在上海地域OSS
每個(gè)類目的訪問域名與對(duì)應(yīng)Region開通能力,請(qǐng)參見訪問域名。
<?php
// 1、這里只是以ocr下的RecognizeBankCard能力為例,其他能力請(qǐng)引入相應(yīng)類目的包和相關(guān)類。包名可參考本文檔上方的SDK包名稱,能力名可參考對(duì)應(yīng)API文檔中的Action參數(shù)。例如您想使用通用分割,其文檔為http://m.bestwisewords.com/document_detail/151960.html,可以知道該能力屬于分割摳圖類目,能力名稱為SegmentCommonImage,那么您需要將代碼中Ocr改為Imageseg,將RecognizeBankCard改為SegmentCommonImage。版本號(hào)V20191230如果有變化也需要修改。
use AlibabaCloud\SDK\Ocr\V20191230\Ocr;
use AlibabaCloud\SDK\Ocr\V20191230\Models\RecognizeBankCardRequest;
use AlibabaCloud\Tea\Utils\Utils;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
class Sample {
/**
* 使用AK&SK初始化賬號(hào)Client
* @param string $accessKeyId
* @param string $accessKeySecret
* @return Ocr Client
*/
public static function createClient($accessKeyId, $accessKeySecret){
//初始化配置對(duì)象Darabonba\OpenApi\Models\Config。
//Config對(duì)象存放accessKeyId、accessKeySecret、endpoint等配置
$config = new Config([
"accessKeyId" => $accessKeyId,
"accessKeySecret" => $accessKeySecret
]);
// 2、訪問的域名。注意:這個(gè)地方需要求改為相應(yīng)類目的域名,參考:http://m.bestwisewords.com/document_detail/143103.html
$config->endpoint = "ocr.cn-shanghai.aliyuncs.com";
// 3、這里只是以ocr為例,其他能力請(qǐng)引入相應(yīng)類目的Client類
return new Ocr($config);
}
/**
* @param string[] $args
* @return void
*/
public static function main($args) {
//4、創(chuàng)建AccessKey ID和AccessKey Secret,請(qǐng)參考http://m.bestwisewords.com/document_detail/175144.html。
// 如果您用的是RAM用戶的AccessKey,還需要為RAM用戶授予權(quán)限AliyunVIAPIFullAccess,請(qǐng)參考http://m.bestwisewords.com/document_detail/145025.html。
// 從環(huán)境變量讀取配置的AccessKey ID和AccessKey Secret。運(yùn)行示例前必須先配置環(huán)境變量。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
// 5、這里只是以ocr下的RecognizeBankCard為例,其他能力請(qǐng)使用相應(yīng)類目的包和類,具體入?yún)⒃O(shè)置需要參考具體能力的文檔
$recognizeBankCardRequest = new RecognizeBankCardRequest();
$recognizeBankCardRequest->imageURL = "http://viapi-test.oss-cn-shanghai.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg";
$runtime = new RuntimeOptions([]);
try {
// 6、這里只是以ocr下的RecognizeBankCard為例,其他能力請(qǐng)使用相應(yīng)類目的包和類,注意,recognizeBankCardWithOptions方法名也需要改成對(duì)應(yīng)能力的方法名。方法名是根據(jù)能力名稱按照一定規(guī)范形成的,如能力名稱為SegmentCommonImage,對(duì)應(yīng)方法名應(yīng)該為segmentCommonImageWithOptions。
$resp = $client->recognizeBankCardWithOptions($recognizeBankCardRequest, $runtime);
# 獲取整體結(jié)果
echo Utils::toJSONString($resp->body);
# 獲取單個(gè)字段,這里只是一個(gè)例子,具體能力下的字段需要看具體能力的文檔
echo Utils::toJSONString($resp->body->data->cardNumber);
} catch (Exception $exception) {
# 獲取整體報(bào)錯(cuò)信息
echo Utils::toJSONString($exception);
# 獲取單個(gè)字段
echo $exception->getCode();
}
}
}
// 引入autoload.php
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
require_once $path;
}
Sample::main(array_slice($argv, 1));
需要修改的地方均在上述代碼注釋中標(biāo)明,總結(jié)如下:
引入包的時(shí)候,需要引入相應(yīng)類目的包和相關(guān)類。包名可參考上文SDK包名稱,能力名稱可參考對(duì)應(yīng)API文檔中的Action參數(shù)。
例如,您想使用通用分割能力,通過(guò)通用分割A(yù)PI文檔可知該能力屬于分割摳圖類目(imageseg20191230),能力名稱為SegmentCommonImage,您需要將代碼中的ocr20191230改為imageseg20191230,將RecognizeBankCard改為SegmentCommonImage。
訪問的域名一定要修改為相應(yīng)類目的域名,如果域名類目不匹配會(huì)報(bào)錯(cuò)
InvalidAction.NotFound
。關(guān)于域名詳情,請(qǐng)參見訪問域名。Client類需要使用相應(yīng)類目的包下面的Client類。
Request和Response需要使用相應(yīng)類目的包和類。
調(diào)用Client的方法時(shí),方法名需要改成對(duì)應(yīng)能力的方法名。方法名是根據(jù)能力名稱按照一定規(guī)范形成的。例如,能力名稱為SegmentCommonImage,對(duì)應(yīng)方法名應(yīng)該為segmentCommonImageWithOptions。
文件在本地或可訪問的URL
文件在本地、文件不在同一地域與文件在同地域區(qū)別在于需要使用xxxAdvanceRequest,文件是以Stream形式通過(guò)imageURLObject參數(shù)傳入。
<?php
// 1、這里只是以ocr下的RecognizeBankCard能力為例,其他能力請(qǐng)引入相應(yīng)類目的包和相關(guān)類。包名可參考本文檔上方的SDK包名稱,能力名可參考對(duì)應(yīng)API文檔中的Action參數(shù)。例如您想使用通用分割,其文檔為http://m.bestwisewords.com/document_detail/151960.html,可以知道該能力屬于分割摳圖類目,能力名稱為SegmentCommonImage,那么您需要將代碼中Ocr改為Imageseg,將RecognizeBankCard改為SegmentCommonImage。版本號(hào)V20191230如果有變化也需要修改。
use AlibabaCloud\SDK\Ocr\V20191230\Ocr;
use AlibabaCloud\SDK\Ocr\V20191230\Models\RecognizeBankCardAdvanceRequest;
use AlibabaCloud\Tea\Utils\Utils;
use Darabonba\OpenApi\Models\Config;
use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
use GuzzleHttp\Psr7\Stream;
class Sample {
/**
* 使用AK&SK初始化賬號(hào)Client
* @param string $accessKeyId
* @param string $accessKeySecret
* @return Ocr Client
*/
public static function createClient($accessKeyId, $accessKeySecret){
//初始化配置對(duì)象Darabonba\OpenApi\Models\Config。
//Config對(duì)象存放accessKeyId、accessKeySecret、endpoint等配置
$config = new Config([
"accessKeyId" => $accessKeyId,
"accessKeySecret" => $accessKeySecret
]);
// 2、訪問的域名。注意:這個(gè)地方需要求改為相應(yīng)類目的域名,參考:http://m.bestwisewords.com/document_detail/143103.html
$config->endpoint = "ocr.cn-shanghai.aliyuncs.com";
// 3、這里只是以ocr為例,其他能力請(qǐng)引入相應(yīng)類目的Client類
return new Ocr($config);
}
/**
* @param string[] $args
* @return void
*/
public static function main($args) {
//4、創(chuàng)建AccessKey ID和AccessKey Secret,請(qǐng)參考http://m.bestwisewords.com/document_detail/175144.html。
// 如果您用的是RAM用戶的AccessKey,還需要為RAM用戶授予權(quán)限AliyunVIAPIFullAccess,請(qǐng)參考http://m.bestwisewords.com/document_detail/145025.html。
// 從環(huán)境變量讀取配置的AccessKey ID和AccessKey Secret。運(yùn)行示例前必須先配置環(huán)境變量。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$runtime = new RuntimeOptions([]);
// 5、這里只是以ocr下的RecognizeBankCard為例,其他能力請(qǐng)使用相應(yīng)類目的包和類,具體入?yún)⒃O(shè)置需要參考具體能力的文檔
$recognizeBankCardAdvanceRequest = new RecognizeBankCardAdvanceRequest();
// 場(chǎng)景一,使用本地文件
$file = fopen('/tmp/bankCard.png', 'rb');
// 場(chǎng)景二,使用任意可訪問的url
// $file = fopen('https://viapi-test-bj.oss-cn-beijing.aliyuncs.com/viapi-3.0domepic/ocr/RecognizeBankCard/yhk1.jpg', 'rb');
$stream = new Stream($file);
$recognizeBankCardAdvanceRequest->imageURLObject = $stream;
try {
// 6、這里只是以ocr下的RecognizeBankCard為例,其他能力請(qǐng)使用相應(yīng)類目的包和類,注意,recognizeBankCardAdvance方法名也需要改成對(duì)應(yīng)能力的方法名。方法名是根據(jù)能力名稱按照一定規(guī)范形成的,如能力名稱為SegmentCommonImage,對(duì)應(yīng)方法名應(yīng)該為segmentCommonImageAdvance。
$resp = $client->recognizeBankCardAdvance($recognizeBankCardAdvanceRequest, $runtime);
# 獲取整體結(jié)果
echo Utils::toJSONString($resp->body);
# 獲取單個(gè)字段,這里只是一個(gè)例子,具體能力下的字段需要看具體能力的文檔
echo Utils::toJSONString($resp->body->data->cardNumber);
} catch (Exception $exception) {
# 獲取整體報(bào)錯(cuò)信息
echo Utils::toJSONString($exception);
# 獲取單個(gè)字段
echo $exception->getCode();
}
}
}
// 引入autoload.php
$path = __DIR__ . \DIRECTORY_SEPARATOR . '..' . \DIRECTORY_SEPARATOR . 'vendor' . \DIRECTORY_SEPARATOR . 'autoload.php';
if (file_exists($path)) {
require_once $path;
}
Sample::main(array_slice($argv, 1));
需要修改的地方均在上述代碼注釋中標(biāo)明,總結(jié)如下:
引入包的時(shí)候,需要引入相應(yīng)類目的包和相關(guān)類。包名可參考上文SDK包名稱,能力名稱可參考對(duì)應(yīng)API文檔中的Action參數(shù)。
例如,您想使用通用分割能力,通過(guò)通用分割A(yù)PI文檔可知該能力屬于分割摳圖類目(imageseg20191230),能力名稱為SegmentCommonImage,您需要將代碼中的ocr20191230改為imageseg20191230,將RecognizeBankCard改為SegmentCommonImage。
訪問的域名一定要修改為相應(yīng)類目的域名,如果域名類目不匹配會(huì)報(bào)錯(cuò)
InvalidAction.NotFound
。關(guān)于域名詳情,請(qǐng)參見訪問域名。Client類需要使用相應(yīng)類目的包下面的Client類。
Request和Response需要使用相應(yīng)類目的包和類。
調(diào)用Client的方法時(shí),方法名需要改成對(duì)應(yīng)能力的方法名。方法名是根據(jù)能力名稱按照一定規(guī)范形成。例如,能力名稱為SegmentCommonImage,對(duì)應(yīng)方法名應(yīng)該為segmentCommonImageAdvance。
常見問題
如果安裝composer require alibabacloud/facebody-20191230的SDK或者其他SDK時(shí)出現(xiàn)類似以下問題,可以按照本文提供的解決方案進(jìn)行排查處理。
需要注意的是,安裝SDK后會(huì)生成vendor目錄,在該目錄下不要放項(xiàng)目代碼,項(xiàng)目代碼和vendor是同級(jí)關(guān)系。如下圖所示,src中為代碼,vendor是安裝SDK后生成的。
報(bào)錯(cuò)Problem 1...如何解決?
報(bào)錯(cuò)信息
Problem 1
- alibabacloud/tea-oss-utils 0.3.0 requires guzzlehttp/psr7 ^1.0 -> found guzzlehttp/psr7[1.0.0, ..., 1.9.0] but the package is fixed to 2.4.3 (lock file version) by a partial update and that version does not match. Make sure you list it as an argument for the update command.
解決方案
因目前SDK只支持1.x版本的Psr7,在PHP 8環(huán)境中安裝需要將Psr7版本降到1.x版本,例如1.9.0版本。具體命令如下:
composer require guzzlehttp/psr7 1.9.0
說(shuō)明因?yàn)閜sr7依賴guzzlehttp/guzzle,要求guzzlehttp/psr7: ^1.9 || ^2.4,更改版本不會(huì)影響SDK使用。
若以上步驟仍無(wú)法解決,可以通過(guò)調(diào)用能力的在線調(diào)試入口下載完整工程在項(xiàng)目中引入,在引入工程中,復(fù)制README.md文件里面的PHP命令,可直接運(yùn)行以及下載SDK依賴。
composer install && php src/Sample.php
說(shuō)明阿里云視覺智能開放平臺(tái)各類目視覺AI能力SDK接入、接口使用或問題咨詢等,請(qǐng)通過(guò)釘釘群(23109592)加入阿里云視覺智能開放平臺(tái)咨詢?nèi)郝?lián)系我們。
報(bào)錯(cuò)Problem 2...如何解決?
報(bào)錯(cuò)信息
Problem 2
- Root composer.json requires alibabacloud/facebody-20191230 3.0.3 -> satisfiable by alibabacloud/facebody-20191230[3.0.3].
- alibabacloud/facebody-20191230 3.0.3 requires alibabacloud/tea-oss-utils ^0.3.0 -> found alibabacloud/tea-oss-utils[dev-master, 0.1.0, ..., 0.2.3] but it does not match the constraint.
解決方案
可能是鏡像站的原因?qū)е聢?bào)錯(cuò)。
composer config -g repo.packagist composer https://repo.packagist.org。
composer require 需安裝的包依賴。例如:alibabacloud/facebody-20191230。
若以上步驟仍無(wú)法解決,可以通過(guò)調(diào)用能力的在線調(diào)試入口下載完整工程在項(xiàng)目中引入,在引入工程中,復(fù)制README.md文件里面的PHP命令,可直接運(yùn)行以及下載SDK依賴。
composer install && php src/Sample.php
調(diào)用報(bào)錯(cuò)如何解決?
如果您的調(diào)用出現(xiàn)報(bào)錯(cuò),請(qǐng)先嘗試升級(jí)SDK包到最新版本,最新版本請(qǐng)參考各類目SDK鏈接。如果您的程序中同時(shí)引入了多個(gè)類目的包,也可以先嘗試將這些包都升級(jí)到最新版本,避免版本之間的包沖突問題。
OpenAPI界面顯示的最新包在packagist倉(cāng)庫(kù)中找不到如何解決?
如果您發(fā)現(xiàn)OpenAPI界面顯示的最新版本的包,在packagist倉(cāng)庫(kù)中找不到,這是因?yàn)樾掳姹镜陌鼊倓偘l(fā)布,倉(cāng)庫(kù)同步可能會(huì)有延遲,如果遇到版本不存在的情況,請(qǐng)稍后再試或使用packagist倉(cāng)庫(kù)中的最新版本。
報(bào)錯(cuò)array_slice() expects parameter 1 to be array, null given in如何解決?
為了結(jié)構(gòu)統(tǒng)一,預(yù)留了一個(gè)數(shù)組入?yún)?。需要?duì)代碼進(jìn)行如下修改:
Sample::main(array_slice($argv, 1));
中刪除array_slice($argv, 1)
,保留Sample::main()
。public static function main($args){}
的main方法中刪除$args
。
綜上可解決報(bào)錯(cuò)問題。
報(bào)錯(cuò)RuntimeOptions包引入錯(cuò)誤應(yīng)如何解決?
報(bào)錯(cuò)信息
解決方案
該問題是因?yàn)镽untimeOptions的包一般手動(dòng)引入依賴時(shí)出現(xiàn)引入錯(cuò)誤,正確的包是在use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
路徑下,刪除OSSUtils\RuntimeOptions
的包后,只留Tea\Utils\Utils\RuntimeOptions
的包。
在PHP中調(diào)用接口報(bào)錯(cuò)鏈接訪問失敗如何解決?
報(bào)錯(cuò)信息
在PHP中調(diào)用接口時(shí)返回鏈接為http:\/\/vibktprfx-prod-prod-damo-eas-cn-shanghai.oss-cn-shanghai.aliyuncs.com
,復(fù)制并直接訪問該鏈接,會(huì)提示鏈接訪問失敗的提示信息,如下圖所示:
解決方案
該問題是由于編譯環(huán)境的問題字符//
被轉(zhuǎn)義導(dǎo)致,您可以通過(guò)打印單獨(dú)的imageURL
參數(shù)獲取可訪問的URL。例如,$resp->body->data->imageURL
。
PHP忽略證書報(bào)錯(cuò)如何解決?
報(bào)錯(cuò)信息
解決方案
升級(jí)版SDK可以通過(guò)在Client中設(shè)置OpenAPI的請(qǐng)求協(xié)議(Client設(shè)置的優(yōu)先級(jí)高于默認(rèn)設(shè)置),忽略證書通過(guò)設(shè)置運(yùn)行參數(shù),默認(rèn)忽略證書報(bào)錯(cuò),具體參見HTTPS 請(qǐng)求配置。
關(guān)于PHP在Windows獲取證書的邏輯,依賴于php.ini文件的配置,具體請(qǐng)參見Guzzle。
并非所有的系統(tǒng)磁盤上都存在CA包,例如,Windows和OS X并沒有通用的本地CA包。當(dāng)設(shè)置verify為true
時(shí),Guzzle將盡力在您的操作系統(tǒng)中找到合適的CA包,當(dāng)使用cURL或PHP 5.6以上版本的流時(shí),Guzzle將按以下順序嘗試查找CA包:
檢查php.ini文件中是否設(shè)置了
openssl.cafile
。檢查php.ini文件中是否設(shè)置了
curl.cainfo
。檢查
/etc/pki/tls/certs/ca-bundle.crt
是否存在( Red Hat、CentOS、Fedora由ca-certificates包提供)。檢查
/etc/ssl/certs/ca-certificates.crt
是否存在(Ubuntu、Debian由ca-certificates包提供)。檢查
/usr/local/share/certs/ca-root-nss.crt
是否存在(FreeBSD、由ca_root_nss包提供)。檢查
/usr/local/etc/openssl/cert.pem
是否存在(OS X由homebrew提供)。檢查
C:\windows\system32\curl-ca-bundle.crt
是否存在(Windows)。檢查
C:\windows\curl-ca-bundle.crt
是否存在(Windows)。
技術(shù)支持
如果以上方法未能解決您的問題,請(qǐng)通過(guò)搜索釘釘群號(hào)(23109592)加入阿里云視覺智能開放平臺(tái)咨詢?nèi)郝?lián)系我們。屆時(shí)會(huì)有專業(yè)的技術(shù)人員與您對(duì)接解決問題。