andrey-tech/sendpulse-api-php

PHP7+ 简单封装,用于与 SendPulse API 服务交互,具有请求节流和文件日志记录功能

1.1.0 2021-02-08 07:16 UTC

This package is auto-updated.

Last update: 2024-09-08 15:34:56 UTC


README

SendPulse logo
Latest Stable Version Total Downloads License

PHP7+ 简单封装,用于与 REST API 服务 SendPulse 交互,具有请求节流、输出调试信息到 STDOUT 和文件日志记录功能。

内容

要求

  • PHP >= 7.0;
  • HTTP >= 3.0 - 具有请求节流、支持 JSON 格式消息体中的 BOM 标记、输出请求和响应调试信息到 STDOUT 的 HTTP(S) 客户端;
  • DebugLogger >= 2.0 - 将调试信息记录到文件,并包含使用的内存量和经过的时间;
  • 实现 PSR-4 标准的任意自动加载器类。

安装

通过 composer 安装

$ composer require andrey-tech/sendpulse-api-php:"^1.1"

或添加

"andrey-tech/sendpulse-api-php": "^1.1"

到 composer.json 文件的 require 部分。

SendPulseAPI

使用 \App\SendPulse\SendPulseAPI 类来处理 SendPulse REST API。
在发生错误时,抛出 \App\SendPulse\SendPulseAPIException 类的异常。
在当前类中,部分实现了以下 SendPulse 服务的操作方法

用户认证

认证用户的方法位于 \App\SendPulse\Auth 三元组中

  • auth(string $clientId, string $clientSecret) :string 执行客户端认证并返回个人密钥(令牌),该令牌也保存在令牌存储器中。
    • $clientId - 客户端 ID(用户);
    • $clientSecret - 客户端密钥(用户)。
use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();
    $sendPulse->auth($clientId, $clientSecret);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

令牌到期后,将自动获取新令牌,当 SendPulse API 的请求返回 HTTP 状态码 401 Unauthorized 的响应时。

存储令牌

使用实现 \App\SendPulse\TokenStorage\TokenStorageInterface 接口的类来保存和加载令牌。

TokenStorageInterface 接口

\App\SendPulse\TokenStorage\TokenStorageInterface 接口定义了两个方法

  • save(string $token, string $clientId, string $clientSecret) :void 保存令牌。
    • $token - 令牌;
    • $clientId - 客户端 ID;
    • $clientSecret - 客户端密钥。
  • load(string $clientId, string $clientSecret) :?string 加载令牌并返回它。当保存的令牌不存在时,方法应返回 null
    • $clientId - 客户端 ID;
    • $clientSecret - 客户端密钥。
  • hasToken(string $clientId, string $clientSecret) :bool 检查给定 $clientId$clientSecret 组合是否存在令牌。
    • $clientId - 客户端 ID;
    • $clientSecret - 客户端密钥。

TokenStorage

默认情况下,保存和加载令牌使用类 \App\SendPulse\TokenStorage\TokenStorage,该类将令牌存储在单独的文件中,每个文件对应于用于 auth() 方法授权的 $clientId$clientSecret 组合。该类实现了接口 \App\SendPulse\TokenStorage\TokenStorageInterface 并包含自己的方法。

  • __construct(string $storageFolder = 'tokens/') 类构造函数。
    • $storageFolder - 令牌文件存储的目录。

通过类 \App\SendPulse\TokenStorage\TokenStorage 的公共属性设置其他参数。

发生错误时,会抛出类 \App\SendPulse\TokenStorage\TokenStorageException 的异常。

使用自定义类保存令牌

使用自定义类保存令牌到数据库的示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();

    // Устанавливаем собственный объект класса, обеспечивающего хранение токенов в базе данных
    $sendPulse->tokenStorage = new \App\SendPulse\TokenStorage\DatabaseStorage();

    $sendPulse->auth($clientId, $clientSecret);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

自定义类 \App\SendPulse\TokenStorage\DatabaseStorage 的结构

namespace App\SendPulse\TokenStorage;

class DatabaseStorage implements TokenStorageInterface
{
    /**
     * Сохраняет токен
     * @param string  $token Токен
     * @param string $clientId ID клиента
     * @param string $clientSecret Секрет клиента
     * @return void
     * @throws TokenStorageException
     */
    public function save(string $token, string $clientId, string $clientSecret)
    {
        // Здесь токен сохраняется в базе данных
    }

