首页
关于
Search
1
2022最新WPS政府/教育版合集
3,281 阅读
2
欢迎使用 Typecho
3,097 阅读
3
thinkphp 做301重定向跳转
2,550 阅读
4
IDE 注册教程
2,382 阅读
5
nginx反向代理设置泛目录解析
2,371 阅读
源码
教程
HTML
JAVASCRIPT
PHP
MYSQL
系统
LINUX
WINDOWS
填坑
工具
登录
/
注册
Search
标签搜索
系统工具
内网穿透
PHPDesktop
TaurusCoders
累计撰写
52
篇文章
累计收到
1
条评论
首页
栏目
源码
教程
HTML
JAVASCRIPT
PHP
MYSQL
系统
LINUX
WINDOWS
填坑
工具
页面
关于
搜索到
32
篇与
教程
的结果
2024-04-02
PhpStorm配置Xdebug最完整最详解教程
前言很多人好奇网上关于php配置xdebug的教程那么多,为什么我还要写这篇文章?因为网上的教程配置很乱,很多都是复制粘贴,有些配置项根本不需要,也不解释干嘛的,而且不够详细。本教程主要应用于Windows,Mac和Linux基本上同理。配置xdebug扩展只配置Debug,不配置profiler和trace,profiler和trace干嘛的请百度。因为大多数情况下是单用户调试,所以不需要配置多用户参数,如:php.ini文件xdebug.idekey参数和PhpStorm的Debug -> DBGp Proxy。所以php.ini大概配置如下:zend_extension= php_xdebug.dllxdebug.remote_enable=Onxdebug.remote_host=127.0.0.1xdebug.remote_port=9100xdebug官网下载地址:https://xdebug.org/download.php扩展一定要装对,注意区分ts和nts版本,phpinfo()查看扩展是否成功。推荐 phpEnv集成环境 ,自带xdebug扩展和多版本php设置PhpStorm打开PhpStorm,菜单File -> Settings,然后找到 Languages & Frameworks -> PHP -> Debug设置Debug port为9100为什么不是9000?因为会和一些集成环境的php-cgi或者php-fpm端口冲突.然后配置Languages & Frameworks -> PHP -> Servers然后找到PhpStorm右上角电话图标,开始监听php debug的链接打开 phpEnv集成环境 的TCP端口进程列表,有9100端口,说明监听成功触发断点调试在你需要的代码处打断点,这是基础和必须,就不多介绍了。触发PhpStorm的debug方式主要有两种GET、POST存在XDEBUG_SESSION_START 参数或者cookie里存在XDEBUG_SESSION,单用户调试 值随意。GET、POST会生成cookie XDEBUG_SESSION,有效期为1个小时(可修改php.ini配置)。很多教程需要下载Xdebug helper等浏览器插件,原理就是请求里附加cookie。php.ini文件 xdebug.remote_autostart 参数设置为On或者1,无需设置GET、POST、cookie。(不推荐,虽然不需要设置参数,设置针对环境,而不是项目,还要重启php环境)浏览器调试针对第1种,教大家用一种更简单的方式,不需要下载浏览器插件。找到PhpStorm右上角然后点小甲虫图标会打开浏览器访问你的url,并且携带GET参数XDEBUG_SESSION_START,同时生成cookie XDEBUG_SESSION,也就是说,下次(cookie有效期1小时)无需点击小甲虫,浏览器直接输入,如www.a.com或www.a.com/chat/1/即可触发调试Postman接口调试针对第1种,Postman触发方式如图可以直接添加GET、POST参数,在请求结束后,会自动附加cookie XDEBUG_SESSION,也可以手动添加cookie XDEBUG_SESSION。
2024年04月02日
422 阅读
0 评论
0 点赞
2023-12-23
php-beast加解密教程
php-beast 非常易用 效率又高的php代码保护扩展,介绍一下 windows 和linux上安装和使用的问题 ,以及如何处理常见解密问题1)Windows版本加密处理https://github.com/imaben/php-beast-binarieswindows下 可以直接在这里下载dll根据自己的php版本 还有是不是线程安全的 来选择下载对应的 放到对应的扩展目录 中在配置文件 php.ini中加入扩展配置extension=php_beast_x86_nts.dll但是秘钥是一样的 编译的话很多时候 会失败 或者出现lib版本不匹配问题老版本 我用vs编译过 dll收到版本限制比较麻烦处理官方提供的版本很稳定 直接二进制修改对应秘钥部分就可以了【1】处理aes的部分 ida分析到 变了对应的位置static uint8_t key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c,};根据文件偏移 用ue二进制编辑 找到对应位置 修改 保存即可【2】处理des部分ida逆向分析出秘钥变量的位置 和源码里面static char key[8] = { 0x01, 0x1f, 0x01, 0x1f, 0x01, 0x0e, 0x01, 0x0e,};正好对应上 用ue二进制编辑 修改保存测试通过 其他加密方式就不处理了 [3] encrypt_file_header_sign 修改 encrypt_file_header_sign 修改ida分析到 头 信息 位置 这个数据应该是在加密的文件最前面来标示文件是否被加密了 尽量特别一点我的版本 在76760这个位置长度是8 2)Linux 版本加密处理 编译前需要修改秘钥 新版本的加密方式比较多 需要修改的地方也比较多老版本的是在key.c中修改 新版 修改是在header.c中aes_algo_lib.cdes_algo_handler.cheader.c编译步骤如下120 wget https://github.com/liexusong/php-beast/archive/master.zip121 unzip master.zip122 cd php-beast-master/124 phpize125 ./configure --with-php-config=/apps/php/bin/php-config报错 找不到 php-config找一下自己的 配置在哪里130 find / -name "php-config"确定配置文件位置131 ./configure --with-php-config=/usr/local/php/bin/php-config132 sudo make && make install133 sudo make test134 php -m发现没成功 重新试一遍135 ./configure --with-php-config=/usr/local/php/bin/php-config136 sudo make && make install后面也要加sudo root权限137 sudo make && sudo make install138 php -m140 sudo make test成功添加到php配置文件种141 php -i|grep ini142 gedit /usr/local/php/etc/php.ini添加 extension="beast.so"146 php -i|grep extension153 service php-fpm restart重启php 开始加密测试154 cd tools/161 php encode_file.php --encrypt DES --oldfile 1.php --newfile 22.php162 php 22.php163 cat 221.php 加密后生成 2.php 加密后运行测试正常 3)php-beast解密 [1]修改过的密钥的 很难解密未知密钥只能暴力破解 分析 加密的文件头部 判断是 哪一种类型加密 三种加密类型 大多数是aes des的 base64的应该没人用 分析出加密类型 对文件主体进行破解分析 -----------------------分析说明 B----------------------------- #define INT_SIZE (sizeof(int)) x64上占4个字节 php_stream_write(output_stream,encrypt_file_header_sign, encrypt_file_header_length); php_stream_write(output_stream, (const char *)&dumplen, INT_SIZE); 长度 php_stream_write(output_stream, (const char *)&expireval, INT_SIZE); 过期时间 php_stream_write(output_stream, (const char *)&dumptype, INT_SIZE); 加密类型 des=1 BEAST_ENCRYPT_TYPE_DES = 1, dumptype默认des 值为1 BEAST_ENCRYPT_TYPE_AES, BEAST_ENCRYPT_TYPE_BASE64, 使用beast_encode_file()函数加密文件,函数原型如下:beast_encode_file(string $input_file, string $output_file, int expire_timestamp, int encrypt_type)。$input_file: 要加密的文件$output_file: 输出的加密文件路径$expire_timestamp: 文件过期时间戳$encrypt_type: 加密使用的算法(支持:BEAST_ENCRYPT_TYPE_DES、BEAST_ENCRYPT_TYPE_AES) -----------------------分析说明 E----------------------------- 【2】默认密钥加密的 ,未修改过的最多 大多数保护代码的三方为了安装容易 都会使用默认的密钥加密方式,否则一个服务器部署多个版本php-beast 会增加难度 易用性降低 默认密钥 如下 自己解密主体就好了 des_key = "11" aes_key=2b,懒人也可以 用免费的工具 解密默认的php-beast加密的文件 点击 传送门phpbeast-beast解密decode-在线工具
2023年12月23日
544 阅读
0 评论
0 点赞
2023-07-07
模拟浏览器抓取网页信息
在我们日常做采集数据的时候,经常会遇到采集源使用前后端分离的,查看源代码什么数据都没有,接口也是加密的,无法采集到数据,那这个时候怎么办呢?这个时候我们可以使用 WebDriver去采集内容,它可以帮你获得页面加载完成并获取完整的渲染后的页面内容,包括动态生成的内容。这意味着您可以采集到前后端分离网站上通过 JavaScript 或 AJAX 加载的数据。接下来让我自己动手写一个试试看。Part1centos 安装 google-chrome和chromedrive1下载 Chrome 浏览器的安装包:wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm2安装 Chrome 浏览器:sudo yum localinstall google-chrome-stable_current_x86_64.rpm3验证 Chrome 是否成功安装:google-chrome --version4下载对应版本的 ChromeDriver,并解压到指定目录(/usr/local/bin):wget https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zipunzip chromedriver_linux64.zip -d /usr/local/bin/5启动 ChromeDriver 服务:LANGUAGE=ZH-CN.UTF-8 /usr/local/bin/chromedriver --port=95156成功运行后(不要关闭),您应该会看到类似以下输出:Starting ChromeDriver {version} on port 9515...Only local connections are allowed.Please see https://chromedriver.chromium.org/security-considerations for suggestions on keeping ChromeDriver safe.ChromeDriver was started successfully.Part2PHP代码实现当做完前面两步准备工作,安装好了浏览器(Google Chrome)与浏览器驱动程序(Chromdriver)之后,总算可以进入主题,安装与使用 Php-webdriver 了。我们先再试试看bilibili这个网站,比如:下图的大世界扭蛋机这个标题(图1),我们查看网页源码是没有对应的视频标题的(图2)。(图1)(图2)现在让我们试试看使用webdriver扩展去抓取试试看。使用composer安装Php-webdrivercomposer require php-webdriver/webdriver写php代码<?phprequire_once('vendor/autoload.php');use Facebook\WebDriver\Remote\DesiredCapabilities;use Facebook\WebDriver\Remote\RemoteWebDriver;use Facebook\WebDriver\Chrome\ChromeOptions;$options = new ChromeOptions();$options->addArguments(['--no-sandbox','--headless']);$capabilities = DesiredCapabilities::chrome();$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);$host = 'http://localhost:9555';$driver = RemoteWebDriver::create($host, $capabilities);$url = 'https://www.bilibili.com/movie/index/?from_spmid=666.7.index.1#st=2&style_id=10104&area=-1&release_date=-1&season_status=-1&order=2&sort=0&page=1';// 访问网站$driver->get($url);// 获取页面源代码$pageSource = $driver->getPageSource();echo $pageSource;// 关闭 WebDriver 会话$driver->quit();运行结果成功获取源代码。Part3介绍一下xpathXPath 是一种用于在 XML 或 HTML 文档中定位元素的语言。在 PHP WebDriver 中,XPath 是一个重要的工具,可以帮助我们定位和操作页面上的元素。XPath 表达式由节点选择器和路径表达式组成。以下是一些常用的 XPath 语法和示例:选择元素://tagname:选择所有具有指定标签名称的元素。//tagname[@attribute='value']:选择具有指定属性值的元素。//tagname[text()='text']:选择具有指定文本内容的元素。选择父子关系:/parent/child:选择父节点下的直接子节点。/parent//descendant:选择父节点下所有后代节点。选择兄弟关系:/preceding-sibling::sibling:选择当前节点之前的同级节点。/following-sibling::sibling:选择当前节点之后的同级节点。使用逻辑运算符:and、or、not():使用逻辑运算符进行条件组合。使用通配符:*:匹配任意元素。@*:匹配任意属性。以下是一个使用 XPath 定位元素并执行操作的示例代码:<?php$driver = RemoteWebDriver::create($host, $capabilities);// 打开网页$driver->get('https://www.example.com/');// 使用 XPath 定位元素并执行操作$element = $driver->findElement(WebDriverBy::xpath("//input[@name='username']"));$element->sendKeys('admin');// 关闭 WebDriver 连接$driver->quit();上述代码中,我们使用 $driver->findElement() 方法和 WebDriverBy::xpath() 来通过 XPath 表达式定位页面上的元素。在示例中,我们使用了 //input[@name='username'] 的 XPath 表达式来选择具有 name 属性值为 'username' 的 <input> 元素。然后,我们使用 $element->sendKeys() 方法向选定的元素发送键盘输入。请注意,XPath 是一种强大而灵活的定位工具,可以根据不同的需求编写不同的表达式。您可以根据页面结构和要定位的元素特征来编写适当的 XPath 表达式。
2023年07月07日
349 阅读
0 评论
0 点赞
2023-03-09
ASCII对应码表-键值
ASCII对应码表-键值(完整版) Bin(二进制)Oct(八进制)Dec(十进制)Hex(十六进制)缩写/字符解释0000 00000000x00NUL(null)空字符0000 00010110x01SOH(start of headline)标题开始0000 00100220x02STX (start of text)正文开始0000 00110330x03ETX (end of text)正文结束0000 01000440x04EOT (end of transmission)传输结束0000 01010550x05ENQ (enquiry)请求0000 01100660x06ACK (acknowledge)收到通知0000 01110770x07BEL (bell)响铃0000 100001080x08BS (backspace)退格0000 100101190x09HT (horizontal tab)水平制表符0000 1010012100x0ALF (NL line feed, new line)换行键0000 1011013110x0BVT (vertical tab)垂直制表符0000 1100014120x0CFF (NP form feed, new page)换页键0000 1101015130x0DCR (carriage return)回车键0000 1110016140x0ESO (shift out)不用切换0000 1111017150x0FSI (shift in)启用切换0001 0000020160x10DLE (data link escape)数据链路转义0001 0001021170x11DC1 (device control 1)设备控制10001 0010022180x12DC2 (device control 2)设备控制20001 0011023190x13DC3 (device control 3)设备控制30001 0100024200x14DC4 (device control 4)设备控制40001 0101025210x15NAK (negative acknowledge)拒绝接收0001 0110026220x16SYN (synchronous idle)同步空闲0001 0111027230x17ETB (end of trans. block)结束传输块0001 1000030240x18CAN (cancel)取消0001 1001031250x19EM (end of medium)媒介结束0001 1010032260x1ASUB (substitute)代替0001 1011033270x1BESC (escape)换码(溢出)0001 1100034280x1CFS (file separator)文件分隔符0001 1101035290x1DGS (group separator)分组符0001 1110036300x1ERS (record separator)记录分隔符0001 1111037310x1FUS (unit separator)单元分隔符0010 0000040320x20(space)空格0010 0001041330x21!叹号0010 0010042340x22"双引号0010 0011043350x23#井号0010 0100044360x24$美元符0010 0101045370x25%百分号0010 0110046380x26&和号0010 0111047390x27'闭单引号0010 1000050400x28(开括号0010 1001051410x29)闭括号0010 1010052420x2A*星号0010 1011053430x2B+加号0010 1100054440x2C,逗号0010 1101055450x2D-减号/破折号0010 1110056460x2E.句号0010 1111057470x2F/斜杠0011 0000060480x300字符00011 0001061490x311字符10011 0010062500x322字符20011 0011063510x333字符30011 0100064520x344字符40011 0101065530x355字符50011 0110066540x366字符60011 0111067550x377字符70011 1000070560x388字符80011 1001071570x399字符90011 1010072580x3A:冒号0011 1011073590x3B;分号0011 1100074600x3C<小于0011 1101075610x3D=等号0011 1110076620x3E>大于0011 1111077630x3F?问号0100 00000100640x40@电子邮件符号0100 00010101650x41A大写字母A0100 00100102660x42B大写字母B0100 00110103670x43C大写字母C0100 01000104680x44D大写字母D0100 01010105690x45E大写字母E0100 01100106700x46F大写字母F0100 01110107710x47G大写字母G0100 10000110720x48H大写字母H0100 10010111730x49I大写字母I010010100112740x4AJ大写字母J0100 10110113750x4BK大写字母K0100 11000114760x4CL大写字母L0100 11010115770x4DM大写字母M0100 11100116780x4EN大写字母N0100 11110117790x4FO大写字母O0101 00000120800x50P大写字母P0101 00010121810x51Q大写字母Q0101 00100122820x52R大写字母R0101 00110123830x53S大写字母S0101 01000124840x54T大写字母T0101 01010125850x55U大写字母U0101 01100126860x56V大写字母V0101 01110127870x57W大写字母W0101 10000130880x58X大写字母X0101 10010131890x59Y大写字母Y0101 10100132900x5AZ大写字母Z0101 10110133910x5B[开方括号0101 11000134920x5C\反斜杠0101 11010135930x5D]闭方括号0101 11100136940x5E^脱字符0101 11110137950x5F_下划线0110 00000140960x60`开单引号0110 00010141970x61a小写字母a0110 00100142980x62b小写字母b0110 00110143990x63c小写字母c0110 010001441000x64d小写字母d0110 010101451010x65e小写字母e0110 011001461020x66f小写字母f0110 011101471030x67g小写字母g0110 100001501040x68h小写字母h0110 100101511050x69i小写字母i0110 101001521060x6Aj小写字母j0110 101101531070x6Bk小写字母k0110 110001541080x6Cl小写字母l0110 110101551090x6Dm小写字母m0110 111001561100x6En小写字母n0110 111101571110x6Fo小写字母o0111 000001601120x70p小写字母p0111 000101611130x71q小写字母q0111 001001621140x72r小写字母r0111 001101631150x73s小写字母s0111 010001641160x74t小写字母t0111 010101651170x75u小写字母u0111 011001661180x76v小写字母v0111 011101671190x77w小写字母w0111 100001701200x78x小写字母x0111 100101711210x79y小写字母y0111 101001721220x7Az小写字母z0111 101101731230x7B{开花括号0111 110001741240x7C|垂线0111 110101751250x7D}闭花括号0111 111001761260x7E~波浪号0111 111101771270x7FDEL (delete)删除
2023年03月09日
437 阅读
0 评论
0 点赞
2023-03-09
可以自定义密钥的PHP源码加密模块
PHP-Beast是一个PHP源码加密的模块,其使用DES算法加密,用户可以自定义加密的key来加密源代码。PHP-Beast是一个PHP源码加密的模块,其使用DES算法加密,用户可以自定义加密的key来加密源代码。1、PHP-Beast的安装1234567$ wget https://github.com/liexusong/php-beast/archive/master.zip$ unzip master.zip$ cd php-beast-master$ phpize$ ./configure$ make$ sudo make install注意:在编译扩展之前先修改加密的key,如下图。编译好之后修改php.ini配置文件,加入配置项:extension=beast.so,重启php-fpm。安装完成后可以在phpinfo中看到如下结果:2、安装好PHP-Beast模块后,可以使用工具包中的encrypt_project.php工具来加密你的项目,你只需要输入项目的路径和输出的项目路径即可(这个工具只会加密PHP文件,其他文件只会简单的复制),如:加密完成后使用文本编辑器看编译后的文件可以发现已经变为乱码,如:3. 当然你可能不希望加密项目的所有PHP源文件,所以你可以使用PHP-Beast模块提供的beast_encode_file()函数来加密其中的某个文件,使用方法:1beast_encode_file($input_file, $output_file)$input_file是要加密的文件,$output_file是要输出加密后的文件。4. 把源码加密后就可以放到服务器上运行了。另外PHP-Beast模块提供缓存功能,我们可以在php.ini文件中修改缓存的大小来控制PHP-Beast模块可以使用的缓存。如:12[beast]beast.cache_size = 20000我们可以使用beast_cache_status()函数来查看缓存的状态。
2023年03月09日
521 阅读
0 评论
0 点赞
2023-02-01
MySQL 带参数的存储过程(动态执行SQL语句)
MySQL5.0 以后,支持动态sql语句。当SQL语句中 字段名,表名,数据库名等 要作为变量时,必须要使用动态SQL。MySQL动态SQL语法如下:set sql = (预处理的sql语句,可以是用concat拼接的语句)set @sql = sql //你的sql语句PREPARE stmt FROM @sql; EXECUTE stmt (如果sql有参数的话, USING xxx,xxx); // 这里USING的只能是会话变量;DEALLOCATE PREPARE stmt;1、 定义要执行的sql变量,并为其赋值2、预定义好要使用的sql.3、执行预定义的sql4、释放掉数据库连接实例1:delimiter //create procedure pro_test()beginset @_sql = 'select ? + ?';set @a = 5;set @b = 6;PREPARE stmt from @_sql; // 预定义sqlEXECUTE stmt USING @a,@b;// 传入两个会话变量来填充sql中的 ?DEALLOCATE PREPARE stmt; // 释放连接end //调用:call pro_test();返回结果:11实例2:delimiter //CREATE PROCEDURE pro_stu(in order_param VARCHAR(50),in startindex int ,in size int)BEGIN set @v_sql = "select * from student s ORDER BY ? LIMIT ?,?"; PREPARE stmt from @v_sql; set @a = order_param; set @b = startindex; set @c = size; EXECUTE stmt using @a,@b,@c; DEALLOCATE PREPARE stmt;end//delimiter;调用:call pro_stu('s.s_no desc',0,20);输出结果:image.png注意:MySQL 在存储过程中是不支持直接使用变量名作为表名或者是列名的,而在实际的应用中确实会用到变表名或者变量名的情况。以下实例简单说明动态表名、列名的查询。实例3:DROP PROCEDURE IF EXISTS select_test;delimiter //create PROCEDURE select_test(tableName varchar(20)) -- 创建存储过程 命名为testsBEGIN -- 存储过程的开始 set @tableNames = CONCAT(tableName); -- @先在用户变量中保存值然后在以后引用它 set @v_sql = CONCAT('select * from ',@tableNames);-- 拼接查询总记录的SQL语句 prepare stmt from @v_sql; -- 预定义一个语句,并将它赋给 stmt execute stmt ; -- 执行语句 deallocate prepare stmt;-- 要释放一个预定义语句的资源 end//-- 存储过程的结束delimiter;调用:call select_test('student');实例4:DROP PROCEDURE IF EXISTS myTest1;delimiter //create procedure myTest1(in columnName varchar(50)) -- 传入一个字符串BEGINdrop table if exists tmpTable; -- 如果临时表存在先删除掉set @_sql = concat('create temporary table if not exists tmpTable( ', columnName, ' varchar(50), id int(15), name varchar(50));'); -- 创建临时表的语法,我们把传入的参数拼接进来PREPARE stmt from @_sql; EXECUTE stmt;DEALLOCATE PREPARE stmt; -- 执行 desc tmpTable;end //调用:call myTest1('password');输出结果:作者:乘风破浪的姐姐链接:https://www.jianshu.com/p/d070abffa5fe来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2023年02月01日
948 阅读
0 评论
0 点赞
2022-11-09
thinkphp 404锛屾偍璇锋眰鐨勬枃浠朵笉瀛樺湪!
thinkphp6 当环境的pathinfo没启动的时候会报 404锛屾偍璇锋眰鐨勬枃浠朵笉瀛樺湪! 错误报错环境 系统windows10 宝塔面板 nginx php7.4修改nginx配置文件 php 74.conflocation ~ \.php(.*)$ { try_files $uri =404; fastcgi_pass 127.0.0.1:20074; fastcgi_index index.php; include fastcgi.conf; include pathinfo.conf; }重启php和nginx服务就可以解决
2022年11月09日
2,156 阅读
0 评论
0 点赞
2022-10-26
mysql 大表分页时获取总数方案
FOUND_ROWS() SELECT语句中经常可能用LIMIT限制返回行数。有时候可能想要知道如果没有LIMIT会返回多少行,但又不想再执行一次相同语句。那么,在SELECT查询中包含SQL_CALC_FOUND_ROWS选项,然后执行FOUND_ROWS()就可以了。 例如:需要取出一张表的前10行,同时又需要取出符合条件的总数。这在某些翻页操作中很常见mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10; mysql> SELECT FOUND_ROWS() 表示的是:在上一查询之后,你只需要用FOUND_ROWS()就能获得查询总数,这个数目是抛掉了LIMIT之后的结果数 其中第一个sql里面的SQL_CALC_FOUND_ROWS不可省略,它表示需要取得结果数,也是后面使用FOUND_ROWS()函数的铺垫。第二个SELECT将返回第一条SELECT如果没有LIMIT时返回的行数,如果在前一条语句中没有使用SQL_CALC_FOUND_ROWS选项,FOUND_ROWS()将返回前一条语句实际返回的行数。FOUND_ROWS()得到的数字是临时的,执行下一条语句就会失效。如果想要这个数字,就要将它保存下来 mysql> SELECT SQL_CALC_FOUND_ROWS * FROM ... ; mysql> SET @rows = FOUND_ROWS(); 如果使用 SELECT SQL_CALC_FOUND_ROWS,MySQL必须计算所有结果集的行数。尽管这样,总比再执行一次不使用LIMIT的查询要快多了吧,因为那样结果集要返回客户端的
2022年10月26日
1,328 阅读
0 评论
0 点赞
2022-06-14
nginx 设置详细日志记录
nginx 日志记录详细请求信息nginx.confworker_processes auto; worker_rlimit_nofile 51200; events { worker_connections 51200; multi_accept on; } http { include mime.types; #include luawaf.conf; include proxy.conf; default_type application/octet-stream; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" $request_time'; log_format log_json '{ "timestamp": "$time_local", ' '"remote_addr": "$remote_addr", ' '"referer": "$http_referer", ' '"request": "$request", ' '"status": $status, ' '"bytes": $body_bytes_sent, ' '"agent": "$http_user_agent", ' '"x_forwarded": "$http_x_forwarded_for", ' '"up_addr": "$upstream_addr",' '"up_host": "$upstream_http_host",' '"up_resp_time": "$upstream_response_time",' '"request_time": "$request_time"' ' }'; log_format main_all '[$time_local] client=$remote_addr ' 'request="$request" request_length=$request_length ' 'http_referer="$http_referer" ' 'bytes_sent=$bytes_sent ' 'body_bytes_sent=$body_bytes_sent ' 'user_agent="$http_user_agent" ' 'upstream_addr=$upstream_addr ' 'upstream_status=$upstream_status ' 'cookie="$http_cookie" ' 'request_body="$request_body" ' 'document_root="$document_root" ' 'fastcgi_script_name="$fastcgi_script_name" ' 'request_filename="$request_filename" ' 'request_time=$request_time ' 'upstream_response_time=$upstream_response_time ' 'upstream_connect_time=$upstream_connect_time ' 'upstream_header_time=$upstream_header_time '; log_format main_json escape=json '{ ' '"time_local": "$time_local", ' '"remote_addr": "$remote_addr", ' '"request": "$request", ' '"request_length": "$request_length", ' '"http_referer": "$http_referer", ' '"bytes_sent": "$bytes_sent", ' '"body_bytes_sent": "$body_bytes_sent", ' '"http_user_agent": "$http_user_agent", ' '"upstream_addr": "$upstream_addr", ' '"upstream_status": "$upstream_status", ' '"http_cookie": "$http_cookie", ' '"request_body": "$request_body", ' '"document_root": "$document_root", ' '"fastcgi_script_name": "$fastcgi_script_name", ' '"request_filename": "$request_filename", ' '"request_time": "$request_time", ' '"upstream_response_time": "$upstream_response_time", ' '"upstream_connect_time": "$upstream_connect_time", ' '"upstream_header_time": "$upstream_header_time"' ' },'; server_names_hash_bucket_size 512; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 256k; fastcgi_intercept_errors on; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE [1-6]\."; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; server_tokens off; access_log off; server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /nginx_status { allow 127.0.0.1; deny all; stub_status on; access_log off; } } include vhost/*.conf; #加载vhost目录下的虚拟主机配置文件 }参数说明:$args #请求中的参数值$query_string #同 $args$arg_NAME #GET请求中NAME的值$is_args #如果请求中有参数,值为"?",否则为空字符串$uri #请求中的当前URI(不带请求参数,参数位于$args),可以不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改,$uri不包含主机名,如"/foo/bar.html"。$document_uri #同 $uri$document_root #当前请求的文档根目录或别名$host #优先级:HTTP请求行的主机名>"HOST"请求头字段>符合请求的服务器名.请求中的主机头字段,如果请求中的主机头不可用,则为服务器处理请求的服务器名称$hostname #主机名$https #如果开启了SSL安全模式,值为"on",否则为空字符串。$binary_remote_addr #客户端地址的二进制形式,固定长度为4个字节$body_bytes_sent #传输给客户端的字节数,响应头不计算在内;这个变量和Apache的mod_log_config模块中的"%B"参数保持兼容$bytes_sent #传输给客户端的字节数$connection #TCP连接的序列号$connection_requests #TCP连接当前的请求数量$content_length #"Content-Length" 请求头字段$content_type #"Content-Type" 请求头字段$cookie_name #cookie名称$limit_rate #用于设置响应的速度限制$msec #当前的Unix时间戳$nginx_version #nginx版本$pid #工作进程的PID$pipe #如果请求来自管道通信,值为"p",否则为"."$proxy_protocol_addr #获取代理访问服务器的客户端地址,如果是直接访问,该值为空字符串$realpath_root #当前请求的文档根目录或别名的真实路径,会将所有符号连接转换为真实路径$remote_addr #客户端地址$remote_port #客户端端口$remote_user #用于HTTP基础认证服务的用户名$request #代表客户端的请求地址$request_body #客户端的请求主体:此变量可在location中使用,将请求主体通过proxy_pass,fastcgi_pass,uwsgi_pass和scgi_pass传递给下一级的代理服务器$request_body_file #将客户端请求主体保存在临时文件中。文件处理结束后,此文件需删除。如果需要之一开启此功能,需要设置client_body_in_file_only。如果将次文件传 递给后端的代理服务器,需要禁用request body,即设置proxy_pass_request_body off,fastcgi_pass_request_body off,uwsgi_pass_request_body off,or scgi_pass_request_body off$request_completion #如果请求成功,值为"OK",如果请求未完成或者请求不是一个范围请求的最后一部分,则为空$request_filename #当前连接请求的文件路径,由root或alias指令与URI请求生成$request_length #请求的长度 (包括请求的地址,http请求头和请求主体)$request_method #HTTP请求方法,通常为"GET"或"POST"$request_time #处理客户端请求使用的时间,单位为秒,精度毫秒; 从读入客户端的第一个字节开始,直到把最后一个字符发送给客户端后进行日志写入为止。$request_uri #这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI,不包含主机名,例如:"/cnphp/test.php?arg=freemouse"$scheme #请求使用的Web协议,"http" 或 "https"$server_addr #服务器端地址,需要注意的是:为了避免访问linux系统内核,应将ip地址提前设置在配置文件中$server_name #服务器名$server_port #服务器端口$server_protocol #服务器的HTTP版本,通常为 "HTTP/1.0" 或 "HTTP/1.1"$status #HTTP响应代码$time_iso8601 #服务器时间的ISO 8610格式$time_local #服务器时间(LOG Format 格式)$cookie_NAME #客户端请求Header头中的cookie变量,前缀"$cookie_"加上cookie名称的变量,该变量的值即为cookie名称的值$http_NAME #匹配任意请求头字段;变量名中的后半部分NAME可以替换成任意请求头字段,如在配置文件中需要获取http请求头:"Accept-Language",$http_accept_language即可$http_cookie$http_host #请求地址,即浏览器中你输入的地址(IP或域名)$http_referer #url跳转来源,用来记录从那个页面链接访问过来的$http_user_agent #用户终端浏览器等信息$http_x_forwarded_for$sent_http_NAME #可以设置任意http响应头字段;变量名中的后半部分NAME可以替换成任意响应头字段,如需要设置响应头Content-length,$sent_http_content_length即可$sent_http_cache_control$sent_http_connection$sent_http_content_type$sent_http_keep_alive$sent_http_last_modified$sent_http_location$sent_http_transfer_encoding
2022年06月14日
1,063 阅读
0 评论
0 点赞
2022-02-27
阿里云ECS数据盘扩容操作
服务器系统是Centos7,环境是宝塔面板,数据都存在宝塔默认目录www;数据盘在使用一段时间后满了,然后在阿里云控制台云盘管理中直接扩容满了的那个盘。扩容之后登录服务器查看数据盘依旧是原来大小,解决办法:
2022年02月27日
1,315 阅读
0 评论
0 点赞
2022-02-21
使用ffmpeg视频切片并加密
想达到的目的:将一个mp4视频文件切割为多个ts片段,并在切割过程中对每一个片段使用 AES-128 加密,最后生成一个m3u8的视频索引文件;电脑环境 Fedora,已经安装了最新的ffmpeg;如果要加密,首先准备好一下两个东西: 加密用的 keyopenssl rand 16 > enc.key ( 生成一个enc.key文件 ) 另一个是 ivopenssl rand -hex 16 ( 生成一段字符串,记下来) 新建一个文件 enc.keyinfo 内容格式如下:Key URI # enc.key的路径,使用http形式 Path to key file # enc.key文件 IV # 上面生成的iv 几个例子:http://localhost/video/enc.keyenc.key 48c674428c1e719751565ad00fe24243 最后重点来了 ffmpeg -y \-i test.mp4 \-hls_time 12 \ # 将test.mp4分割成每个小段多少秒-hls_key_info_file enc.keyinfo \-hls_playlist_type vod \ # vod 是点播,表示PlayList不会变-hls_segment_filename "file%d.ts" \ # 每个小段的文件名 playlist.m3u8 # 生成的m3u8文件 生成的m3u8文件可以通过大部分播放器直接播放
2022年02月21日
2,336 阅读
0 评论
0 点赞
2022-01-28
2022最新WPS政府/教育版合集
【教育考试专版】下载地址:http://ncre.neea.edu.cn/html1/report/1507/861-1.htm 【温州大学】http://itc.wzu.edu.cn/info/1032/3661.htm 【云南师范大学】https://it.ynnu.edu.cn/info/1146/2421.htm 【西南民族大学】http://ms.swun.edu.cn/download/wps.html 【大庆市人民政府】http://www.daqing.gov.cn/xiangguanxiazai/14436.html 【富蕴县党建网】http://www.xjfydj.com/P/C/66148.htm 【晋城市党政机关】https://wps.jcgov.gov.cn/downloadOffice 合集下载地址:https://www.123pan.com/s/VzVA-murbd 提取码:9neD
2022年01月28日
3,281 阅读
0 评论
0 点赞
idea激活
1. 在Licence Server 激活:(以下总有可以的吧))http://idea.imsxm.com/ (亲测直至目前均可用)http://www.0-php.com:1017http://idea.singee77.com/ http://idea.lanyus.com/ http://idea.qinxi1992.cn/2. 浏览器打开 http://idea.lanyus.com/ , 点击页面中的“获得注册码”,然后在注册时切换至Activation Code选项,输入获得的注册码一长串字符串,就可以注册成功!(推荐方法)本教程分享两种破解方法,小伙伴们二选一即可:1. 第一种:👉 [(补丁)无限重置 30天试用期]PS: 第一种仅适用于 PhpStorm 2021.2.2 (包含 2021.2.2 版本) 以下版本,可下载 PhpStorm 历史版本来使用。2. 第二种:👉 (补丁+激活码)可激活 PhpStorm 到 2099 年,即本文教程所写的,具体步骤跟着下面的图文教程一步一步来就行,一分钟即可搞定,过程也非常简单。无图无真相,下面截图是成功激活到 2099 的:注意本教程适用于 PhpStorm IntelliJ IDEA 2021.3 以下所有版本,请放心食用~本教程适用于 JetBrains 全系列产品,包括 IDEA、Pycharm、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。本教程适用 Windows/Mac/Linux 系统,文中以 Windows 系统为例做讲解,其他系统按照教程顺序即可。教程开始1. 运行 PhpStorm 2021.3 运行, 中间会先弹出一个注册框,我们勾选 Evaluate for free, 点击 Evaluate, 先试用30天:注意,如果没有弹出上面的界面,可先执行 reset_script 文件夹中的重置试用期脚本,脚本地址下文可获取,先进到 PhpStorm 里面打开该文件夹后,有对应系统的执行脚本,执行即可:windows系统:reset_jetbrains_eval_windows.vbs linux/mac系统:reset_jetbrains_eval_mac_linux.sh最新的 PhpStorm 2021.3 版本界面发生了变化,取消了直接试用 30 天的按钮,需要我们先注册一个 JetBrains,如下:PS: 部分小伙伴反映点击注册 PhpStorm 按钮后,网页打不开,无法访问,原因是因为他在 hosts 文件中添加了东西,删除还原回去就能正常访问了。注册账号并登录后,就可以试用2. 清空 IDEA 以前使用过的激活方式【非常重要】如果你之前安装过 PhpStorm, 那么修改过的 hosts 文件要还原回去、引用过的补丁要移除掉等, 不然可能会有各种奇奇怪怪的问题。3. 引用破解补丁包注册好 JetBrains 账号后,登录打开 PhpStorm, 先随便新建个项目或者打开个旧项目:然后依次点击菜单 Helo -> Edit Custom VM Options 来通过 PhpStorm 修改 idea.vmoptions 文件, 在末尾引用破解补丁,补丁下文可获取 :# 我这边将补丁放置在了D盘根目录下,小伙伴们可以根据自己实际的位置进行修改 -javaagent:D:\\FineAgent.jar4. 重启IDEA !重启PhpStorm!【非常重要,必须】引用补丁成功后,需要重启 PhpStorm,才能加载补丁。5. 填入激活码重启 PhpStorm 后,开始输入激活码,先将 ActivationCode.txt 文件中的激活码复制出来;输入激活码:至此,大功告成,可以看到我们已经成功激活到 2099 年了~
2022年01月05日
696 阅读
0 评论
0 点赞
2021-06-17
nginx二级目录反向代理
location /htmls/ { proxy_pass http://domain/htmls/; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
2021年06月17日
930 阅读
0 评论
0 点赞
2021-06-08
搭建PSI
进入主题,PSI的安装过程:1-源码下载地址:http://git.oschina.net/crm8000/PSI2-下载以后上传到网站的根目录,进行解压,解压以后的文件目录如下# cd /web/test.psi.com/wwwroot# ls -l3-创建数据库 创建库名为psi,字符集为utf8的库,授权psier用户来登录,密码为abcd.1234mysql> create database psi character set utf8;mysql> grant all on psi.* to 'psier'@'localhost' identified by 'abcd.1234';4-导入初始化数据库数据# cd doc/99\ SQL/# mysql -upsier -h127.0.0.1 -pabcd.1234 psi < 01CreateTables.sql --导入表结构# mysql -upsier -h127.0.0.1 -pabcd.1234 psi < 02InsertInitData.sql --导入初始化数据# mysql -upsier -h127.0.0.1 -pabcd.1234 psi < 99psi_demo_data.sql --导入测试数据(这一步可选,我没有导入)5-修改配置文件的数据库连接# vim web/Application/Common/Conf/config.php 修改function PSI_getUser和PSI_getPassword 中的return 值如下图修改以上两个地方,其他不变,保存退出。6-配置nginx.confserver { listen 80; server_name test.psi.com; root /web/test.psi.com/wwwroot; index index.html index.htm default.htm index.php; location / { if (!-e $request_filename){ rewrite ^/web/(.*)$ /web/index.php/$1 last; #--关键的配置,支持ThinkPHP的rewrite支持 } } location ~ .*\.php { #--经测试,必须以去除?$结尾,去掉$是为了不匹配行末,即可以匹配.php/,以实现pathinfo fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi.conf; include pathinfo.conf; #--关键的配置,支持ThinkPHP的pathinfo支持 } access_log logs/test.psi.com_access.log main; error_log logs/test.psi.com_error.log; }# cat /usr/local/nginx/conf/pathinfo.confset $real_script_name $fastcgi_script_name;if ($fastcgi_script_name ~ "(.+?\.php)(/.*)") {set $real_script_name $1;set $path_info $2; }fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;fastcgi_param SCRIPT_NAME $real_script_name;fastcgi_param PATH_INFO $path_info;7-重启nginx# /usr/local/nginx/sbin/nginx -s reload8-浏览器测试访问
2021年06月08日
1,188 阅读
0 评论
0 点赞
1
2
3