首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
185 阅读
2
php接口优化 使用curl_multi_init批量请求
145 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
34
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-10
php发送http put/patch/delete请求Demo
php发送http put/patch/delete请求DemoCURL请求对于PHPer是必备技能,使用curl_opt函数来发送各式各样的http请求动作,不仅限于get和post。在测试自己的restful api的时候,通过访问这个代理发送http put/patch/delete请求的php页面,完成测试。请参考下面的DEMO。<?php /** * http.php * 用来向服务器的RESTful API发起各类HTTP请求的工具函数。 * * 使用: http://localhost/http.php?action=xxx * xxx \in {get,post,put,patch,delete} * * Created by PhpStorm. * User: Lenix * Date: 2018/1/6 * Time: 下午20:22 */ class commonFunction{ public function callInterfaceCommon(string $URL, string $type, string $params, array $headers):string { $ch = curl_init($URL); $timeout = 5; if($headers!=""){ curl_setopt ($ch, CURLOPT_HTTPHEADER, $headers); }else { curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-type: application/<a class="wpal-linked-keyword" href="http://json.p2hp.com/" target="_blank">json</a>')); } curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); switch ($type){ case "GET" : curl_setopt($ch, CURLOPT_HTTPGET, true);break; case "POST": curl_setopt($ch, CURLOPT_POST,true); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; case "PUT" : curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "PUT"); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; case "PATCH": curl_setopt($ch, CULROPT_CUSTOMREQUEST, 'PATCH'); curl_setopt($ch, CURLOPT_POSTFIELDS, $params);break; case "DELETE":curl_setopt ($ch, CURLOPT_CUSTOMREQUEST, "DELETE"); curl_setopt($ch, CURLOPT_POSTFIELDS,$params);break; } $file_contents = curl_exec($ch);//获得返回值 return $file_contents; curl_close($ch); } } $params="{user:\"admin\",pwd:\"admin\"}"; //$headers=array('Content-Type: text/html; charset=utf-8'); //$headers=array('accept: application/json; Content-Type:application/json-patch+json'); $headers=array('Content-Type:application/json-patch+json'); #$url=$GLOBALS["serviceUrl"]."/user"; $url='http://localhost/action.php'; $cf = new commonFunction(); $action=strtoupper($_GET['action']); echo "你指定的HTTP请求动作为".$action."<br/><hr/>"; $strResult = $cf->callInterfaceCommon($url,$action,$params,$headers); echo "执行该HTTP请求动作,得到<br/>".$strResult;
2023年08月10日
46 阅读
0 评论
0 点赞
2023-08-10
PHP中类静态调用和范围解析操作符的区别
PHP中类静态调用和范围解析操作符的区别<?php //在子类或类内部用“::”调用本类或父类时,不是静态调用方法,而是范围解析操作符。 class ParentClass { public static $my_static = 'parent var '; public function test() { self::who(); // 输出 'parent' 是范围解析,不是静态调用 $this->who(); // 输出 'child' static::who(); // 输出 'child' 延迟静态绑定 是范围解析,不是静态调用 } public function who() { echo 'parent<br>'; } } class ChildClass extends ParentClass { public static $my_static = 'child var '; public function who() { echo 'child<br>'; } } $obj = new ChildClass(); $obj->test(); echo ChildClass::$my_static;//静态调用 输出child var上面输出parentchildchildchild var
2023年08月10日
8 阅读
0 评论
0 点赞
2023-08-10
一行代码就将你的PHP-FPM内存占用降低至少一半
一行代码就将你的PHP-FPM内存占用降低至少一半PHP-FPM是PHP的FastCGI过程管理器。在类Unix操作系统(包括Linux以及BSD系统)中,PHP-FPM通过安装php5-fpm(Linux)或者php56-fpm(FreeBSD 10.1)来使用。但是缺省安装以及按照大量博客推荐安装的PHP-FPM的最大问题是它会消耗大量资源,包括内存和CPU。本博客使用的服务器也遭遇了类似的命运。因为我也是按照那些教程安装的,而教程里对于PHP-FPM的配置选项描述的不够有效。你可以在/etc/php5/fpm/pool.d目录下发现这些低效的配置选项。举例来说,以下是我的服务器(当然不是目前这个站点)上的那些低效选项:; Choose how the process manager will control the number of child processes.pm = dynamicpm.max_children = 75pm.start_servers = 10pm.min_spare_servers = 5pm.max_spare_servers = 20pm.max_requests = 500那台服务器是一台DigitalOcean Droplet,配置512M内存。它上面运行了一个新网站,即使完全空闲时,也必须要靠交换内存才能避免僵死。执行top命令显示了服务器上占用内存最多的进程。PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND13891 cont 20 396944 56596 33416 S 0.0 11.3 :14.05 php5-fpm13889 cont 20 396480 56316 32916 S 0.0 11.2 :17.67 php5-fpm13887 cont 20 624212 55088 32008 S 0.0 11.0 :14.02 php5-fpm13890 cont 20 396384 55032 32312 S 0.0 11.0 :13.39 php5-fpm13888 cont 20 397056 54972 31988 S 0.0 11.0 :14.16 php5-fpm14464 cont 20 397020 54696 31832 S 0.0 10.9 :09.44 php5-fpm13892 cont 20 396640 54704 31936 S 0.0 10.9 :12.84 php5-fpm13883 cont 20 396864 54692 31940 S 0.0 10.9 :15.64 php5-fpm13893 cont 20 396860 54628 32004 S 0.0 10.9 :15.13 php5-fpm13885 cont 20 396852 54412 32116 S 0.0 10.8 :13.94 php5-fpm13884 cont 20 395164 53916 32364 S 0.0 10.7 :13.51 php5-fpm13989 cont 20 394960 53548 32108 S 3.7 10.7 :14.37 php5-fpm2778 mysql 20 1359152 31704 1728 S 0.7 6.3 1:38.80 mysqld13849 root 20 373832 1180 188 S 0.0 0.2 :03.27 php5-fpm输出结果显示有12个php5-fpm子进程(用户名是cont)和一个主进程(用户名是root)。而这12个子进程只是呆坐在那里,什么事也不做,每个子进程白白消耗超过10%的内存。这些子进程主要是由pm=dynamic这个配置选项产生的。老实说,绝大部分的云主机拥有者也不知道所有这些配置选项是干什么用的,只是简单地复制粘贴而已。我也不准备假装我了解每个PHP配置文件里的每一个选项的目的和意义。我在很大程度上也是复制粘贴的受害者。但是我经常检查服务器的资源占用情况,困惑于为什么我的服务器占用这么多的内存和CPU。举另外一个例子,是这台服务器上的free -mt命令的结果: total used free shared buffers cachedMem: 490 480 9 31 6 79-/+ buffers/cache: 393 96Swap: 2047 491 1556Total: 2538 971 1566在没有任何访问量的情况下,也几乎有整整1G的内存(实际内存加上交换内存)被占用。当然,通过调整配置pm的数量可以有所改变,但只是轻微的。只要设置pm=dynamic,就会有空闲的子进程等在那里等待被使用。直到读了一篇文章《A better way to run PHP-FPM》(更好地运行PHP-FPM)之后,我开始意识到应该如何修改我的配置文件。那篇文章是大约一年前写的,令人失望的是我从昨天晚上搜索相关主题时才看到它。如果你也有服务器并且使用PHP-FPM的话,我建议你好好读一下那篇文章。读完文章之后,我修改了我的pm选项,如下:; Choose how the process manager will control the number of child processes.pm = ondemandpm.max_children = 75pm.process_idle_timeout = 10spm.max_requests = 500最主要的改动就是用pm=ondemand替换了pm=dynamic。这一改动对资源占用的影响是巨大的。下面是改动并重新加载php5-fpm之后运行free -mt的结果: total used free shared buffers cachedMem: 490 196 293 28 9 70-/+ buffers/cache: 116 373Swap: 2047 452 1595Total: 2538 649 1888和之前的结果对比,内存使用量下降了50%。产生这一下降的原因通过执行top命令一目了然:2778 mysql 20 1359152 56708 3384 S 0.0 11.3 2:11.06 mysqld 26896 root 20 373828 19000 13532 S 0.0 3.8 :02.42 php5-fpm 25818 root 20 64208 4148 1492 S 0.0 0.8 :01.88 php5-fpm25818 root 20 64208 4148 1492 S 0.0 0.8 :01.88 php5-fpm 17385 root 20 64208 4068 1416 S 0.0 0.8 :02.23 php5-fpm 1465 ossec 20 15592 2960 480 S 0.0 0.6 :08.60 ossec-analysisd 1500 root 20 6312 2072 328 S 0.0 0.4 :45.55 ossec-syscheckd 1 root 20 33444 1940 812 S 0.0 0.4 :03.29 init你注意到这里已经没有子进程了吗?它们去哪里了?这就是设置pm=ondemand的作用。这样设置之后,只有当有需要的时候,子进程才会被产生。事情做完之后,子进程会留在内存中10秒钟时间(pm.process_idle_timeout = 10s),然后自己退出。我只是对PHP-FPM的配置做了一点小小的修改,就节省了50%的内存。当然,这台服务器没有承受大并发的压力,但我相信它能顶得住合理的高负载,考虑到它只有512M内存。再加上Nginx微缓存的配置,我想它会做的更好。当然还有另外一些PHP-FPM和Percona MySQL的配置优化我还没有做。这里只是给大家分享一个我觉得非常有用的小窍门。
2023年08月10日
18 阅读
0 评论
0 点赞
2023-08-10
PHP中soap的使用例子
PHP中soap的使用例子PHP 使用soap有两种方式。一、用wsdl文件服务器端。<?phpclass service{ public function HelloWorld() { return "Hello";} public function Add($a,$b) { return $a+$b;}}$server=new SoapServer('soap.wsdl',array('soap_version' => SOAP_1_2));$server->setClass("service");$server->handle();?>资源描述文件,可以用工具(zend studio)生成。其实就是一个xml文件。<?xml version="1.0" encoding="UTF-8"?><wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://localhost/interface/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="soap" targetNamespace="http://localhost/interface/"> <wsdl:types><xsd:schema targetNamespace="http://localhost/interface/"> <xsd:element name="HelloWorld"> <xsd:complexType> <xsd:sequence> <xsd:element name="in" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="HelloWorldResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="out" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="Add"> <xsd:complexType> <xsd:sequence> <xsd:element name="in" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> <xsd:element name="AddResponse"> <xsd:complexType> <xsd:sequence> <xsd:element name="out" type="xsd:int"></xsd:element> </xsd:sequence> </xsd:complexType> </xsd:element> </xsd:schema></wsdl:types> <wsdl:message name="AddRequest"> <wsdl:part name="a" type="xsd:int"></wsdl:part> <wsdl:part name="b" type="xsd:int"></wsdl:part></wsdl:message> <wsdl:message name="AddResponse"> <wsdl:part name="c" type="xsd:int"></wsdl:part></wsdl:message> <wsdl:portType name="TestSoap"> <wsdl:operation name="Add"> <wsdl:input message="tns:AddRequest"></wsdl:input> <wsdl:output message="tns:AddResponse"></wsdl:output> </wsdl:operation></wsdl:portType> <wsdl:binding name="soapSOAP" type="tns:TestSoap"> <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" /> <wsdl:operation name="Add"> <soap:operation soapAction="http://localhost/interface/Add" /> <wsdl:input> <soap:body use="literal" namespace="http://localhost/interface/" /> </wsdl:input> <wsdl:output> <soap:body use="literal" namespace="http://localhost/interface/" /> </wsdl:output> </wsdl:operation></wsdl:binding> <wsdl:service name="TestSoap"><wsdl:port binding="tns:soapSOAP" name="soapSOAP"> <soap:address location="http://localhost/interface/myservice.php"/> </wsdl:port></wsdl:service></wsdl:definitions>客户端调用<?php$soap = new SoapClient('http://localhost/interface/soap.wsdl');echo $soap->Add(1,2);?>二、不用wsdl文件服务器端<?phpclass service{ public function HelloWorld() { return "Hello";} public function Add($a,$b) { return $a+$b;}}$server=new SoapServer(null,array('uri' => "abcd"));$server->setClass("service");$server->handle();?>客户端<?phptry{$soap = new SoapClient(null,array( "location" => "http://localhost/interface/soap.php", "uri" => "abcd", //资源描述符服务器和客户端必须对应 "style" => SOAP_RPC, "use" => SOAP_ENCODED )); echo $soap->Add(1,2);}catch(Exction $e){echo print_r($e->getMessage(),true);}?>
2023年08月10日
11 阅读
0 评论
0 点赞
2023-08-10
PHP 进阶之路 - 亿级 pv 网站架构实战之性能优化
PHP 进阶之路 - 亿级 pv 网站架构实战之性能压榨缘起PV和PU(数据分析—业务指标)PV即访问次数——用户每访问一次可以看作一次PV。PU即访问人数——在同一天内,一个用户无论访问了多少次都算一个访客。通过PV和PU可以分析出用户喜欢产品哪个功能,不喜欢哪个功能,从而根据用户行为来优化产品。为什么过早的优化是万恶之源?在进行优化之前,应该先测试代码的性能,确定是否存在性能问题。同时,也应该优先考虑代码的可读性、可维护性和可扩展性,避免过度优化。使用XHProf查找PHP性能瓶颈XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。性能优化的原则性能优化是建立在对业务的理解之上的性能优化与架构、业务相辅相成、密不可分的性能优化的引入我们先看一张简单的 web 架构图从上到下从用户的浏览器到最后的数据库,那么我们说先前端的优化。前端优化雅虎军规:http://www.cnblogs.com/paul-3... 减少 http 请求数图片、css、script等等这些都会增加http请求数,减少这些元素的数量就能减少响应时间。把多个JS、CSS在可能的情况下写进一个文件,页面里直接写入图片也是不好的做法,应该写进CSS里,小图拼合后利用 background 来定位。现在很多 icon 都是直接做成字体,矢量高清,也减少网络请求数现在的前端框架都会通过组件的方式开发,最后打包生成一个 js 或者 两个 js 文件 + 一个 css 或者两个 css 文件。利用浏览器缓存expires,cache-control,last-modified,etag http://blog.csdn.net/eroswang... 防止缓存,比如资源更新了,原来的做法是?v=xxxx 现在前端的打包工作可以能会生成 /v1.2.0/xxx.js使用分布式存储前端资源接地气利用 cdn 存储前端资源多域名访问资源原因一:浏览器对同一域名的并行请求数有上限,多个域名则支持更多并行请求原因二:使用同一域名的时候无用的 cookie 简直是噩梦数据压缩开启gzip前端资源本身的压缩,js/css 打包编译(去掉空格,语意简化)图片资源的压缩等。优化首屏展示速度资源的按需加载,延时加载 https://blog.csdn.net/m0_64346035/article/details/125131432图片的懒加载,淘宝的商品介绍太多图,用户点击进来又有多少人一直往下看图的呢? 前端懒加载nginx 优化分为下面三个部分来nginx 本身配置的优化worker_processes auto 设置多少子进程worker_cpu_affinity 亲缘性绑定worker_rlimit_nofile 65535 worker 进程打开的文件描述符的最大数worker_connections 65535 子进程最多处理的连接数epoll 多路复用sendfile on 是对文件I/O的系统调用的一个优化,系统api如果是反向代理web服务器,需要配置fastcgi相关的参数数据返回开启gzip压缩静态资源使用 http 缓存协议开启长连接 keepalive_timeout 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; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/json; gzip_vary on; gzip_proxied expired no-cache no-store private auth; gzip_disable "MSIE \[1-6\]\\."; location ~ .*\\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; }worker_connections和worker_rlimit_nofile有什么区别tcp/ip 网络协议配置的优化/proc/sys/net/ipv4/tcp_tw_recycle 1 开启TCP连接中TIME-WAIT sockets的快速回收,保证tcp_timestamps = 1/proc/sys/net/ipv4/tcp_tw_reuse 1 允许将TIME-WAIT sockets重新用于新的TCP连接/proc/sys/net/ipv4/tcp_syncookies 0 是否需要关闭洪水抵御 看自己业务,比如秒杀,肯定需要关闭了/proc/sys/net/ipv4/tcp_max_tw_buckets 180000 否则经常出现 time wait bucket table overflowtcp_nodelay on 小文件快速返回,我之前通过网络挂载磁盘出现找不到的情况tcp_nopush ontcp_tw_recycle 快速回收可能导致丢包的问题 https://www.im050.com/posts/435linux 系统的优化除了上面的网络协议配置也是在系统基础之外,为了配合nginx自己里面的设定需要做如下修改/proc/sys/net/core/somaxconn 65535ulimit -a 65535Nginx配置性能优化的方法php 优化升级到 php7注意有很多函数和扩展被废弃,比如mysql相关的,有风险,做好测试再切换。opcode 缓存php 5.5 之后好像就内置了吧,需要在php.ini里添加如下配置opcache.revalidate_freq=60 opcache.validate_timestamps=1 opcache.max_accelerated_files=1000 opcache.memory_consumption=512 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1opcache.revalidate_freq这个选项用于设置缓存的过期时间(单位是秒),当这个时间达到后,opcache会检查你的代码是否改变,如果改变了PHP会重新编译它,生成新的opcode,并且更新缓存。opcache.validate_timestamps当这个选项被启用(设置为1),PHP会在opcache.revalidate_freq设置的时间到达后检测文件的时间戳(timestamp)。opcache.max_accelerated_files这个选项用于控制内存中最多可以缓存多少个PHP文件。opcache.memory_consumption你可以通过调用opcachegetstatus()来获取opcache使用的内存的总量opcache.interned_strings_buffer字符串opcache的复用,单位为MBopcache.fast_shutdown=1开启快速停止续发事件,依赖于Zend引擎的内存管理模块php7 hugepage 的使用Hugepage 的作用:间接提高虚拟地址和内存地址转换过程中查表的TLB缓存命中率opcache.huge_code_pages=1鸟哥博客详细介绍:http://www.laruence.com/2015/...代码伪编译以thinkphp为例,它会把框架基础组件(必须用到的组件)合并压缩到一个文件中,不仅减少了文件目录查找,文件打开的系统调用。 通过stracephp-fpm子进程,可以清楚系统调用的过程,在我上面例子中有打开一个文件有12次系统调用(只是举例,我这里相对路径设置的原因导致多了两次文件查找)。如果有10个文件,那就是120次,优化的效果可能不是那么明显,但是这是一种思路。 顺便说下 set_include_path能不用就不要用,上面的demo的截图里面找不到目录就是证明。模板编译模板把它们自定义的语法,最后转换成php语法,这样方便解析。而不是每次都解析一遍。xhprof 查找性能瓶颈xhprof 查找性能瓶颈业务优化非侵入式扩展开发比如原来有一个model,叫问答,现在需要开发一个有奖问答,需要支持话题打赏,里面多了很多功能。这个时候应该利用面向对象的继承的特性。而不是做下面的开发<?php class AskModel { public function detail($id){ $info = 从数据库查询到该问题的信息; // 逻辑1 // 逻辑2 } }<?php class AskModel { public function detail($id){ $info = 从数据库查询到该问题的信息; // 逻辑1 if($info\['type'\] == 2){ //... }else{ } // 逻辑2 if($info\['type'\] == 2){ //... }else{ } } }这样逻辑多了,子类型多了,逻辑判断就非常重复,程序运行起来低效可能是一方面,更多的是不可维护性。业务和架构不分家,架构是建立在对业务的理解之上的。异步思想举例:处理邮件发送。gearman 图片裁剪。页面上 ajax 加载动态数据。图片的懒加载,双击图片看大图。sf 上通过websocket 通知你有新的消息,但是并没有告诉你有什消息,点击消息图标才会去异步请求具体的消息。这些都是异步的思想。能分步走就分步走,能不能请求的就不请求。静态化专题页面,比如秒杀页面,为了应对更大的流量、并发。而且更新起来也比较方便。业务解耦比如刚刚上面说的专题页面,还有必要走整个框架的一套流程吗?进来引用一大堆的文件,初始化一大堆的东西?是不是特别低效呢?所以需要业务解耦,专题页面如果真要框架(可以首次访问之后生成静态页面)也应该是足够轻量级的。不能与传统业务混为一谈。分布式以及 soa说业务优化,真的不得不提架构方面的东西,业务解耦之后,就有了分布式和soa。 说下 soa 自定义 socket 传输协议。 最重要的就是在自定义头里面强调body_len,注意设置为紧凑型,才能保证跨平台性Mysql 优化数据索引相关的文章网上很多了,不足的地方大家补充。表设计 - 拥抱 innodb现在大多数情况都会使用innodb类型了。具体原因是 mysql 专家给的意见。 我自己对 mysql 的优化不了解,每一个细分领域都是一片汪洋,每个人的时间精力是有限的,所以大家也不用什么都非要深入去研究,往往是一些计算机基础更为重要。 参考这份ppt MySQL秘籍.pdf表设计 - 主键索引innodb 需要一个主键,主键不要有业务用途,不要修改主键。主键最好保持顺序递增,随机主键会导致聚簇索引树频繁分裂,随机I/O增多,数据离散,性能下降。举例: 之前项目里有些索引是article_id + tag_id 联合做的主键,那么这种情况下,就是业务了属性了。主键也不是顺序递增,每插入新的数据都有可能导致很大的索引变动(了解下数据库b+索引的原理)表设计 - 字段选择能选短整型,不选长整型。比如一篇文章的状态值,不可能有超过100种吧,不过怎么扩展,没必要用int了。能选 char 就避免 varchar,比如图片资源都有一个hashcode,固定长度20位,那么就可以选char了。当使用 varchar 的时候,长度够用就行,不要滥用。大文本单独分离,比如文章的详情,单独出一张表。其他基本信息放在一张表里,然后关联起来。冗余字段的使用,比如文章的详情字段,增加一个文章markdown解析之后的字段。索引优化大多数情况下,索引扫描要比全表扫描更快,性能更好。但也不是绝对的,比如需要查找的数据占了整个数据表的很大比例,反而使用索引更慢了。没有索引的更新,可能会导致全表数据都被锁住。所以更新的时候要根据索引来做。联合索引的使用explain 的使用联合索引“最左前缀”,查询优化器还会帮你调整条件表达式的顺序,以匹配组合索引的要求。CREATE TABLE `test` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `a` int(10) unsigned NOT NULL, `b` int(10) unsigned NOT NULL, `c` int(10) unsigned NOT NULL, PRIMARY KEY (`id`), KEY `index_abc` (`a`,`b`,`c`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;能使用到索引explain select * from test where a=1; explain select * from test where a=1 and b=2; explain select * from test where a=1 and b=2 and c=3; explain select * from test where a=1 and b in (2,3) and c=3; explain select * from test where a=1 and b=2 order by c desc;不能使用索引explain select * from test where a=1 and b in (2,3) order by c desc; explain select * from test where b=2;explain 搜到一篇不错的: http://blog.csdn.net/woshiqjs... 很重要的参数type,key,extratype 最常见的system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALLextra如果有Using filesort或者Using temporary的话,就必须要优化了收集慢查询my.ini 配置里增加long_query_time=2 log-slow-queries=/data/var/mysql_slow.log使用 nosqlredis 丰富的数据类型,非常适合配合mysql 做一些关系型的查询。比如一个非常复杂的查询列表可以将其插入zset 做排序列表,然后具体的信息,通过zset里面的纸去mysql 里面去查询。缓存优化多级缓存请求内缓存static 变量存储,比如朋友圈信息流,在一次性获取20条信息的时候,有可能,点赞的人里面20条里面有30个人是重复的,他们点赞你的a图片也点赞了你的b图片,所以这时,如果能使用static数组来存放这些用户的基本信息就高效了些。本地缓存请求结束了,下拉更新朋友圈,里面又出现了上面的同样的好友,还得重新请求一次。所以本地常驻内存的缓存就更高效了。分布式缓存在A服务器上已经查询过了,在下拉更新的时候被分配到B服务器上了,难道同样的数据再查一次再存到B服务器的本地缓存里面吗,弄一个分布式缓存吧,这样防止了重复查询。但是多了网络请求这一步。很多时候是三者共存的。避免缓存的滥用案例分析用户积分更新比如用户的基本信息和积分混在一起,当用户登录的时候赠送积分。则需要更新用户的积分,这个时候更新整个用户的基本信息缓存么?所以这里也可以运用下面 hashes 分片的原则去更新礼物和主题绑定缓存为了取数据方便把多个数据源混合缓存了,这种情况,相比大家可能都见过,这是灾难性的设计。{id:x,title:x,gift:{ id:x, name:x, img:x, }}如果需要更新礼物的图片,那么所有用到过这个礼物的话题的缓存都要更新。redis 优化多实例化,更高效地利用服务器 cpu内存优化,官方意见 https://redis.io/topics/memor... 有点老尽可能的使用 hashes ,时间复杂度低,查询效率高。同时还节约内存。Instagram 最开始用string来存图片id=>uid的关系数据,用了21g,后来改为水平分割,图片id 1000 取模,然后将分片的数据存在一个hashse 里面,这样最后的内容减少了5g,四分之一基本上。每一段使用一个Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在String结构里是不存在的。而这个一定数量是由配置文件中的hash-zipmap-max-entries参数来控制的。服务器认知的提升下面的内容,只能是让大家有一个大概的认识,了解一个优化的方向,具体的内容需要系统学习很多很多的知识。多进程的优势多进程有利于 CPU 计算和 I/O 操作的重叠利用。一个进程消耗的绝大部分时间都是在磁盘I/O和网络I/O中。 如果是单进程时cpu大量的时间都在等待I/O,所以我们需要使用多进程。减少上下文切换为了让所有的进程轮流使用系统资源,进程调度器在必要的时候挂起正在运行的进程,同时恢复以前挂起的某个进程。这个就是我们常说的“上下文切换”。无限制增加进程数,则会增多 cpu 在各个进程间切换的次数。 如果我们希望服务器支持较大的并发数,那么久要尽量减少上下文切换的次数,比如在nginx服务上nginx的子进程数不要超过cpu的核数。 我们可以在压测的时候通过vmstat,nmon来监控系统上下文切换的次数。IOwait 不一定是 I/O 繁忙# top top - 09:40:40 up 565 days, 5:47, 2 users, load average: 0.03, 0.03, 0.00 Tasks: 121 total, 2 running, 119 sleeping, 0 stopped, 0 zombie Cpu(s): 8.6%us, 0.3%sy, 0.0%ni, 90.7%id, 0.2%wa, 0.0%hi, 0.2%si, 0.0%st一般情况下IOwait代表I/O操作的时间占(I/O操作的时间 + I/O和CPU时间)的比例。 但是也时候也不准,比如nginx来作为web服务器,当我们开启很多nginx子进程,IOwait会很高,当再减少进程数到cpu核数附近时,IOwait会减少,监控网络流量会发现也增加。多路复用 I/O 的使用只要是提供socket服务,就可以利用多路复用 I/O 模型。减少系统调用strace 非常方便统计系统调用# strace -c -p 23374Process 23374 attached - interrupt to quit ^CProcess 23374 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 30.68 0.000166 0 648 poll 12.01 0.000065 0 228 munmap 11.65 0.000063 0 228 mmap 10.54 0.000057 0 660 recvfrom 10.35 0.000056 0 708 fstat 7.76 0.000042 0 252 open 6.10 0.000033 1 36 write 5.73 0.000031 0 72 24 access 5.18 0.000028 0 72 read 0.00 0.000000 0 276 close 0.00 0.000000 0 13 13 stat 0.00 0.000000 0 269 240 lstat 0.00 0.000000 0 12 rt_sigaction 0.00 0.000000 0 12 rt_sigprocmask 0.00 0.000000 0 12 pwrite 0.00 0.000000 0 48 setitimer 0.00 0.000000 0 12 socket 0.00 0.000000 0 12 connect 0.00 0.000000 0 12 accept 0.00 0.000000 0 168 sendto 0.00 0.000000 0 12 shutdown 0.00 0.000000 0 48 fcntl 0.00 0.000000 0 12 flock 0.00 0.000000 0 156 getcwd 0.00 0.000000 0 24 chdir 0.00 0.000000 0 24 times 0.00 0.000000 0 12 getuid ------ ----------- ----------- --------- --------- ---------------- 100.00 0.000541 4038 277 total通过strace查看“系统调用时间”和“调用次数”来定位问题strace:跟踪进程的系统调用 、ltrace:跟踪进程调用库函数自己构建web服务器要想理解web服务器优化的原理,最好的办法是了解它的来龙去脉,实践就是最好的方式,我分为以下几个步骤:用 PHP 来实现一个动态 Web 服务器 简单静态 web 服务器(循环服务器)的实现 多进程并发的面向连接 Web 服务器的实践简单静态 Select Web 服务器的实现I/O 多路复用上面是我的学习笔记,图片资源丢失了,大家可以根据相关关键词去搜搜相关的文章和书籍,更推荐大家去看书。
2023年08月10日
26 阅读
0 评论
0 点赞
1
...
58
59
60
...
112