    /**
     * Загружает токен
     * @param string $clientId ID клиента
     * @param string $clientSecret Секрет клиента
     * @return array|null
     * @throws TokenStorageException
     */
    public function load(string $clientId, string $clientSecret)
    {
        // Здесь токен извлекается из базы данных
    }

    /**
     * Проверяет существуют ли токен для заданного ID клиента и секрета клиента
     * @param string $clientId ID клиента
     * @param string $clientSecret Секрет клиента
     * @return bool
     * @throws TokenStorageException
     */
    public function hasToken(string $clientId, string $clientSecret): bool
    {
        // Здесь проверяется существование токена в базе данных
    }
}

操作通讯录的方法

用于操作地址簿的方法位于类 \App\SendPulse\Addressbooks

  • getAddressbook(int $id) :array 返回地址簿信息
    • $id - 地址簿的 ID。
  • getAddressbooks(int $limit = null, int $offset = null) :array 返回地址簿列表(不超过 100)。
    • $limit - 记录数量;
    • $offset - 输出偏移(从哪个记录开始显示)。
  • getAllAddressbooks() :\Generator 允许通过返回生成器来获取所有地址簿的列表。
  • addAddressbook(array $params) :int 添加地址簿 并返回地址簿的 ID。
    • $params - 地址簿的参数。
  • updateAddressbook(int $id, array $params) :array 更新地址簿
    • $id - 地址簿的 ID;
    • $params - 地址簿的参数。
  • deleteAddressbook(int $id) :array 删除地址簿
    • $id - 地址簿的 ID。
  • addAddressbookEmails(int $id, array $emails) :array 将电子邮件地址添加到地址簿
    • $id - 地址簿的 ID;
    • $emails - 电子邮件地址列表或联系人参数。
  • deleteAddressbookEmails(int $id, array $emails) :array 从地址簿中删除电子邮件地址
    • $id - 地址簿的 ID;
    • $emails - 电子邮件地址列表。
  • getAddressbookEmails(int $id, int $limit = null, int $offset = null) :array 返回地址簿中的电子邮件地址列表(不超过 100)。
    • $id - 地址簿的 ID;
    • $limit - 记录数量;
    • $offset - 输出偏移(从哪个记录开始显示)。
  • getAllAddressbookEmails(int $id) :\Generator 允许通过返回生成器来获取地址簿中的所有电子邮件地址列表。
    • $id - 地址簿的 ID。
  • getAddressbookEmailsTotal(int $id) :int 返回地址簿中的电子邮件地址总数
    • $id - 地址簿的 ID。
  • getAddresbookVariables(int $id) :array 返回地址簿的变量列表
    • $id - 地址簿的 ID。

地址簿操作示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();
    $sendPulse->auth($clientId, $clientSecret);

    // Загружаем все адресные книги
    $num = 0;
    $generator = $sendPulse->getAllAddressbooks();
    foreach ($generator as $addressbooks) {
        foreach ($addressbooks as $addressbook) {
            $num++;
            echo "[{$num}] {$addressbook['id']}: {$addressbook['name']}" . PHP_EOL;
        }
    }

    // Получаем информацию об адресной книге по ID книги
    $addressbookId = 20143254;
    $response = $this->getAddressbook($addressbookId);
    print_r($response);

    // Добавляем новую адресную книгу
    $addressbookId = $sendPulse->addAddressbook([
        'bookName' => 'Тестовая адресная книга'
    ]);
    print_r($addressbookId);

    // Формируем список контактов для адресной книги
    $emails = [
        [
            'email' => 'test1@example.com',
            'variables' => [
                'Name' => 'Тест контакт 1',
                'Phone' => '+79450000001'
            ]
        ],
        [
            'email' => 'test2@example.com',
            'variables' => [
                'Name' => 'Тест контакт 2',
                'Phone' => '+79450000002'
            ]
        ],
        [
            'email' => 'test3@example.com',
            'variables' => [
                'Name' => 'Тест контакт 3',
                'Phone' => '+79450000003'
            ]
        ]
    ];

    // Добавляем контакты в адресную книгу
    $response = $sendPulse->addAddressbookEmails($addressbookId, $emails);
    print_r($response);

    // Получаем первые 100 контактов из адресной книги
    $response = $sendPulse->getAddressbookEmails($addressbookId);
    print_r($response);

    // Получаем количество email адресов в адресной книге
    $response = $sendPulse->getAddressbookEmailsTotal($addressbookId);
    print_r($response);

    // Получаем список переменных для адресной книги
    $response = $sendPulse->getAddresbookVariables($addressbookId);
    print_r($response);

    // Удаляем адресную книгу
    $response = $sendPulse->deleteAddressbook($addressbookId);
    print_r($response);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

