PHP

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

说明

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

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

准备工作

配置环境变量

配置环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET

重要
  • 阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维,具体操作,请参见创建RAM用户

  • 请不要将AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。

  • Linux和macOS系统配置方法

    1. 在IntelliJ IDEA中打开终端Terminal。

    2. 执行以下命令,配置环境变量。

      <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_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。然后重启Windows系统。本操作以Windows 10为例进行说明。

    1. 打开文件资源管理器,在此电脑上右键单击属性。

    2. 在右侧导航栏,单击高级系统配置

    3. 系统属性对话框的高级页签下,单击环境变量

    4. 环境变量对话框中,单击新建(W)image.png

    5. 在弹出的新建系统变量对话框中,添加环境变量ALIBABA_CLOUD_ACCESS_KEY_IDALIBABA_CLOUD_ACCESS_KEY_SECRET,并写入已准备好的AccessKey ID和AccessKey Secret。

    6. 重启Windows系统,使配置生效。

代码示例

本文以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){
      //初始化配置对象Darabonba\OpenApi\Models\Config。
      //Config对象存放accessKeyId、accessKeySecret、endpoint等配置  
      $config = new Config([
            "accessKeyId" => $accessKeyId,
            "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、创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
        // 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.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));
说明

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

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

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

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

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

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

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

文件在本地或可访问的URL

重要

文件在本地、文件不在同一地域与文件在同地域区别在于需要使用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){
        //初始化配置对象Darabonba\OpenApi\Models\Config。
        //Config对象存放accessKeyId、accessKeySecret、endpoint等配置  
        $config = new Config([
            "accessKeyId" => $accessKeyId,
            "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、创建AccessKey ID和AccessKey Secret,请参考https://help.aliyun.com/document_detail/175144.html。
        // 如果您用的是RAM用户的AccessKey,还需要为RAM用户授予权限AliyunVIAPIFullAccess,请参考https://help.aliyun.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));
说明

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

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

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

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

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

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

  5. 调用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

综上可解决报错问题。

报错RuntimeOptions包引入错误应如何解决?

报错信息

image

解决方案

该问题是因为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,复制并直接访问该链接,会提示链接访问失败的提示信息,如下图所示:

image

解决方案

该问题是由于编译环境的问题字符//被转义导致,您可以通过打印单独的imageURL参数获取可访问的URL。例如,$resp->body->data->imageURL

PHP忽略证书报错如何解决?

报错信息

image

解决方案

升级版SDK可以通过在Client中设置OpenAPI的请求协议(Client设置的优先级高于默认设置),忽略证书通过设置运行参数,默认忽略证书报错,具体参见HTTPS 请求配置

关于PHP在Windows获取证书的逻辑,依赖于php.ini文件的配置,具体请参见Guzzle

并非所有的系统磁盘上都存在CA包,例如,Windows和OS X并没有通用的本地CA包。当设置verifytrue时,Guzzle将尽力在您的操作系统中找到合适的CA包,当使用cURL或PHP 5.6以上版本的流时,Guzzle将按以下顺序尝试查找CA包:

  1. 检查php.ini文件中是否设置了openssl.cafile

  2. 检查php.ini文件中是否设置了curl.cainfo

  3. 检查/etc/pki/tls/certs/ca-bundle.crt是否存在( Red Hat、CentOS、Fedora由ca-certificates包提供)。

  4. 检查/etc/ssl/certs/ca-certificates.crt是否存在(Ubuntu、Debian由ca-certificates包提供)。

  5. 检查/usr/local/share/certs/ca-root-nss.crt是否存在(FreeBSD、由ca_root_nss包提供)。

  6. 检查/usr/local/etc/openssl/cert.pem是否存在(OS X由homebrew提供)。

  7. 检查C:\windows\system32\curl-ca-bundle.crt是否存在(Windows)。

  8. 检查C:\windows\curl-ca-bundle.crt是否存在(Windows)。

技术支持

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