本文為您介紹如何使用阿里云視覺智能開放平臺相關服務的PHP SDK,包括SDK的獲取和安裝方法,以及SDK代碼示例。
阿里云視覺智能開放平臺各類目視覺AI能力SDK接入、接口使用或問題咨詢等,請通過釘釘群(23109592)加入阿里云視覺智能開放平臺咨詢群聯系我們。
該版本SDK最低環境要求PHP 5.6,如不滿足請升級PHP版本。
準備工作
在安裝和使用阿里云SDK前,確保您已經注冊阿里云賬號并生成訪問密鑰(AccessKey)。具體操作,請參見創建AccessKey。
安裝相應AI類目的SDK包。 具體操作步驟如下:
下載并安裝Composer:
curl -sS https://getcomposer.org/installer | php
。執行Composer命令安裝相應類目SDK包的最新版本,例如人臉人體服務:
php composer.phar require alibabacloud/facebody-20191230
。詳細信息可參照如下表格。在代碼中引入Composer自動加載工具:
<?php require __DIR__ . '/vendor/autoload.php';
。說明PHP: >=5.5
AI類目
SDK鏈接
Github鏈接
生成專區
人臉人體
文字識別
商品理解
內容審核
圖像識別
圖像生產
分割摳圖
目標檢測
視覺搜索
圖像分析處理
視頻生產
視頻理解
視頻分割
異步任務管理
人臉核身服務端20200910專用版本
配置環境變量
配置環境變量ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
阿里云賬號AccessKey擁有所有API的訪問權限,建議您使用RAM用戶進行API訪問或日常運維,具體操作,請參見創建RAM用戶。
請不要將AccessKey ID和AccessKey Secret保存到工程代碼里,否則可能導致AccessKey泄露,威脅您賬號下所有資源的安全。
Linux和macOS系統配置方法
在IntelliJ IDEA中打開終端Terminal。
執行以下命令,配置環境變量。
<access_key_id>
需替換為您RAM用戶的AccessKey ID,<access_key_secret>
替換為您RAM用戶的AccessKey Secret。如果后續需要進行更多權限相關的配置,具體操作請參見使用RAM Policy控制訪問權限。export ALIBABA_CLOUD_ACCESS_KEY_ID=<access_key_id> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<access_key_secret>
Windows系統配置方法
新建環境變量文件,添加環境變量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并寫入已準備好的AccessKey ID和AccessKey Secret。然后重啟Windows系統。本操作以Windows 10為例進行說明。打開文件資源管理器,在此電腦上右鍵單擊屬性。
在右側導航欄,單擊高級系統配置。
在系統屬性對話框的高級頁簽下,單擊環境變量。
在環境變量對話框中,單擊新建(W)。
在彈出的新建系統變量對話框中,添加環境變量
ALIBABA_CLOUD_ACCESS_KEY_ID
和ALIBABA_CLOUD_ACCESS_KEY_SECRET
,并寫入已準備好的AccessKey ID和AccessKey Secret。重啟Windows系統,使配置生效。
代碼示例
本文以RecognizeBankCard為例。
文件在上海地域OSS
每個類目的訪問域名與對應Region開通能力,請參見訪問域名。
<?php
// 1、這里只是以ocr下的RecognizeBankCard能力為例,其他能力請引入相應類目的包和相關類。包名可參考本文檔上方的SDK包名稱,能力名可參考對應API文檔中的Action參數。例如您想使用通用分割,其文檔為http://bestwisewords.com/document_detail/151960.html,可以知道該能力屬于分割摳圖類目,能力名稱為SegmentCommonImage,那么您需要將代碼中Ocr改為Imageseg,將RecognizeBankCard改為SegmentCommonImage。版本號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初始化賬號Client
* @param string $accessKeyId
* @param string $accessKeySecret
* @return Ocr Client
*/
public static function createClient($accessKeyId, $accessKeySecret){
//初始化配置對象Darabonba\OpenApi\Models\Config。
//Config對象存放accessKeyId、accessKeySecret、endpoint等配置
$config = new Config([
"accessKeyId" => $accessKeyId,
"accessKeySecret" => $accessKeySecret
]);
// 2、訪問的域名。注意:這個地方需要求改為相應類目的域名,參考:http://bestwisewords.com/document_detail/143103.html
$config->endpoint = "ocr.cn-shanghai.aliyuncs.com";
// 3、這里只是以ocr為例,其他能力請引入相應類目的Client類
return new Ocr($config);
}
/**
* @param string[] $args
* @return void
*/
public static function main($args) {
//4、創建AccessKey ID和AccessKey Secret,請參考http://bestwisewords.com/document_detail/175144.html。
// 如果您用的是RAM用戶的AccessKey,還需要為RAM用戶授予權限AliyunVIAPIFullAccess,請參考http://bestwisewords.com/document_detail/145025.html。
// 從環境變量讀取配置的AccessKey ID和AccessKey Secret。運行示例前必須先配置環境變量。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
// 5、這里只是以ocr下的RecognizeBankCard為例,其他能力請使用相應類目的包和類,具體入參設置需要參考具體能力的文檔
$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為例,其他能力請使用相應類目的包和類,注意,recognizeBankCardWithOptions方法名也需要改成對應能力的方法名。方法名是根據能力名稱按照一定規范形成的,如能力名稱為SegmentCommonImage,對應方法名應該為segmentCommonImageWithOptions。
$resp = $client->recognizeBankCardWithOptions($recognizeBankCardRequest, $runtime);
# 獲取整體結果
echo Utils::toJSONString($resp->body);
# 獲取單個字段,這里只是一個例子,具體能力下的字段需要看具體能力的文檔
echo Utils::toJSONString($resp->body->data->cardNumber);
} catch (Exception $exception) {
# 獲取整體報錯信息
echo Utils::toJSONString($exception);
# 獲取單個字段
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));
需要修改的地方均在上述代碼注釋中標明,總結如下:
引入包的時候,需要引入相應類目的包和相關類。包名可參考上文SDK包名稱,能力名稱可參考對應API文檔中的Action參數。
例如,您想使用通用分割能力,通過通用分割API文檔可知該能力屬于分割摳圖類目(imageseg20191230),能力名稱為SegmentCommonImage,您需要將代碼中的ocr20191230改為imageseg20191230,將RecognizeBankCard改為SegmentCommonImage。
訪問的域名一定要修改為相應類目的域名,如果域名類目不匹配會報錯
InvalidAction.NotFound
。關于域名詳情,請參見訪問域名。Client類需要使用相應類目的包下面的Client類。
Request和Response需要使用相應類目的包和類。
調用Client的方法時,方法名需要改成對應能力的方法名。方法名是根據能力名稱按照一定規范形成的。例如,能力名稱為SegmentCommonImage,對應方法名應該為segmentCommonImageWithOptions。
文件在本地或可訪問的URL
文件在本地、文件不在同一地域與文件在同地域區別在于需要使用xxxAdvanceRequest,文件是以Stream形式通過imageURLObject參數傳入。
<?php
// 1、這里只是以ocr下的RecognizeBankCard能力為例,其他能力請引入相應類目的包和相關類。包名可參考本文檔上方的SDK包名稱,能力名可參考對應API文檔中的Action參數。例如您想使用通用分割,其文檔為http://bestwisewords.com/document_detail/151960.html,可以知道該能力屬于分割摳圖類目,能力名稱為SegmentCommonImage,那么您需要將代碼中Ocr改為Imageseg,將RecognizeBankCard改為SegmentCommonImage。版本號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初始化賬號Client
* @param string $accessKeyId
* @param string $accessKeySecret
* @return Ocr Client
*/
public static function createClient($accessKeyId, $accessKeySecret){
//初始化配置對象Darabonba\OpenApi\Models\Config。
//Config對象存放accessKeyId、accessKeySecret、endpoint等配置
$config = new Config([
"accessKeyId" => $accessKeyId,
"accessKeySecret" => $accessKeySecret
]);
// 2、訪問的域名。注意:這個地方需要求改為相應類目的域名,參考:http://bestwisewords.com/document_detail/143103.html
$config->endpoint = "ocr.cn-shanghai.aliyuncs.com";
// 3、這里只是以ocr為例,其他能力請引入相應類目的Client類
return new Ocr($config);
}
/**
* @param string[] $args
* @return void
*/
public static function main($args) {
//4、創建AccessKey ID和AccessKey Secret,請參考http://bestwisewords.com/document_detail/175144.html。
// 如果您用的是RAM用戶的AccessKey,還需要為RAM用戶授予權限AliyunVIAPIFullAccess,請參考http://bestwisewords.com/document_detail/145025.html。
// 從環境變量讀取配置的AccessKey ID和AccessKey Secret。運行示例前必須先配置環境變量。
$accessKeyId = getenv('ALIBABA_CLOUD_ACCESS_KEY_ID');
$accessKeySecret = getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET');
$runtime = new RuntimeOptions([]);
// 5、這里只是以ocr下的RecognizeBankCard為例,其他能力請使用相應類目的包和類,具體入參設置需要參考具體能力的文檔
$recognizeBankCardAdvanceRequest = new RecognizeBankCardAdvanceRequest();
// 場景一,使用本地文件
$file = fopen('/tmp/bankCard.png', 'rb');
// 場景二,使用任意可訪問的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為例,其他能力請使用相應類目的包和類,注意,recognizeBankCardAdvance方法名也需要改成對應能力的方法名。方法名是根據能力名稱按照一定規范形成的,如能力名稱為SegmentCommonImage,對應方法名應該為segmentCommonImageAdvance。
$resp = $client->recognizeBankCardAdvance($recognizeBankCardAdvanceRequest, $runtime);
# 獲取整體結果
echo Utils::toJSONString($resp->body);
# 獲取單個字段,這里只是一個例子,具體能力下的字段需要看具體能力的文檔
echo Utils::toJSONString($resp->body->data->cardNumber);
} catch (Exception $exception) {
# 獲取整體報錯信息
echo Utils::toJSONString($exception);
# 獲取單個字段
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));
需要修改的地方均在上述代碼注釋中標明,總結如下:
引入包的時候,需要引入相應類目的包和相關類。包名可參考上文SDK包名稱,能力名稱可參考對應API文檔中的Action參數。
例如,您想使用通用分割能力,通過通用分割API文檔可知該能力屬于分割摳圖類目(imageseg20191230),能力名稱為SegmentCommonImage,您需要將代碼中的ocr20191230改為imageseg20191230,將RecognizeBankCard改為SegmentCommonImage。
訪問的域名一定要修改為相應類目的域名,如果域名類目不匹配會報錯
InvalidAction.NotFound
。關于域名詳情,請參見訪問域名。Client類需要使用相應類目的包下面的Client類。
Request和Response需要使用相應類目的包和類。
調用Client的方法時,方法名需要改成對應能力的方法名。方法名是根據能力名稱按照一定規范形成。例如,能力名稱為SegmentCommonImage,對應方法名應該為segmentCommonImageAdvance。
常見問題
如果安裝composer require alibabacloud/facebody-20191230的SDK或者其他SDK時出現類似以下問題,可以按照本文提供的解決方案進行排查處理。
需要注意的是,安裝SDK后會生成vendor目錄,在該目錄下不要放項目代碼,項目代碼和vendor是同級關系。如下圖所示,src中為代碼,vendor是安裝SDK后生成的。
報錯Problem 1...如何解決?
報錯信息
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環境中安裝需要將Psr7版本降到1.x版本,例如1.9.0版本。具體命令如下:
composer require guzzlehttp/psr7 1.9.0
說明因為psr7依賴guzzlehttp/guzzle,要求guzzlehttp/psr7: ^1.9 || ^2.4,更改版本不會影響SDK使用。
若以上步驟仍無法解決,可以通過調用能力的在線調試入口下載完整工程在項目中引入,在引入工程中,復制README.md文件里面的PHP命令,可直接運行以及下載SDK依賴。
composer install && php src/Sample.php
說明阿里云視覺智能開放平臺各類目視覺AI能力SDK接入、接口使用或問題咨詢等,請通過釘釘群(23109592)加入阿里云視覺智能開放平臺咨詢群聯系我們。
報錯Problem 2...如何解決?
報錯信息
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.
解決方案
可能是鏡像站的原因導致報錯。
composer config -g repo.packagist composer https://repo.packagist.org。
composer require 需安裝的包依賴。例如:alibabacloud/facebody-20191230。
若以上步驟仍無法解決,可以通過調用能力的在線調試入口下載完整工程在項目中引入,在引入工程中,復制README.md文件里面的PHP命令,可直接運行以及下載SDK依賴。
composer install && php src/Sample.php
調用報錯如何解決?
如果您的調用出現報錯,請先嘗試升級SDK包到最新版本,最新版本請參考各類目SDK鏈接。如果您的程序中同時引入了多個類目的包,也可以先嘗試將這些包都升級到最新版本,避免版本之間的包沖突問題。
OpenAPI界面顯示的最新包在packagist倉庫中找不到如何解決?
如果您發現OpenAPI界面顯示的最新版本的包,在packagist倉庫中找不到,這是因為新版本的包剛剛發布,倉庫同步可能會有延遲,如果遇到版本不存在的情況,請稍后再試或使用packagist倉庫中的最新版本。
報錯array_slice() expects parameter 1 to be array, null given in如何解決?
為了結構統一,預留了一個數組入參。需要對代碼進行如下修改:
Sample::main(array_slice($argv, 1));
中刪除array_slice($argv, 1)
,保留Sample::main()
。public static function main($args){}
的main方法中刪除$args
。
綜上可解決報錯問題。
報錯RuntimeOptions包引入錯誤應如何解決?
報錯信息
解決方案
該問題是因為RuntimeOptions的包一般手動引入依賴時出現引入錯誤,正確的包是在use AlibabaCloud\Tea\Utils\Utils\RuntimeOptions;
路徑下,刪除OSSUtils\RuntimeOptions
的包后,只留Tea\Utils\Utils\RuntimeOptions
的包。
在PHP中調用接口報錯鏈接訪問失敗如何解決?
報錯信息
在PHP中調用接口時返回鏈接為http:\/\/vibktprfx-prod-prod-damo-eas-cn-shanghai.oss-cn-shanghai.aliyuncs.com
,復制并直接訪問該鏈接,會提示鏈接訪問失敗的提示信息,如下圖所示:
解決方案
該問題是由于編譯環境的問題字符//
被轉義導致,您可以通過打印單獨的imageURL
參數獲取可訪問的URL。例如,$resp->body->data->imageURL
。
PHP忽略證書報錯如何解決?
報錯信息
解決方案
升級版SDK可以通過在Client中設置OpenAPI的請求協議(Client設置的優先級高于默認設置),忽略證書通過設置運行參數,默認忽略證書報錯,具體參見HTTPS 請求配置。
關于PHP在Windows獲取證書的邏輯,依賴于php.ini文件的配置,具體請參見Guzzle。
并非所有的系統磁盤上都存在CA包,例如,Windows和OS X并沒有通用的本地CA包。當設置verify為true
時,Guzzle將盡力在您的操作系統中找到合適的CA包,當使用cURL或PHP 5.6以上版本的流時,Guzzle將按以下順序嘗試查找CA包:
檢查php.ini文件中是否設置了
openssl.cafile
。檢查php.ini文件中是否設置了
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)。
技術支持
如果以上方法未能解決您的問題,請通過搜索釘釘群號(23109592)加入阿里云視覺智能開放平臺咨詢群聯系我們。屆時會有專業的技術人員與您對接解決問題。