php-如何使用powerdns的接口

powerdns安装教程 如何使用powerdns的http-api ? 文档需知 powerdns文档 Swagger接入开发 powerdns的yaml配置文件 | swagger官网 Swagger 生成插件 Sign in 登录 (没有账号的免费注册一个) Create New -> Create New API 创建完毕将powerdns的yaml配置文件粘贴到代码框中 右上角 -> Export -> Client SDK -> 指定的开发语言,像我就用PHP github创建一个新的 repository , 将导出来的文件上传上去 修改composer.json { "repositories": [ { "type": "git", "url": "https://github.com/suguer/powerdns.git" } ], "require": { "suguer/powerdns": "*@dev" } } 开始使用 DnsPowerDnsClient.php use Swagger\Client\Api\ZonesApi; use Swagger\Client\ApiException; use Swagger\Client\Model\RRSet; use Swagger\Client\Model\Zone; use Swagger\Client\Configuration; class DnsPowerDnsClient { private $server_id = "localhost"; /** * @var \GuzzleHttp\Client */ private $client; /** * @var ZonesApi */ private $zoneApi; private $currentNsList = ['ns1','ns2']; public function __construct() { $config=[ "ip" => "", "api_key" => "", ]; $this->client = new \GuzzleHttp\Client([ 'timeout' => 40....

八月 19, 2022 · 7 分钟 · Ken

php-MultiProcess多进程

trait MultiProcessTrait { protected $processes = []; protected $maxFork = 14; /** * @param $action \Closure * @param array $params */ public function fork($action, $params = []) { $this->processes[] = [ "action" => $action, "params" => $params ]; } protected $runningProcess = []; public function waitProcessRun() { while (count($this->runningProcess) > 0) { $mypid = pcntl_waitpid(-1, $status, WNOHANG); foreach ($this->runningProcess as $key => $pid) { if ($mypid == $pid || $mypid == -1) { echo "child $key completed\n"; unset($this->runningProcess[$key]); //判断是否还有未fork进程 $this->runOne(); } } } } public function runOne() { $process = array_shift($this->processes); if ($process) { $pid = pcntl_fork(); if ($pid == -1) { die("could not fork"); } elseif ($pid) { $this->runningProcess[$pid] = $pid; echo "create child: $pid \n"; } else { //执行子进程 call_user_func_array($process['action'], $process['params']); exit;// 一定要注意退出子进程,否则pcntl_fork() 会被子进程再fork,带来处理上的影响。 } } } public function runProcess() { if (empty($this->processes)) { return; } for ($i = 0; $i < $this->maxFork; $i++) { $this->runOne(); } $this->waitProcessRun(); } }

八月 19, 2022 · 1 分钟 · Ken

php-laravel自定义https端口访问异常

最近项目上需要吧后台的链接升级,开启https并且设置到8443端口,在laravel的翻页以及跳转的页面上,会把端口号给隐藏了, 原因在于laravel/vendor/symfony/http-foundation/Request.php public function getPort() { if ($this->isFromTrustedProxy()) { if (self::$trustedHeaders[self::HEADER_CLIENT_PORT] && $port = $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PORT])) { return $port; } if (self::$trustedHeaders[self::HEADER_CLIENT_PROTO] && 'https' === $this->headers->get(self::$trustedHeaders[self::HEADER_CLIENT_PROTO], 'http')) { return 443; } } if ($host = $this->headers->get('HOST')) { if ($host[0] === '[') { $pos = strpos($host, ':', strrpos($host, ']')); } else { $pos = strrpos($host, ':'); } if (false !== $pos) { return (int) substr($host, $pos + 1); } return 'https' === $this->getScheme() ?...

八月 19, 2022 · 1 分钟 · Ken

php-自定义统一的api入口路由

route.php Route::group(['prefix' => 'fapi/', 'middleware' => ['web']], function () { Route::any('{slug}', 'Cloud\Rent\Classes\Api\ApiRouter@route')->where('slug', '(.*)?'); }); ApiRouter.php <?php namespace Cloud\Rent\Classes\Api; use App; use Illuminate\Routing\Controller as ControllerBase; use October\Rain\Router\Helper as RouterHelper; use Illuminate\Support\Str; /** * Class ApiRouter * API例子:在Now\Youpin\Api下建类Auth,里面有public function hello(),可以通过http://host/api/auth/hello * @package Now\Youpin\Classes\Api */ class ApiRouter extends ControllerBase { public function __construct() { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods:*'); header('Access-Control-Allow-Headers:*'); header("Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding"); } /** * @var string Allows early access to page action. */ public static $action; /** * @var array Allows early access to page parameters....

八月 19, 2022 · 2 分钟 · Ken

php-域名竞价模块

域名竞价交易,即为域名充当交易物品进行价值交换,其中比较出名的有国内聚名 ,以及海外的GNAME, 以GNAME为例子讲述如何对接交易模块, Gname的API接口文档 过期预定预定 预定结束=> [抢注成功直接得标, 抢注失败直接失标, 抢注失败需竞价] 竞价域名,涉及到本地多人出价的竞价已经与远端竞价的比较 [直接出价,代理出价] 竞价结束 => [竞价成功,竞价失败] 简单描述竞价流程 竞价域名详情 DescribeAuctionInstance 参数 Domain 域名 检查竞价类型 本地竞价 检查竞价时间是否已过期等 远端竞价 同步远端竞价详情,根据实际情况是否更新本地的出价进度 ##竞价域名出价 CreateAuctionInstance 参数 Domain 域名 , Price 价格 同步远端竞价详情,根据实际情况是否更新本地的出价进度 判断是否需要闯入竞价 判断余额是否足够支付提交的冻结金 判断本地是否存在代理出价 有其他用户的代理出价,并且当前出价高于Price,直接出局 该用户的代理出价则比较金额大小 大于单次最低出价就要生成代理出价 提交请求远端的出价记录

八月 15, 2022 · 1 分钟 · Ken

php-laravel升级注意事项

官网 现在laravel的最新版已经升级到了9.0,目前公司还在用5.x版本,因此对于升级的注意事项做个记录,当做预防以后的踩坑 注意事项 同一个设置成支持php7.0,php8,新的9.0仅支持php8以上,为了能平滑迁移项目,需要服务器可支持2个版本 购物车插件gloudemans/shoppingcart 不可使用 , 测试 bumbummen99/shoppingcart 是否可替代 接收参数函数 Input::get() 废弃,用request()->get() 替代 $input{$i+1} 花括号不可用 $input[$i+1] Route::controller 隐式控制路由废弃, 使用lesichkovm/laravel-advanced-route 插件 AdvancedRoute::controller 替代 队列在redis上保存的值有较大变动, laravel/vendor/laravel/framework/src/Illuminate/Queue/Queue.php createPayload函数 增加部分变量 laravel/vendor/laravel/framework/src/Illuminate/Queue/RedisQueue.php createPayload函数 attempts设置默认为0 原生类的构造函数改成__construct 对于整形和字符串判断更严格了,如mktime 参数必须是int; abs("") 会报错 有用到的废弃函数 create_function 需要更换 ORM查询返回的数据永远是obj类型, conf/database.inc.php 设置的$ORM->setFetchMode(PDO::FETCH_ASSOC); 无效,源自 https://laravel.com/docs/5.4/upgrade 以上的记录是我实际的项目产生的问题,因此不一定适合大部分人 正则表达式替换php7的语法警告 (\$[a-zA-Z\_]+)\[([a-zA-Z]+[a-zA-Z\_\d]*)\] $1['$2']

八月 15, 2022 · 1 分钟 · Ken

php-总结laravel使用技巧-001

是否有人对于每次写一个laravel的控制器都要在路由上写一堆的声明路由感到麻烦,后期维护又不好处理,这里总结下如何让自己写出的接口更加规范格式化,本人在laravel项目中使用了dingo/api .env上配置dingo的配置信息 #Dingo API API_PREFIX=api API_VERSION=v1 API_DEBUG=true 在route.php的路由方法中添加这几行代码 $api = app('Dingo\Api\Routing\Router'); $api->version('v1', function ($api) { $api->any('{slug}', '\App\Http\ApiRouter@route')->where('slug', '(.*)?'); }); 封装统一入口ApiRouter.php use App; use Dingo\Api\Routing\Helpers; use Illuminate\Routing\Controller; use Illuminate\Support\Str; use core\util\router\RouterHelper; class ApiRouter extends Controller { use Helpers; private $ns; const API_NS = 'core\bapi'; function __construct($ns) { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods:*'); header('Access-Control-Allow-Headers:*'); $this->ns = $ns; } /** * @var string Allows early access to page action. */ public static $action; /** * @var array Allows early access to page parameters....

八月 15, 2022 · 2 分钟 · Ken

php-分享自有系统接入OCR图片识别

前言 最近比较了几家大的云平台产品,发现百度云的ocr识别,只要通过了企业认证的话,可以每天免费获取一定额度的使用,因此在这里分享下如何使用ocr识别api 目标 可用在实现内部员工系统的快速身份认证,或者部分客户的营业执照和个人认证,注意仅限小量内部使用,如需用在正式环境中建议购买足够的流量包 前置条件 开发环境 PHP 百度云能企业认证 正式内容 百度接口的认证方式 百度的鉴权方式是以Token的方式,具体教程可查看官网API,这里不重复说明了 function getToken 封装下获取Token的方式,避免重复请求次数过于频繁 public function getToken() { $filename = "/data/baidu_access_token.{$this->access_key}.json"; if (file_exists($filename)) { $content = file_get_contents($filename); if ($content) { $json = json_decode($content, 1); if (strtotime($json['expires_in']) > time()) { return $json['access_token']; } } } $resp = json_decode($this->client->request("POST", "https://aip.baidubce.com/oauth/2.0/token", [ 'form_params' => [ 'grant_type' => 'client_credentials', 'client_id' => $this->access_key, 'client_secret' => $this->secret_key, ] ])->getBody()->getContents(), 1); $data = [ 'access_token' => $resp['access_token'], 'expires_in' => date("Y-m-d H:i:s", strtotime("+29 day")), ]; file_put_contents($filename, json_encode($data, JSON_UNESCAPED_UNICODE)); return $resp['access_token']; } private function request($action, $p) { $option = [ 'query' => [ 'access_token' => $this->getToken(), ], ]; if ($this->target == 'face') { $option['json'] = $p; } else { $option['form_params'] = $p; } $resp = $this->client->request("POST", "{$api_url}/{$action}", $option) ->getBody() ->getContents(); return json_decode($resp, true); } 身份证识别 function OcrIdcard 先展示官方文档,文档中可看出ocr的识别支持两种提交方式,图片的base64或者图片url,因此这里稍微封装一下...

八月 15, 2022 · 3 分钟 · Ken

Php-自定义封装加密方法

/** * 自定义的一个加解密插件 * User: staff * Date: 2019/3/27 * Time: 16:13 */ class Encrypter { private static $key = "ZmUbqPipJ0Pr7tGmkHDBazjpbKjFZc7S"; private static $cipher = "AES-256-CBC"; public static function encrypt($str) { $ivlen = openssl_cipher_iv_length(self::$cipher); $iv = openssl_random_pseudo_bytes($ivlen); $value = openssl_encrypt($str, self::$cipher, self::$key, 0, $iv); $iv = base64_encode($iv); $param = [ 'iv' => $iv, 'value' => $value ]; return base64_encode(json_encode($param)); } public static function decrypt($str) { $payload = self::getJsonPayload($str); $iv = base64_decode($payload['iv']); $decrypted = openssl_decrypt($payload['value'], self::$cipher, self::$key, 0, $iv); return $decrypted; } /** * @param $payload * @return array */ static function getJsonPayload($payload) { $payload = json_decode(base64_decode($payload), true); return $payload; } }

八月 15, 2022 · 1 分钟 · Ken

Php邮件收取imap

前言 招商银行的收款通知可以添加邮件推送,因此利用php-imap收取邮件,可达到自动化确款的目的 目标 前置条件 composer require php-imap/php-imap 正式内容 php-imap 的使用 $mailbox = new Mailbox( '{SMTP服务器:SMTP端口号/imap}INBOX', // IMAP server and mailbox folder '邮箱账号', // Username for the before configured mailbox '邮箱密码', // Password for the before configured username null, // Directory, where attachments will be saved (optional) 'UTF-8' // Server encoding (optional) ); try { $mailsIds = $mailbox->searchMailbox('ALL'); } catch (PhpImap\Exceptions\ConnectionException $ex) { echo "IMAP connection failed: " . $ex; die(); } rsort($mailsIds); foreach ($mailsIds as $key => $item) { //循环遍历 $mail = $mailbox->getMail($item); $fromAddress = $mail->fromAddress; $content = $mail->textHtml; if(!...

八月 12, 2022 · 1 分钟 · Ken