首页
关于
WOW怀旧
友链
留言
更多
壁纸
直播
Search
1
关于《杀死那个石家庄人》背后的故事
3,801 阅读
2
沈阳故宫之旅
609 阅读
3
摄影记录|鸿恩寺
563 阅读
4
Laravel-admin 删除行|删除回调
366 阅读
5
EasyWechat 微信小程序接入微信支付|笔记
363 阅读
编程技术
GoLang
Vue
PHP
Linux
Redis
网络安全
生活杂记
登录
Search
标签搜索
PHP
随笔
Mysql
Laravel-Admin
Laravel
摄影
设计模式
Ab
Linux
Javascript
MAC
支付
CentOs
sh
嘉陵江
南滨路
蓝易云
redis
karlina
累计撰写
57
篇文章
累计收到
132
条评论
首页
栏目
编程技术
GoLang
Vue
PHP
Linux
Redis
网络安全
生活杂记
页面
关于
WOW怀旧
友链
留言
壁纸
直播
搜索到
57
篇与
的结果
2022-03-14
PHP图片旋转
代码 /* * $filename 图片地址 * $src 替换地址 * $degrees 转换度数 */ private function flip($filename='',$src='',$degrees = 90) { if(!$filename || !file_exists($filename) || !$src || !file_exists($src)){ return false; } $data = @getimagesize($filename); if($data==false)return false; //读取旧图片 switch ($data[2]) { case 1: $src_f = imagecreatefromgif($filename);break; case 2: $src_f = imagecreatefromjpeg($filename);break; case 3: $src_f = imagecreatefrompng($filename);break; } if($src_f=="")return false; $rotate = @imagerotate($src_f, $degrees,0); if(!imagejpeg($rotate,$src,100))return false; @imagedestroy($rotate); return true; }
2022年03月14日
108 阅读
0 评论
0 点赞
2022-03-14
laravel 8 自定义日志文件名|自定义目录
环境{callout color="#f0ad4e"}基于Laravel 8{/callout}代码<?php namespace App\Http\Helpers; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Route; use Monolog\Formatter\LineFormatter; use Monolog\Logger; use Monolog\Handler\StreamHandler; class LogHelper { private static $filename =''; // 文件记录类型 1:文件目录/日期/文件名 2:所有日志一个文件夹 private function __construct() { } private function __clone() { // TODO: Implement __clone() method. } /** * 设置日志文件名称 * @param $filename */ public static function setFilename($filename) { self::$filename = $filename; } /** * @param $message * @param array $data * @param string $filename * @param string $isDate 是否按月份分文件夹 */ private static function _save($message, $data = [],string $filename, $isDate = true) { $action = Route::current()->getActionName(); list($class, $method) = explode('@', $action); if (empty($filename)) $filename = !empty(self::$filename) ? self::$filename : $method; $log = new Logger('mylog'); if (PHP_SAPI == 'cli') { // 命令行访问脚本的,加一个cli标识和用户浏览器访问的区分开 $filename .= '_cli'; } $filename = $filename . '.log'; if ($isDate) { // 是否要按日显示 $path = storage_path('logs/' . date('Y-m-d')); } else { $path = storage_path('logs/'); } // 有时候运维没给号权限,容易导致写入日志失败 self::mkDirs($path); $path = $path . '/' . $filename; if (gettype($data) != 'array') { $message .= " " . $data; $data = []; } $microtime = microtime(); $message = '[' . substr($microtime, 0, 8) . '] ' . $message;// 记录毫秒时间 // finally, create a formatter $formatter = new LineFormatter("[%datetime%] %message% %context%\n", "Y-m-d H:i:s"); $stream = new StreamHandler($path, Logger::INFO); $stream->setFormatter($formatter); $log->pushHandler($stream); $log->info($message, $data); } /** * 日志打印 * @param string $message * @param array $data * @param string $filename */ public static function info(string $message,$data = [],string $filename='') { self::_save($message, $data, $filename); } /** * 给日志文件夹权限 * @param $dir * @param int $mode * @return bool */ private static function mkDirs($dir, int $mode = 0777) { if (is_dir($dir) || @mkdir($dir, $mode)) { return TRUE; } if (!self::mkdirs(dirname($dir), $mode)) { return FALSE; } return @mkdir($dir, $mode); } /** * 记录最后一条执行的sql * @param string $file_name * */ public static function sql(string $file_name='') { if (empty($file_name)) $file_name = !empty(self::$filename) ? self::$filename : __FUNCTION__.'_sql'; DB::listen(function ($sql) use ($file_name) { foreach ($sql->bindings as $i => $binding) { if ($binding instanceof \DateTime) { $sql->bindings[$i] = $binding->format('\'Y-m-d H:i:s\''); } else { if (is_string($binding)) { $sql->bindings[$i] = "'$binding'"; } } } $query = str_replace(array('%', '?'), array('%%', '%s'), $sql->sql); $query = vsprintf($query, $sql->bindings); LogHelper::info('sql:', $query, $file_name); }); } } 调用// 按日 按文件名 LogHelper::info('A 数组',['a','b'],'order'); // 按文件名 LogHelper::info('A 数组',['a','b'],'order'); // 只有字符串 LogHelper::info('B 字符串'); // 记录下面的执行sql LogHelper::sql(); // 输出: // [2021-04-15 11:50:37] [0.627499] sql:select * from `user` where `mobile` = '' limit 1 []
2022年03月14日
137 阅读
0 评论
0 点赞
2022-03-14
Laravel-admin 删除行|删除回调
在模型中增加protected static function booted() { static::deleting(function ($param) { $total = 1; //在这里去做逻辑判断,$param->id 可以拿到当前操作id if ($total > 0) { throw new \Exception("无法删除"); } return true; }); }
2022年03月14日
366 阅读
17 评论
0 点赞
2022-03-14
Mac显示隐藏文件
打开一个Terminal终端窗口defaults write com.apple.finder AppleShowAllFiles TRUE重启Finderkillall Finder恢复隐藏设置defaults write com.apple.finder AppleShowAllFiles FALSE重启Finderkillall Finder
2022年03月14日
88 阅读
0 评论
0 点赞
2022-03-08
Mysql主从|笔记
为什么要做主从复制{callout color="#f0ad4e"}1、在业务复杂的系统中,有这么一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运作2、做数据的热备3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能{/callout}原理{message type="info" content="binlog(主库中保存所有更新事件日志的二进制文件)"/}主从复制的基础是主库记录数据库的所有变更记录到binlog。binlog是数据库服务器启动的那一刻起,保存所有修改数据库结构或内容的一个文件。mysql主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。在主库里,只要有更新事件出现,就会被依次地写入到binlog里面,之后会推到从库中作为从库进行复制的数据源。{dotted startColor="#ff6c6c" endColor="#1989fa"/}{message type="info" content="binlog输出线程"/}每当有从库连接到主库的时候,主库都会创建一个线程然后发送binlog内容到从库。对于每一个即将发送给从库的sql事件,binlog输出线程会将其锁住。一旦该事件被线程读取完之后,该锁会被释放,即使在该事件完全发送到从库的时候,该锁也会被释放。在从库里,当复制开始的时候,从库就会创建两个线程进行处理:{message type="info" content="从库I/O线程"/}当START SLAVE语句在从库开始执行之后,从库创建一个I/O线程,该线程连接到主库并请求主库发送binlog里面的更新记录到从库上。从库I/O线程读取主库的binlog输出线程发送的更新并拷贝这些更新到本地文件,其中包括relay log文件。{message type="info" content="从库的SQL线程"/}从库创建一个SQL线程,这个线程读取从库I/O线程写到relay log的更新事件并执行。可以知道,对于每一个主从复制的连接,都有三个线程(binlog输出线程、从库I/O线程、从库的SQL线程)。拥有多个从库的主库为每一个连接到主库的从库创建一个binlog输出线程,每一个从库都有它自己的I/O线程和SQL线程。{callout color="#f0ad4e"}从库通过创建两个独立的线程,使得在进行复制时,从库的读和写进行了分离。因此,即使负责执行的线程运行较慢,负责读取更新语句的线程并不会因此变得缓慢。比如说,如果从库有一段时间没运行了,当它在此启动的时候,尽管它的SQL线程执行比较慢,它的I/O线程可以快速地从主库里读取所有的binlog内容。这样一来,即使从库在SQL线程执行完所有读取到的语句前停止运行了,I/O线程也至少完全读取了所有的内容,并将其安全地备份在从库本地的relay log,随时准备在从库下一次启动的时候执行语句。{/callout}步骤一:主库db的更新事件(update、insert、delete)被写到binlog步骤二:从库发起连接,连接到主库步骤三:此时主库创建一个binlog dump thread,把binlog的内容发送到从库步骤四:从库启动之后,创建一个I/O线程,读取主库传过来的binlog内容并写入到relay log步骤五:还会创建一个SQL线程,从relay log里面读取内容,从Exec_Master_Log_Pos位置开始执行读取到的更新事件,将更新内容写入到slave的db搭建{callout color="#f0ad4e"}环境:以宝塔为例服务器:linux{/callout}1.在 主库 创建一个用户CREATE USER 'test'@'%' IDENTIFIED BY 'test';2.给创建的用户赋予权限mysql> grant all privileges on *.* to 'test[账号]'@'%' identified by 'test[密码]' with grant option;3.刷新权限mysql> FLUSH PRIVILEGES;4.查看状态mysql> show master status;5.登陆 从库 执行连接修改 server-id 需要和主库不一致文件位置在 /etc/mysql/mysql.conf.d/mysqld.cnfchange master to master_host='192.168.0.1',master_user='test',master_password='test',master_log_file='mysql-bin.000016',master_log_pos=5501;{callout color="#f0ad4e"}master_user:主服务器的用户master_password: 主服务器的密码master_log_file: 也就是我们一号服务器打印的File表里的信息master_log_pos:主库服务器中Position 这里一定要看清楚{/callout}6.查看状态 show slave status\G如果是yesSlave_IO_Running: Yes Slave_SQL_Running: Yes如果出现No 重新启动下mysql服务即可!Mysql关闭主从主服务器reset master;重启mysql从服务器stop slave; reset slave all;重启mysql
2022年03月08日
194 阅读
0 评论
0 点赞
1
...
7
8
9
...
12