PHP

本文为您介绍如何使用阿里云视觉智能开放平台相关服务的PHP SDK,包括SDK的获取和安装方法,以及SDK代码示例。

说明

阿里云视觉智能开放平台各类目视觉AI能力SDK接入、接口使用或问题咨询等,请通过钉钉群(23109592)加入阿里云视觉智能开放平台咨询群联系我们。

该版本SDK最低环境要求PHP 5.6,如不满足请升级PHP版本。

准备工作

代码示例

本文以RecognizeBankCard为例。

文件在同地域OSS

说明

每个类目的访问域名与对应Region开通能力,请参见访问域名

<?php
// 1、这里只是以ocr下的RecognizeBankCard能力为例,其他能力请引入相应类目的包和相关类。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.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){
        $config = new Config([
            // 您的 AccessKey ID
            "accessKeyId" => $accessKeyId,
            // 您的 AccessKey Secret
            "accessKeySecret" => $accessKeySecret
        ]);
        // 2、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.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、"YOUR_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_SECRET" 的生成请参考https://help.aliyun.com/document_detail/175144.html
        // 如果您是用的子账号AccessKey,还需要为子账号授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
        $client = self::createClient("YOUR_ACCESS_KEY_ID", "YOUR_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));

需要修改的地方均在上述代码注释中标明,总结如下:

  1. 引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。

    例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。

  2. 访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错InvalidAction.NotFound。关于域名详情,请参见访问域名

  3. Client类需要使用相应类目的包下面的Client类。

  4. YOUR_ACCESS_KEY_IDYOUR_ACCESS_KEY_SECRET 的生成请参见创建AccessKey。如果您是用的子账号AccessKey,还需要为子账号授予权限AliyunVIAPIFullAccess,请参考使用RAM Policy控制访问权限

  5. Request和Response需要使用相应类目的包和类。

  6. 调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成的。例如,能力名称为SegmentCommonImage,对应方法名应该为segmentCommonImageWithOptions。

文件在本地或文件不在同一地域OSS

说明

文件在本地、文件不在同一地域与文件在同地域区别在于需要使用xxxAdvanceRequest,文件是以Stream形式通过imageURLObject参数传入。

<?php
// 1、这里只是以ocr下的RecognizeBankCard能力为例,其他能力请引入相应类目的包和相关类。包名可参考本文档上方的SDK包名称,能力名可参考对应API文档中的Action参数。例如您想使用通用分割,其文档为https://help.aliyun.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){
        $config = new Config([
            // 您的 AccessKey ID
            "accessKeyId" => $accessKeyId,
            // 您的 AccessKey Secret
            "accessKeySecret" => $accessKeySecret
        ]);
        // 2、访问的域名。注意:这个地方需要求改为相应类目的域名,参考:https://help.aliyun.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、"YOUR_ACCESS_KEY_ID", "YOUR_ACCESS_KEY_SECRET" 的生成请参考https://help.aliyun.com/document_detail/175144.html
        // 如果您是用的子账号AccessKey,还需要为子账号授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.com/document_detail/145025.html
        $client = self::createClient("YOUR_ACCESS_KEY_ID", "YOUR_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));

需要修改的地方均在上述代码注释中标明,总结如下:

  1. 引入包的时候,需要引入相应类目的包和相关类。包名可参考上文SDK包名称,能力名称可参考对应API文档中的Action参数。

    例如,您想使用通用分割能力,通过通用分割API文档可知该能力属于分割抠图类目(imageseg20191230),能力名称为SegmentCommonImage,您需要将代码中的ocr20191230改为imageseg20191230,将RecognizeBankCard改为SegmentCommonImage。

  2. 访问的域名一定要修改为相应类目的域名,如果域名类目不匹配会报错InvalidAction.NotFound。关于域名详情,请参见访问域名

  3. Client类需要使用相应类目的包下面的Client类。

  4. YOUR_ACCESS_KEY_IDYOUR_ACCESS_KEY_SECRET 的生成请参见创建AccessKey。如果您是用的子账号AccessKey,还需要为子账号授予权限AliyunVIAPIFullAccess,请参考使用RAM Policy控制访问权限

  5. Request和Response需要使用相应类目的包和类。

  6. 调用Client的方法时,方法名需要改成对应能力的方法名。方法名是根据能力名称按照一定规范形成。例如,能力名称为SegmentCommonImage,对应方法名应该为segmentCommonImageAdvance。

常见问题

如果安装composer require alibabacloud/facebody-20191230的SDK或者其他SDK时出现类似以下问题,可以按照本文提供的解决方案进行排查处理。

需要注意的是,安装SDK后会生成vendor目录,在该目录下不要放项目代码,项目代码和vendor是同级关系。如下图所示,src中为代码,vendor是安装SDK后生成的。

image

报错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.
image

解决方案

  1. 因目前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使用。

  2. 若以上步骤仍无法解决,可以通过调用能力的在线调试入口下载完整工程在项目中引入,在引入工程中,复制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.
image

解决方案

可能是镜像站的原因导致报错。

  1. composer config -g repo.packagist composer https://repo.packagist.org

  2. composer require 需安装的包依赖。例如:alibabacloud/facebody-20191230。

  3. 若以上步骤仍无法解决,可以通过调用能力的在线调试入口下载完整工程在项目中引入,在引入工程中,复制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

综上可解决报错问题。

技术支持

如果以上方法未能解决您的问题,请通过搜索钉钉群号(23109592)加入阿里云视觉智能开放平台咨询群联系我们。届时会有专业的技术人员与您对接解决问题。

阿里云首页 视觉智能开放平台 相关技术圈