操作活动的方法

用于操作活动的类位于类 \App\SendPulse\Campaigns

  • getCampaign(int $id) :array 返回有关活动的信息
    • $id - 活动的 ID;
  • getCampaigns(int $limit = null, int $offset = null) :array 返回活动列表(不超过 100)。
    • $limit - 记录数量;
    • $offset - 输出偏移(从哪个记录开始显示)。
  • getAllCampaigns() :\Generator 允许通过返回生成器来获取所有活动的列表。
  • addCampaign(array $params) :int 添加活动 并返回活动ID。
    • $params - 活动参数。
  • updateCampaign(int $id, array $params) :array 更新已计划的活动
    • $id - 活动的 ID;
    • $params - 活动参数。
  • deleteCampaign(int $id) :array 取消已计划活动的发送
    • $id - 活动ID。
  • getAddressbookCampaigns(int $id, int $limit = null, int $offset = null) :array 返回由该地址簿创建的活动列表(不超过100项)。
    • $id - 地址簿的 ID;
    • $limit - 记录数量;
    • $offset - 输出偏移(从哪个记录开始显示)。
  • getAllAddressbookCampaigns(int $id) :\Generator 允许通过返回生成器来获取由该地址簿创建的所有活动的列表。
    • $id - 地址簿的 ID。

活动操作示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();
    $sendPulse->auth($clientId, $clientSecret);

    // Получаем список все кампаний
    $num = 0;
    $generator = $sendPulse->getAllCampaigns();
    foreach ($generator as $campaigns) {
        foreach ($campaigns as $campaign) {
            $num++;
            echo "[{$num}] {$campaign['id']}: {$campaign['name']}" . PHP_EOL;
        }
    }

    // Получаем информацию о кампании по ID кампании
    $campaignId = 21058230;
    $response = $this->getCampaign($campaignId);
    print_r($response);

    // Формируем параметры новой кампании
    $sendTime = new DateTime();
    $sendTime->add(new DateInterval("PT30M"));
    $params = [
        'sender_name'  => 'Тестовый отправитель',
        'sender_email' => 'test@example.com',
        'name'         => 'Тестовая рассылка',
        'subject'      => 'Тестовая рассылка',
        'template_id'  => 2308544,
        'list_id'      => 79093323,
        'send_date'    => $sendTime->format('Y-m-d H:i:s')
    ];

    // Добавляем новую кампанию
    $campaignId = $sendPulse->addCampaign($params);
    print_r($campaignId);

    // Отменяем отправку запланированной кампании
    $response = $sendPulse->deleteCampaign($campaignId);
    print_r($response);

    // Получаем список всех кампаний, которые создавались по данной адресной книге
    $num = 0;
    $addressbookId = 20143254;
    $generator = $sendPulse->getAllAddressbookCampaigns($addressbookId);
    foreach ($generator as $campaigns) {
        foreach ($campaigns as $campaign) {
            $num++;
            echo "[{$num}] {$campaign['id']}: {$campaign['name']}" . PHP_EOL;
        }
    }

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

操作模板的方法

用于操作模板的方法位于 \App\SendPulse\Templates 三元组中

  • getTemplate(int $id) :array 返回模板信息
    • $id - 模板ID。
  • getTemplates(string $owner = null, string $lang = null) :array 返回模板列表,并提供筛选功能。
    • $owner - 模板所有者筛选器(me - 用户模板,sendpulse - 系统模板);
    • $lang - 模板语言筛选器(ruen)。
  • addTemplate(array $params) :int 添加模板 并返回真实ID模板。
    • $params - 模板参数。
  • updateTemplate(int $id, array $params) :array 更新模板
    • $id - 模板ID;
    • $params - 模板参数。

