首页
关于
Search
1
阿里云rds数据库mysql版cpu占用100%排查问题过程
1,405 阅读
2
解决Gitlab进行clone、push、pull的时候报错aborting due to possible repository corruption on the remote side. git-pack-objects died with error.index-pack failed问题
1,302 阅读
3
nginx、php-fpm、thinkphp接口请求偶尔返回502导致前端报CORS跨域错误问题
842 阅读
4
使用VMware Workstation pro 15安装黑苹果后,开机卡在logo的问题
785 阅读
5
mysql查询某个字段有两条重复记录的SQL语句
591 阅读
计算机
数据库
Linux
PHP开发
前端
好文收藏
产品
创业
天天向上
阅读
工作
登录
Search
标签搜索
PHP
ss
pdo
mysql
php8
阅读
摘抄
PHP后端开发技术学习
累计撰写
104
篇文章
累计收到
1
条评论
首页
栏目
计算机
数据库
Linux
PHP开发
前端
好文收藏
产品
创业
天天向上
阅读
工作
页面
关于
搜索到
104
篇与
basil
的结果
2023-10-04
PHP面向对象中的接口在实际工作中的使用场景
什么是PHP面向对象的接口在PHP中,面向对象的接口是用来定义类的行为规范的一种机制,接口可以定义一个类应该实现哪些方法,但不需要具体实现这些方法。使用场景(以单据导出功能为例)UML类图实现原理在日常业务功能开发过程中,单据导出是一个很常用的功能,为了能够顺利的导出数据,主要考虑数据量太大导致内存溢出和响应超时的问题, 因此一般采用异步的方式,虽然每个单据导出的字段和内容不一样,但是可以抽象出共有的地方,异步导出功能共有的地方一般包括开始导出任务、执行导出任务、任务成功回调以及任务失败回调这些方法,这些共有的方法可以用接口来定义,每个单据类可以实现这个接口来补充具体的导出逻辑,然后异步任务根据这个接口依次执行这些方法,如上图所示,定义ExportTaskInterface接口,接口包含startExportTask、doExportTask、exportTaskFailedHandle、taskFinishHandle方法,定义Order类并实现ExportTaskInterface接口,定义ExportExcelJob类对Order实例导出数据相关方法进行调用。实现步骤定义ExportTaskInterface接口<?php namespace app\contract\excel; use think\queue\Job; interface ExportTaskInterface { /** * 开始导出任务 * @param array $params 创建任务的参数 * @return mixed */ public function startExportTask(array $params) : array; /** * 导出Excel * @param array $params * @return mixed */ public function doExportTask(array $params) : array; /** * 任务失败时的处理方法 * @param \Exception $e * @param array $params * @param Job $job * @return mixed */ public function exportTaskFailedHandle(\Exception $e, array $params, Job $job) : array; /** * 任务完成时的处理方法 * @param array $exportResult * @param Job $job * @return mixed */ public function taskFinishHandle(array $exportResult, Job $job) : array; } 定义Order类,并实现ExportTaskInterface接口<?php namespace app\admin\service; use app\admin\model\Region; use app\common\MyLog; use think\Db; use think\facade\Env; use think\facade\Config; use app\admin\model\GoodsBrand as GoodsBrandModel; use app\admin\model\Order; use app\admin\model\OrderDelivery as OrderDeliveryModel; use app\admin\model\OrderGoods; use app\admin\model\OrderPackGoods; use app\admin\model\Products; use app\contract\excel\ExportTaskInterface; use app\facade\model\OrderChange; use app\library\enum\AsyncTaskEnum; use app\library\enum\ErpEnum; use app\models\AsyncTask; use app\models\OrderChangeGoods; use app\models\OrderChangePackGoods; use app\service\common\XlsWriterService; use app\service\QueueService; use app\admin\logic\Erp as ErpLogic; use app\library\exception\{ServiceLogicException}; use app\admin\model\OrderPackGoods as OrderPackGoodsModel; use app\facade\model\OrderGoods as OrderGoodsModelFacade; use app\facade\model\Order as OrderModelFacade; use app\facade\model\Goods as GoodsModelFacade; use app\facade\model\OrderChange as OrderChangeModelFacade; use app\facade\model\UserAccountLog as UserAccountLogModelFacade; use app\facade\model\OrderDelivery as OrderDeliveryModelFacade; use app\facade\model\UserBill as UserBillModelFacade; use app\facade\model\DiyPack as DiyPackModel; use app\facade\model\DiySolution as DiySolutionModel; use app\admin\model\Order as AdminOrderModel; use app\api\model\Order as ApiOrderModel; use app\facade\service\client\ActivityService; use app\plogic\OrderLogic; use excel\Excel; use think\queue\Job; use app\common\BaseResult; use app\common\basic\Base; use app\library\enum\ErrorCodeEnum; class Order implements ExportTaskInterface { /** * 开始导出任务 * @param array $params * @return array */ public function startExportTask(array $params): array { $name = '订货单数据_' . date("YmdHis"); $data = [ 'user_id' => $params['admin_id'], 'name' => $name, 'task_type' => AsyncTaskEnum::TASK_TYPE_EXCEL_EXPORT, 'identification' => AsyncTaskEnum::IDENTIFICATION_EXCEL_EXPORT, 'task_params' => json_encode($params), 'out_file_name' => $name . '.xlsx', ]; $taskId = AsyncTask::createTask($data); $params['task_id'] = $taskId; $params['handler'] = self::class; QueueService::push('excel_export', $params); return ['msg' => '已创建导出任务,请在下载中心查看', 'task_id' => $taskId]; } /** * 进行导出任务 * @param array $params * @return array * @throws \Pxlswrite\DataFormatException */ public function doExportTask(array $params): array { $orderModel=new Order(); $data= $orderModel->get_order($params['where']); if (empty($data)){ throw new ServiceLogicException('没有可导出的数据'); } $now = time(); $filename = "订货单数据{$params['admin_id']}_{$now}.xlsx"; $field = [ 'order_sn' => ['name' =>'订单编号'], 'erp_sn' => ['name' =>'ERP订单编号'], 'user_name' => ['name' =>'客户名称'], 'brand_name' => ['name' =>'品牌'], 'order_status' => ['name' =>'订单状态'], 'pay_status' => ['name' =>'付款状态'], 'pay_name' => ['name' =>'支付方式'], 'is_special_approval' => ['name' =>'是否特殊审批单'], 'prepare' => ['name' =>'是否备货单'], 'goods_amount' => ['name' =>'商品总金额'], 'order_amount' => ['name' =>'订单金额'], 'money_paid' => ['name' =>'已付款金额'], 'cash_money' => ['name' =>'抵扣券抵扣金额'], 'add_time' => ['name' =>'下单时间'], 'pay_time' => ['name' =>'付款时间'], 'address' => ['name' =>'详细地址'], 'tel' => ['name' =>'电话号码'], 'mobile' => ['name' =>'手机号码'], 'consignee' => ['name' =>'收货人姓名'], 'close_reason' => ['name' =>'订单关闭原因'], 'remark' => ['name' =>'订单备注'], 'action_user' => ['name' =>'最后操作人'], 'email' => ['name' =>'邮箱'], 'service_name' => ['name' =>'销售内勤'], 'pay_type' => ['name' =>'结款方式'], ]; $fileObj = XlsWriterService::getInstance() ->constMemory($filename, null, false) ->field($field); $orderStatusFields = ['0'=>'未确认','1'=>'已确认','2'=>'已取消','3'=>'无效','4'=>'退货','5'=>'已分单','6'=>'部分分单','7'=>'已关闭']; $payStatusFields = ['0'=>'未付款','1'=>'付款中','2'=>'已付款','3'=>'部分付款']; $page = 1; while (true){ $fields = ['order_id','is_valet','is_from_quotation','order_total_amount','od.user_id','order_sn','pay_status','money_paid','cash_money','surplus_money','company_name','od.add_time','od.pay_time','order_amount','goods_amount','order_status','shipping_status','action_user','od.remark','od.pay_type','od.consignee','od.tel','od.mobile','pm.pay_name','ui.user_rank','brand_id','order_type','order_from','od.erp_sn','is_special_approval','prepare','od.address','od.close_reason','od.email','ui.service_name','od.integral','od.extension_code','od.is_unite_promotion', 'od.province', 'od.city', 'od.district']; $data= $orderModel->get_order($params['where'],$fields,[],'list',true,$page); $data=$data->toArray(); if (empty($data['data'])){ break; } $orderListData = $data['data']; $order_ids = array_column($orderListData, 'order_id'); $brand_ids = array_column($orderListData, 'brand_id'); $order_goods = OrderService::getInstance()->getOrderGoodsList($order_ids); // 订单商品品牌 $brands = GoodsBrandModel::where('brand_id', 'in', array_unique($brand_ids))->column('brand_id,brand_name'); // 发货单金额 $orderDeliveryAmount = OrderDeliveryModel::where([['order_id','in',$order_ids],['status','in',[0,2,3,4,5]]])->group('order_id')->column('order_id,sum(order_amount)'); $order_change = OrderChange::where(['order_id'=>$order_ids,'status'=>1])->group('order_id')->column('change_id','order_id'); $items = []; foreach ($orderListData as &$value) { $value['pay_name'] = $value['surplus_money'] > 0 ? '余额支付' : $value['pay_name']; // 关闭可退回订单金额 $can_return_amount = $value['money_paid'] == 0 && $value['surplus_money'] > 0 ? $value['surplus_money'] : $value['money_paid']; $delivery_amount = $orderDeliveryAmount[$value['order_id']] ?? 0; if ($delivery_amount > 0) { $can_return_amount = $can_return_amount - $delivery_amount; } if ($value['pay_type'] == 1) { $can_return_amount = 0; } $value['can_return_amount'] = number_format($can_return_amount, 2); $value['brand'] = isset($brands[$value['brand_id']]) ? ['brand_id'=>$value['brand_id'],'brand_name'=>$brands[$value['brand_id']]] : []; if(isset($order_goods[$value['order_id']])) { $value['children'] = $order_goods[$value['order_id']]; foreach ($value['children'] as &$vc) { if ($vc['goods_type'] == 1) { $vc['product_sn'] = $vc['goods_sn']; } } unset($vc); } $value['add_time'] =date('Y-m-d H:i',$value['add_time']); $value['pay_time'] = $value['pay_time'] ? date('Y-m-d H:i',$value['pay_time']) : ''; //是否有变更中的订单 $value['is_changing'] = isset($order_change[$value['order_id']]) ? 1 : 0; $value['operation'] = false; $region = Region::where('region_id', 'in', [$value['province'], $value['city'], $value['district']]) ->column('region_name', 'region_id') ?: []; $province = $region[$value['province']] ?? ''; $city = $region[$value['city']] ?? ''; $district = $region[$value['district']] ?? ''; $value['address'] = $province . $city . $district . $value['address']; } unset($value); $exportData = []; foreach ($orderListData as $key => $value) { $exportData[$key]['order_sn'] = $value['order_sn']; $exportData[$key]['erp_sn'] = $value['erp_sn']; $exportData[$key]['user_name'] = $value['company_name']; $exportData[$key]['brand_name'] = $value['brand']['brand_name'] ?? ''; $exportData[$key]['order_status'] = $orderStatusFields[$value['order_status']]; $exportData[$key]['pay_status'] = $payStatusFields[$value['pay_status']]; $exportData[$key]['pay_name'] = $value['pay_name']; $exportData[$key]['is_special_approval'] = $value['is_special_approval'] ? '是' : '否'; $exportData[$key]['prepare'] = $value['prepare'] ? '是' : '否'; $exportData[$key]['goods_amount'] = $value['goods_amount']; $exportData[$key]['order_amount'] = $value['goods_amount']; $exportData[$key]['money_paid'] = $value['money_paid']; $exportData[$key]['cash_money'] = $value['cash_money']; $exportData[$key]['add_time'] = $value['add_time']; $exportData[$key]['pay_time'] = $value['pay_time']; $exportData[$key]['address'] = $value['address']; $exportData[$key]['tel'] = $value['tel']; $exportData[$key]['mobile'] = $value['mobile']; $exportData[$key]['consignee'] = $value['consignee']; $exportData[$key]['close_reason'] = $value['close_reason']; $exportData[$key]['remark'] = $value['remark']; $exportData[$key]['action_user'] = $value['action_user']; $exportData[$key]['email'] = $value['email']; $exportData[$key]['service_name'] = $value['service_name']; $exportData[$key]['pay_type'] = $value['pay_type'] ? '月结' : '现结'; } foreach ($exportData as $val) { $item = []; foreach ($field as $key => $value) { $item[$key] = $val[$key] ?? ''; } $items[] = array_values($item); } unset($exportData); !empty($items) && $fileObj->data($items); $page++; } $filePath = $fileObj->output(); return ['file_path' => $filePath, 'task_id' => $params['task_id']]; } public function exportTaskFailedHandle(\Exception $e, array $params, Job $job): array { AsyncTask::where('id', $params['task_id'])->update([ 'status' => AsyncTaskEnum::TASK_STATUS_FAIL, 'exception_msg' => $e->getMessage() ]); $job->delete(); return []; } public function taskFinishHandle(array $exportResult, Job $job): array { AsyncTask::where('id', $exportResult['task_id'])->update([ 'status' => AsyncTaskEnum::TASK_STATUS_FINISH, 'download_url' => $exportResult['file_path'] ]); $job->delete(); return []; } }定义ExportExcelJob类<?php namespace app\job\jobs; use app\common\MyLog; use app\contract\excel\ExportTaskInterface; use app\library\exception\ServiceLogicException; use think\queue\Job; class ExportExcelJob { public function fire(Job $job, $data) { if (!isset($data['handler'])){ $job->delete(); throw new ServiceLogicException('缺少处理类'); } try { $this->handleJob(new $data['handler'], $data, $job); }catch (\Exception $e){ var_dump($e->getFile() . $e->getLine() . $e->getMessage()); MyLog::errorLog('error', $e->getFile() . $e->getLine() . $e->getMessage(), 'export_excel_task'); $job->delete(); } } protected function handleJob(ExportTaskInterface $exportTask, $data, Job $job) { MyLog::infoLog('export_excel_task', '接收到Excel导出任务:' . json_encode($data), 'export_excel_task'); try { $result = $exportTask->doExportTask($data); $exportTask->taskFinishHandle($result, $job); MyLog::infoLog('export_excel_task_res', '执行成功:' . json_encode($result), 'export_excel_task'); }catch (\Exception $e){ MyLog::infoLog('export_excel_task_err', $e->getFile() . $e->getLine() . $e->getMessage(), 'export_excel_task'); $exportTask->exportTaskFailedHandle($e, $data, $job); } } public function fail(Job $job, $data) { $job->delete(); } }调用顺序用户点击导出按钮调用Order实例的startExportTask方法,startExportTask方法把当前类以及相关参数传递到ExportExcelJob实例,通过ExportExcelJob实例调用handleJob方法进行导出操作,具体实现逻辑请参考这篇文章 使用thinkphp、think-queue、redis、supervisor搭建异步任务中心 。
2023年10月04日
161 阅读
2023-10-03
团队Git分支管理与协作方式(基于分支发布版本)
前言毕业时进了一家小型项目外包公司,代码版本管理工具用的是SVN,几个人开发一个项目时,每个人开发完自己的功能后,使用svn commit提交代码到仓库,然后配置的勾子会自动把代码拉到测试环境,测试通过之后,在正式环境的服务器使用svn update命令将代码更新到最新版本。平时下班前会提交代码到仓库,如果遇到某个同事开发进度较慢,要优先发布其它同事完成的功能,就需要将没开发好的功能代码先注释掉,或者等到那个同事开发完再进行发布,那时候也没有深入研究svn有没有更好的办法解决这种问题。在第二家公司用的是GIT,在开发新能时,首先会基于master分支创建一个新版本分支,例如2.7.1分支,用来开发2.7.1版本,然后参与这个版本开发的人员,从这个2.7.1分支再切一个属于自己的分支,例如feature-basil-2.7.1,开发完成后发起合并到2.7.1请求,通过之后拉取代码到测试环境测试,测试通过只有,再把2.7.1合并到master,然后拉取代码到正式环境,那时候只知道按照这样的流程走,没搞清楚为什么要这样搞,后面用的多了,就渐渐明白了一些git的分支管理与多人协作方式。接下来讲的是目前所在公司的Git代码管理与协作方式。基于分支发布的代码管理与协作方式分支说明 主要包括6个分支,常驻分支有production、dev、test、preOnline,临时分支有feature、hotfixproduction生产分支用于生产发布,保存着最新生产环境的代码,不允许在此分支上直接修改,只能通过preOnline分支进行合并preOnline预上线分支用于预上线测试,不允许在此分支上直接修改,只能通过feature或hotfix分支进行合并test测试分支用于测试,不允许在此分支上直接修改,只能通过其它分支进行合并dev开发分支用于开发,不允许在此分支上直接修改,只能通过其它分支进行合并feature功能分支基于production,用于开发新功能hotfix bug修复分支基于production,用于修复bug开发场景工作流说明新功能开发例如A、B两位同事共同开发feature-1.0.0版本,这时候一般会划分为两个模块,一人负责一个模块。首先从production分支切出feature-1.0.0分支,然后A和B分别从feature-1.0.0分支切出自己的本地分支feature-1.0.0-A和feature-1.0.0-B,A、B开发完后将本地feature-1.0.0-A和feature-1.0.0-B合并到feature-1.0.0分支,接着再将feature-1.0.0分支合并到dev分支,合并到dev分支后自动部署到开发环境,在开发环境上进行开发联调,联调完成之后将feature-1.0.0合并到test分支自动部署到测试环境,测试通过之后将feature-1.0.0合并到preOnline分支自动部署到预上线环境,预上线测试完成之后,将preOnline分支合并到production分支自动部署到生产环境,至此,多人进行新版本开发从编写代码到发布上线就完成了。bug修复 如果生产环境出现bug,则从production分支切出hotfix分支,修改完bug之后,将hotfix分支合并到dev分支进行开发调试,调试完成之后将hotfix分支合并到test分支进行测试,测试完成之后将hotfix分支合并到preOnline分支进行预上线测试,预上线测试通过之后将preOnline分支合并到production分支发布到生产环境。答疑为什么使用feature以及hotfix分支合并到test、preOnline分支,而不是将dev合并到test,然后将test合并到preOnline?因为dev分支用于开发联调,可能包含了其它可能版本或者没有开发好的代码,如果使用dev分支合并到test和preOnline就会把其它版本或者没有开发好的代码更新到测试环境或者预上线环境,而使用feature或者hotfix分支单独合并到test、preOnline,则可以单独更新开发好的版本或者模块,就算多个同事开发同一个版本,某个同事开发的模块没有完成,要延后发版,也可以先发其他同事开发好的模块。如果多个同事共同开发一个版本,每个人负责不同的模块,但每个模块有共用的代码怎么办?大家沟通之后,某个同事可以将共用的代码在自己的分支写好,然后再合并到共用分支,然后其他同事再将共用分支合并到自己的分支进行复用,例如上面新功能开发场景的A同事将公用代码在自己的feature-1.0.0-A分支上写好之后,合并到feature-1.0.0分支,B同事将feature-1.0.0分支合并到自己的feature-1.0.0-B分支后就可以复用公用代码了。为什么在开发新功能的时候已经有了feature分支了,每个人还有基于这个feature分支创建一个属于自己的分支?因为每个人负责的模块不一样,而这两个模块的耦合性可能没那么高,可以将某个模块单独发布,这样的话可以对模块进行单独发布,而不必等两个模块开发好了再发布。补充说明这套git代码分支管理方式是基于分支通过Jenkins等工具进行自动部署代码的,dev对应开发环境、test对应测试环境、preOnline对应预上线环境、production对应生产环境。这是根据目前公司的情况所摸索出来的git分支管理与协作方式,可能还有很多需要优化的地方,个人见识有限,欢迎批评指正,提出宝贵的优化建议。
2023年10月03日
212 阅读
2023-09-19
服务器使用WDCP面板添加网站避坑指南
事件场景最近需要给boass添加www.boass.com域名进行直接访问,而不是通过www.boass.com跳转到boass.hopo.com.cn进行访问,添加完成后,达到两个域名都可访问boass的目的。解决的方案是取消www.boass.com解析到boass.hopo.com.cn,而改为解析到120.25.xxx.xxx正式环境服务器,同时下载SSL证书,然后通过服务器的WDCP面板新增www.boass.com域名,上传证书,并且把网站目录指向跟boass.hopo.com.cn一致。操作过程遇到的问题以及解决办法(针对前端项目)问题一:网站添加完成后,访问内容变成了WDCP默认页面的内容原因:新增网站时,WDCP面板会使用默认的index.html文件替换掉已经存在于指定文件夹中的index.html文件,因此会导致开发人员所写的index.html文件被覆盖,访问内容变成了WDCP面板默认的内容。解决办法:新增网站前,如果指定目录中已存在index.html文件,则先备份好,添加好网站后再恢复。或者添加好网站后,再将源代码重新部署到指定文件夹。问题二:新增网站后,导致其它域名配置文件丢失原因:如果当前新增的网站指向的目录与已存在的网站所指向目录一致时,会导致已存在网站的配置文件丢失(域名.conf),这应该是WDCP面板的问题。解决办法:使用WDCP面板添加网站后,会在/www/wdlinux/nginx/conf/vhost目录生成两个配置文件,一个是conf后缀,另一个wdcp后缀,丢失的是起作用的conf后缀文件,需要基于wdcp后缀的文件重新复制一份与域名名称一致并以conf为后缀的文件(将wdcp后缀文件去掉就是正确的名称),然后重启Nginx服务(service nginxd restart)。问题三:添加网站(或解决配置文件丢失)后,访问域名返回503错误原因:相关网站配置文件location中的try_files指令配置错误,如下location / { try_files $uri @apache; }或location / { try_files $uri $uri/ /?$args; }具体原因可网上搜索Nginx关于try_files指令相关说明,导致了需要手动在域名后输入index.html才能进行访问,不然会返回503错误。解决办法:需要将conf文件中location部分配置成如下内容方可解决问题。location / { try_files $uri $uri/ /index.html; }问题四:将网站删除后重新添加,网站访问异常或者SSL证书不生效原因:这种情况下,WDCP需要重启Nginx服务才能生效解决办法:重启Nginx,目前105服务器重启命令为:service nginxd restart总结使用WDCP添加网站时,如果网站目录指向与已存在网站所指向的目录一致,建议提前备份配置文件;添加前端项目的网站时,需要注意避免index.html入口文件被覆盖的问题;修改相关配置文件后不生效,考虑重启Nginx服务。
2023年09月19日
103 阅读
2023-09-15
Debian10添加虚拟内存
要在Debian 10上启用虚拟内存,您可以按照以下步骤操作:打开终端并以root用户身份登录。使用文本编辑器(如nano或vi)打开/etc/fstab文件:sudo nano /etc/fstab在文件的末尾添加以下行来创建一个交换分区文件:/swapfile none swap sw 0 0保存并关闭文件。创建交换分区文件:sudo fallocate -l 2G /swapfile设置文件的权限:sudo chmod 600 /swapfile格式化交换分区文件:sudo mkswap /swapfile启用交换分区文件:sudo swapon /swapfile检查交换分区是否已启用:sudo swapon --show如果您希望系统在每次启动时自动启用交换分区,可以编辑/etc/sysctl.conf文件:sudo nano /etc/sysctl.conf在文件的末尾添加以下行:vm.swappiness=10 vm.vfs_cache_pressure=50保存并关闭文件。重新启动系统以使更改生效:sudo reboot完成上述步骤后,您的Debian 10系统将启用虚拟内存。
2023年09月15日
151 阅读
2023-08-17
win10如何检测域名txt解析是否设置成功
使用nslookup命令nslookup -qt=txt _acme-challenge.boass.com
2023年08月17日
133 阅读
2023-08-16
elasticsearch6.5.0设置密码并用php连接
首先,您需要安装并配置Elasticsearch 6.5.0。确保您的Elasticsearch实例正在运行,并且您可以使用curl访问它。使用curl命令设置Elasticsearch的密码。打开命令行终端,运行以下命令:curl -XPOST -u elastic 'http://localhost:9200/_security/user/elastic/_password' -H 'Content-Type: application/json' -d '{"password" : "your_password"}'请将your_password替换为您要设置的实际密码。这将设置elastic用户的密码。在PHP脚本中连接Elasticsearch。使用以下PHP代码连接Elasticsearch: <?php require 'vendor/autoload.php'; // 如果您使用的是Composer,请引入自动加载的文件 $client = \Elasticsearch\ClientBuilder::create() ->setBasicAuthentication('elastic', 'your_password') ->build(); $params = [ 'index' => 'your_index', 'type' => 'your_type', 'id' => 'your_id', 'body' => ['your_field' => 'your_value'] ]; $response = $client->index($params); print_r($response); ?>确保将上面的代码your_password替换为您设置的实际密码,your_index,your_type和your_id替换为您要索引的实际数据。运行上述PHP脚本,它将连接到Elasticsearch实例并将数据索引到指定的索引和类型中。
2023年08月16日
191 阅读
2023-08-01
PHP使用JAVA生成的DER格式RSA私钥进行数据加密(美团企业版对接)
背景使用PHP对接美团企业版接口,美团没有提供PHP版的SDK,只提供了Java版的SDK,提供的RSA私钥格式是base64,PHP不能直接使用,需要转换成pem格式才能使用。解决办法使用PHP先将私钥进行base64解码然后保存到private.der文件 $appPrivateKey = "xxxxx" $appPrivateKey = base64_decode($appPrivaateKey); file_put_contents('private.der', $appPrivateKey);使用OpenSSL命令将private.der转成private.pem openssl rsa -inform DER -outform PEM -in private.der -out private.pem使用PHP读取私钥并使用 $appPrivateKey = openssl_pkey_get_private(file_get_contents('private.pem'));
2023年08月01日
150 阅读
2023-08-01
PHP使用SHA1WITHRSA 签名示例
<?php $data = 'hello world'; // 待签名的数据 $pemKey = '-----BEGIN RSA PRIVATE KEY----- MIICXgIBAAKBgQCjn9+t/6NzbRf0d7MUifeyJDNHxnlZT5iGDhpOc+KzvzQ97ldz 3ymWipC9vQOwcL3dFzDZU5yRFHJ69zq3BVm0JCstztIbTW1Wsj7kg5nZQ/aoiiEs lWPNVQ82sjuPQdShlFoT5kYOy/ii6vdsc+V5vUvMH8BJ29wl+Vc7lQz2JwIDAQAB AoGBAJIl9JGkdkpT+KZ+Zzp9KxeWjmem9dKv6O6BMVQqRKogQ1KCkCnD6MQX8g4Z +GXNweqXGzYsI5EJTeKRcnZzaI4ABWvR3PWdzt7QYJboXNZA6yqZ7GZ0NeYqYt57 z8wuGqxx6Zsy/7VkU9qsDEzDpe+n7E4s9B6eQEPLboUF8ZGBAkEAz4IIj3NUCVDp z77PxJLjK5Z5XoVLYRQw174zp3Tur6zJfUv7S2zKqFdqvNuU46Pklhg+e/05xls5 KQL1z8rfcgJBANj5JfNrNLcl5uGCEJsoWSWvOpR86KwwlP9KH+SzWVlqkFyBDsT7 JVs1KtuHeBLJA4Z7Kz0XWUMMFuXcDJNXJj8CQB7EInUPxw0JZzRgyHYW/B3VX3HP pwweX0+QDkCNO/fU7/BlWWhVrbRH+93exNUFkKo+g1rc/B97VxXMOU31QlMCQBXh 4SAyPiNfSxkn+yyTeJdQpdbkaOt2pb4g2cojHsT3H4kLFKvDG6BgZainp/N9w6B2 5Y06h1/j87An+1G6YekCQQCF/pQ1WTxA6d/R6PejyFgZlSN2Kq866h3azpoSJB5 WTaVxX+F2JTfpTi+08/TUGiazZx8rBmy6wsIg9GOJvMC -----END RSA PRIVATE KEY-----'; // RSA 私钥 $privateKey = openssl_pkey_get_private($pemKey); openssl_sign($data, $signature, $privateKey, OPENSSL_ALGO_SHA1); echo base64_encode($signature); // 输出签名值 openssl_free_key($privateKey); ?>需要注意的是,需要有 OpenSSL 扩展才能使用 openssl_pkey_get_private() 和 openssl_sign() 函数。同时,要确保私钥已正确生成,格式为 PEM 格式。
2023年08月01日
123 阅读
1
2
3
...
13