andrey-tech / sendpulse-api-php
PHP7+ 简单封装,用于与 SendPulse API 服务交互,具有请求节流和文件日志记录功能
Requires
- php: >=7.0
- ext-curl: *
- ext-json: *
- andrey-tech/debug-logger-php: ^2.0
- andrey-tech/http-client-php: ^3.0
This package is auto-updated.
Last update: 2024-09-08 15:34:56 UTC
README
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
- 模板语言筛选器(ru
,en
)。
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 许可证 条件分发。