模板操作示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();
    $sendPulse->auth($clientId, $clientSecret);

    // Получаем список всех собственных шаблонов
    $response = $sendPulse->getTemplates($owner = 'me');
    $num = 0;
    foreach ($response as $tpl) {
        $num++;
        echo "[{$num}] {$tpl['real_id']}: {$tpl['name']}" . PHP_EOL;
    }

    // Получаем информацию о шаблоне
    $templateId = 1318345;
    $response = $sendPulse->getTemplate($templateId);
    print_r($response);

    // Формируем параметры нового шаблона
    $params = [
        'name' => 'Тестовый шаблон',
        'body' => 'PHA+RXhhbXBsZSB0ZXh0PC9wPg==',
        'lang' => 'ru'
    ];

    // Добавляем шаблон
    $templateId = $sendPulse->addTemplate($params);
    print_r($templateId);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

操作 SMTP 服务的的方法

用于操作SMTP服务的方法位于 \App\SendPulse\Smtp 三元组中

  • sendEmails(array $params) :array 发送邮件
    • $params - 邮件参数。

SMTP服务操作示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();
    $sendPulse->auth($clientId, $clientSecret);

    // Формируем параметры письма
    $params = [
        'email' => [
            'html'=> 'PHA+RXhhbXBsZSB0ZXh0PC9wPg==',
            'text' => "Текст письма",
            'subject' => 'Тестовое письмо',
            'from' => [
                'name' => 'Тестовый отправитель',
                'email' => 'sender@example.com'
            ],
        ],
        'to' => [
            [
                'name' => 'Тестовый получатель',
                'email' => 'recipient1@example.com'
            ]
        ]
    ];

    // Отправляем письмо
    $response = $sendPulse->sendEmails($params);
    print_r($response);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

辅助类方法

  • getLastResponse() 返回 SendPulse API 的最后一个响应。
  • request(string $method, string $path, array $params = []) ?array 向 SendPulse API 发送请求并返回响应。
    • $method - 请求方法(GET,POST,PATCH,PUT,DELETE);
    • $path - URL请求的路径;
    • $params - 请求参数。
  • getAll(Closure $closure) :\Generator 允许通过返回生成器来加载指定类型的所有实体。
    • $closure - 用于加载实体的匿名函数闭包:$closure(int $offset),其中 $offset - 输出偏移量。

辅助方法使用示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();
    $sendPulse->auth($clientId, $clientSecret);

    // Получаем черный список email адресов
    $response = $sendPulse->request('GET', '/blacklist');
    print_r($response);

    // Получаем список всех отправленных писем
    $generator = $sendPulse->getAll(function ($offset) use ($sendPulse) {
        return $sendPulse->request('GET', '/smtp/emails', [ 'offset' => $offset ]);
    });
    $num = 0;
    foreach ($generator as $emails) {
        foreach ($emails as $email) {
            $num++;
            echo "[{$num}] {$email['smtp_answer_code_explain']} {$email['recipient']}" . PHP_EOL;
        }
    }

    // Получаем последний ответ API SendPulse
    $response = $sendPulse->getLastResponse();
    print_r($response);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

辅助类

HTTP

\App\HTTP\HTTP 提供

  • 通过 HTTPS 协议向 SendPulse API 形成POST请求;
  • 对API请求进行限制,以达到所需的限制级别 - 每秒不超过10个请求
  • 在STDOUT中输出关于API请求的调试信息。

发生错误时,抛出带有 \App\HTTP\HTTPException 类对象的异常。

附加参数

通过类 \App\HTTP\HTTP 的公共属性设置额外的参数。

使用类的示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;
use App\HTTP\HTTP;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();

    // Устанавливаем максимальный уровень вывода отладочных сообщений в STDOUT
    $sendPulse->http->debugLevel = HTTP::DEBUG_URL |  HTTP::DEBUG_HEADERS | HTTP::DEBUG_CONTENT;

    // Устанавливаем троттлинг запросов на уровне не более 1 запроса в секунду
    $sendPulse->http->throttle = 1;

    // Устанавливаем таймаут обмена данными c API в 30 секунд
    $sendPulse->http->curlTimeout = 30;

    $sendPulse->auth($clientId, $clientSecret);

    // Получаем список отправителей email
    $response = $sendPulse->request('GET', '/senders');
    print_r($response);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

调试消息示例

[1] ===> GET https://api.sendpulse.com/addressbooks
GET /addressbooks HTTP/2
Host: api.sendpulse.com
user-agent: HTTP-client/3.x.x
accept: */*
authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiI


[1] <=== RESPONSE 0.4566s (200)
HTTP/2 200
server: nginx/1.14.0 (Ubuntu)
date: Mon, 08 Feb 2021 06:45:38 GMT
content-type: application/json
vary: Accept-Encoding
x-powered-by: PHP/7.1.33
cache-control: private, must-revalidate
pragma: no-cache
expires: -1
access-control-allow-origin: *
access-control-allow-methods: GET, POST, DELETE, PUT, OPTIONS
access-control-allow-headers: Authorization,DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range
access-control-expose-headers: Content-Length,Content-Range
x-sp-pr: lpr8

[{"id":89206572,"name":"Addressbook 1","all_email_qty":694,"active_email_qty":693,"inactive_email_qty":0,"creationdate":"2021-02-05 08:48:44","status":0,"status_explain":"Active"}

DebugLogger

\App\DebugLogger\DebugLogger 提供将请求和响应记录到文件的日志记录。
发生错误时,抛出带有 \App\DebugLogger\DebugLoggerException 类对象的异常。

类方法

  • static instance(string $logFileName = 'debug.log') :self
    返回特定日志文件 $logFileName 的该类唯一对象。
    • $logFileName - 日志文件名。
  • save(mixed $info, object $object = null, string $header = null) :void 将待记录的信息保存到文件。
    • $info - 用于记录的字符串、数组或对象;
    • $object - 执行记录操作的类对象的引用;
    • $header - 保存到日志文件的信息的标题字符串。

附加参数

其他参数通过类 \App\DebugLogger\DebugLogger 的公共属性设置。

使用类的示例

use App\SendPulse\SendPulseAPI;
use App\SendPulse\SendPulseAPIException;
use App\SendPulse\TokenStorage\TokenStorageException;
use App\DebugLogger\DebugLogger;

try {
    $clientId = 'acbdef0123456789abcdef0123456789';
    $clientSecret = 'acbdef0123456789abcdef0123456789';

    $sendPulse = new SendPulseAPI();

    // Устанавливаем каталог для сохранения лог файлов
    DebugLogger::$logFileDir = 'logs/';

    // Создаем объект класса логирования
    $logFileName = 'debug_sendpulseapi.log';
    $logger = DebugLogger::instance($logFileName);

    // Включаем логирование
    $logger->isActive = true;

    // Устанавливаем логгер
    $sendPulse->setLogger($logger);

    $sendPulse->auth($clientId, $clientSecret);

    // Получаем список отправителей email
    $response = $sendPulse->request('GET', '/senders');
    print_r($response);

} catch (SendPulseAPIException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (TokenStorageException $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
} catch (Exception $e) {
    printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage());
}

日志记录结果示例

*** cb8lim0 [2021-02-08 06:30:06.701680 +00:00 Δ0.000981 s, 0.65/2.00 MiB] ********************
* Class: App\SendPulse\SendPulseAPI
ЗАПРОС: POST /oauth/access_token
{
    "grant_type": "client_credentials",
    "client_id": "11111111111111111111111111111",
    "client_secret": "22222222222222222222222222222"
}

*** cb8lim0 [2021-02-08 06:30:06.920716 +00:00 Δ0.219036 s, 0.65/2.00 MiB] ********************
* Class: App\SendPulse\SendPulseAPI
ОТВЕТ: POST /oauth/access_token
{
    "token_type": "Bearer",
    "expires_in": 3600,
    "access_token": "3333333333333333333333333333333333"
}

日志头格式

*** cb8lim0 [2021-02-08 06:30:06.920716 +00:00 Δ0.219036 s, 0.65/2.00 MiB] ********************
* Class: App\SendPulse\SendPulseAPI
  • cb8lim0 - DebugLogger 类对象的唯一字母数字 [a-z0-9]+ 标识符,允许在日志文件中查找由同一进程创建的记录;
  • 2021-02-08 06:30:06.920716 +00:00 - 保存信息的日期和时间,精确到微秒;
  • Δ0.219036 s - 从上次保存信息以来经过的时间,以秒和微秒为单位;
  • 0.65/2.00 MiB - 使用内存的数据,以信息数量单位,并使用 二进制前缀 表示。
    • 0.65 - 系统分配给 PHP 脚本的最大内存量;
    • 2.00 - 系统实际分配给 PHP 脚本的内存量;
  • 'Class: App\SendPulse\SendPulseAPI' - 执行记录到日志文件的类的完整名称。

作者

© 2020-2021 andrey-tech

许可

本代码根据 MIT 许可证 条件分发。