前端开发中的性能那点事
前端开发中的性能那点事(一)巧用xdebug
前言:
在我们平时的php开发中,一个大的项目经过长时间的积累以后你会发现性能越来越慢,而性能到底消耗在了什么地方,常常是一个令人头疼的问题,function a()调用了多少次,function b()又消耗了多少时间,我们到底怎么查找是哪个蛀虫拉慢了我们的程序运行速度呢?在这里给大家介绍一款工具xdebug,相信很多人已经听说过了,希望借助这个工具我们可以起到简单分析php程序性能瓶颈的问题。
A)假设1,假设用户目录在/home/ad
B)假设2,假设php目录在/home/ad/php
1、xdebug简介与安装
Xdebug是一个开放源代码的PHP程序调试器(即一个Debug工具),可以用来跟踪,调试和分析PHP程序的运行状况。
1)下载xdebug
xdebug的官方下载地址为:http://xdebug.org/download.php
最新版本为:Xdebug 2.1.0
2)xdebug的安装
1 2 3 4 5 6 7 8 | cd /home/ad wget http: //xdebug.org/files/xdebug-2.1.0.tgz tar -zxvf xdebug-2.1.0.tgz cd xdebug-2.1.0 /home/ad/php/bin/phpize ./configure --enable-xdebug --with-php-config=/home/ad/php/bin/php-config make make install |
安装完以后会提示你扩展安装到了哪个目录,类似 /home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/
假设你的php.ini放在 /home/ad/php/lib/php.ini
加上
1 2 3 4 5 6 7 8 9 | [xdebug] zend_extension = "/home/ad/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so" xdebug.auto_trace = on xdebug.auto_profile = on xdebug.collect_params = on xdebug.collect_return = on xdebug.profiler_enable = on xdebug.trace_output_dir = "/home/ad/xdebug_log" xdebug.profiler_output_dir = "/home/ad/xdebug_log" |
重启apache
去/home/ad/xdebug_log下看看是不是日志已经出来了
2、xdebug参数简介
zend_extension 加载xdebug扩展
xdebug.auto_trace 自动打开打开函数调用监测
xdebug.auto_profile 自动打开性能监测
xdebug.trace_output_dir 设定函数调用监测信息的输出文件的路径。
xdebug.profiler_output_dir 设定效能监测信息输出文件的路径。
xdebug.collect_params 打开收集“函数参数”的功能。将函数调用的参数值列入函数过程调用的监测信息中。
xdebug.collect_return 打开收集“函数返回值”的功能。将函数的返回值列入函数过程调用的监测信息中。
3、示例程序与日志收集
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php function a() { echo "aaa" ; } function b() { a(); sleep(1); a(); sleep(1); a(); } b(); ?> |
4、日志分析工具wincachegrind
http://sourceforge.net/projects/wincachegrind/
不用安装直接双击就可以打开了
我们用它打开刚才收集的日志cachegrind.out.***
前端开发中的性能那点事(二)巧用curl 并发减少后端访问时间
前言:
在我们平时的程序中难免出现同时访问几个接口的情况,平时我们用curl进行访问的时候,一般都是单个、顺序访问,假如有3个接口,每个接口耗时500毫秒那么我们三个接口就要花费1500毫秒了,这个问题太头疼了严重影响了页面访问速度,有没有可能并发访问来提高速度呢?今天就简单的说一下,利用curl并发来提高页面访问速度,
希望大家多指导。
1、老的curl访问方式以及耗时统计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <?php function curl_fetch( $url , $timeout =3){ $ch = curl_init(); curl_setopt( $ch , CURLOPT_URL, $url ); curl_setopt( $ch , CURLOPT_TIMEOUT, $timeout ); curl_setopt( $ch , CURLOPT_RETURNTRANSFER, 1); $data = curl_exec( $ch ); $errno = curl_errno( $ch ); if ( $errno >0) { $data = false; } curl_close( $ch ); return $data ; } function microtime_float() { list( $usec , $sec ) = explode ( " " , microtime()); return ((float) $usec + (float) $sec ); } $url_arr = array ( "taobao" => "http://www.taobao.com" , "sohu" => "http://www.sohu.com" , "sina" => "http://www.sina.com.cn" , ); $time_start = microtime_float(); $data = array (); foreach ( $url_arr as $key => $val ) { $data [ $key ]=curl_fetch( $val ); } $time_end = microtime_float(); $time = $time_end - $time_start ; echo "耗时:{$time}" ; ?> |
耗时:0.614秒
2、curl并发访问方式以及耗时统计
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | <?php function curl_multi_fetch( $urlarr = array ()){ $result = $res = $ch = array (); $nch = 0; $mh = curl_multi_init(); foreach ( $urlarr as $nk => $url ) { $timeout =2; $ch [ $nch ] = curl_init(); curl_setopt_array( $ch [ $nch ], array ( CURLOPT_URL => $url , CURLOPT_HEADER => false, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => $timeout , )); curl_multi_add_handle( $mh , $ch [ $nch ]); ++ $nch ; } /* wait for performing request */ do { $mrc = curl_multi_exec( $mh , $running ); } while (CURLM_CALL_MULTI_PERFORM == $mrc ); while ( $running && $mrc == CURLM_OK) { // wait for network if (curl_multi_select( $mh , 0.5) > -1) { // pull in new data; do { $mrc = curl_multi_exec( $mh , $running ); } while (CURLM_CALL_MULTI_PERFORM == $mrc ); } } if ( $mrc != CURLM_OK) { error_log ( "CURL Data Error" ); } /* get data */ $nch = 0; foreach ( $urlarr as $moudle => $node ) { if (( $err = curl_error( $ch [ $nch ])) == '' ) { $res [ $nch ]=curl_multi_getcontent( $ch [ $nch ]); $result [ $moudle ]= $res [ $nch ]; } else { error_log ( "curl error" ); } curl_multi_remove_handle( $mh , $ch [ $nch ]); curl_close( $ch [ $nch ]); ++ $nch ; } curl_multi_close( $mh ); return $result ; } $url_arr = array ( "taobao" => "http://www.taobao.com" , "sohu" => "http://www.sohu.com" , "sina" => "http://www.sina.com.cn" , ); function microtime_float() { list( $usec , $sec ) = explode ( " " , microtime()); return ((float) $usec + (float) $sec ); } $time_start = microtime_float(); $data =curl_multi_fetch( $url_arr ); $time_end = microtime_float(); $time = $time_end - $time_start ; echo "耗时:{$time}" ; ?> |
耗时:0.316秒
帅气吧整个页面访问后端接口的时间节省了一半
3、curl相关参数
来自:http://cn2.php.net/manual/en/ref.curl.php
curl_close — Close a cURL session
curl_copy_handle — Copy a cURL handle along with all of its preferences
curl_errno — Return the last error number
curl_error — Return a string containing the last error for the current session
curl_exec — Perform a cURL session
curl_getinfo — Get information regarding a specific transfer
curl_init — Initialize a cURL session
curl_multi_add_handle — Add a normal cURL handle to a cURL multi handle
curl_multi_close — Close a set of cURL handles
curl_multi_exec — Run the sub-connections of the current cURL handle
curl_multi_getcontent — Return the content of a cURL handle if CURLOPT_RETURNTRANSFER is set
curl_multi_info_read — Get information about the current transfers
curl_multi_init — Returns a new cURL multi handle
curl_multi_remove_handle — Remove a multi handle from a set of cURL handles
curl_multi_select — Wait for activity on any curl_multi connection
curl_setopt_array — Set multiple options for a cURL transfer
curl_setopt — Set an option for a cURL transfer
curl_version — Gets cURL version information
前端开发中的性能那点事(三)php的opcode缓存
前言:由php的运行机制决定,其实php在运行阶段我们也是可以进行缓存的从而提高程序运行效率,这就是我们常说的opcode缓存。
1、简述php的运行机制
(因为本文是写opcode缓存的所以这里只是简要概述,后边会专门写一篇揭秘php运行机制的。)
a).php文件通过浏览器过来
b)请求交给SAPI,随后SAPI层将控制权转给PHP
c)zend_language_scanner对代码进行扫描,对php代码进行词法分析转换成一系列的tokens array
d)zend_language_parser将c步骤产生的一系列tokens处理掉空格等无用的代码以后转换成一系列表达式
e)经过compiler阶段生成opcode返回zend_op_array指针
f)zend_vm_execute根据传入的zend_op_array指针,执行opcode并将结果返回输出
2、opcode简介
Opcode是operation code(操作码)的简称,其实就是第一小节c)、d)、e)步骤产生的一种中间码,
opcode是一个四元组,(opcode, op1, op2, result),它们分别代表操作码,第一操作数,第二操作数,结果。
如:
1 2 3 | <?php echo "taobao search blog" ; ?> |
对应的tokens
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | Array ( [0] => Array ( [0] => 367 [1] => <?php [2] => 1 ) [1] => Array ( [0] => 316 [1] => echo [2] => 1 ) [2] => Array ( [0] => 370 [1] => [2] => 1 ) [3] => Array ( [0] => 315 [1] => "taobao search blog" [2] => 1 ) [4] => ; [5] => Array ( [0] => 370 [1] => [2] => 1 ) [6] => Array ( [0] => 369 [1] => ?> [2] => 1 ) ) |
对应的opcode就是
1 2 3 4 5 | line # * op fetch ext return operands --------------------------------------------------------------------------------- 2 0 > ECHO 'taobao+search+blog' 4 1 > RETURN 1 2* > ZEND_HANDLE_EXCEPTION |
3、使用apc对opcode缓存
a)假设php路径为/home/ad/php
对opcode进行缓存的软件很多(apc、eAcclerator、Xcache、Zend Platform),这里主要介绍apc
APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache。同时它还提供一些接口用于PHP开发人员将用户数据驻留在内存中,我们称之为apc_user_cache。我们这里主要讨论apc_compiler_cache的配置。
下载地址:http://pecl.php.net/package/APC
最新版本为APC-3.1.6.tgz
1 2 3 4 5 6 7 | wget http: //pecl.php.net/get/APC-3.1.6.tgz tar -zxvf APC-3.1.6.tgz cd APC-3.1.6 /home/ad/php/bin/phpize ./configure --enable-apc --enable-apc-mmap --with-php-config=/home/ad/php/bin/php-config make make install |
编辑php.ini
添加apc的配置
1 2 3 4 5 6 7 8 9 10 11 12 13 | [apc] extension=apc.so apc.enabled=1 apc.shm_segments = 1 apc.shm_size = 128 apc.ttl = 0 apc.user_ttl = 7200 apc.num_files_hint = 1000 apc.write_lock=1 apc.stat = 0 apc.max_file_size=1M apc.filters = a.php,b.php apc.cache_by_default=1 |
重新apache就ok啦
4、常用参数的解析
apc.enabled 开启apc 设置为0关闭,1为开启
apc.shm_segments 共享内存块数
apc.shm_size 共享内存大小,但是是M
那么显然共享内存的总数就是apc.shm_segments*apc.shm_size
apc.num_files_hint 允许多少个opcode被缓存
apc.stat 为1的时候会自动检查opcode对应的php文件是否有更新,有更新的话会自动更新。设置为0的话就不会去检查了这样会提高apc的效率,但是要使php的修改生效的话就必须重启apache了,或者使用函数apc_cache_clear()来清空缓存
apc.ttl opcode缓存的过期时间,设置为0表示不过期,如果不为0会检查两次请求之间的时间,如果时间大于设置值那么会更新opcode缓存
apc.write_lock 表示多个进程同时更新一份opcode缓存的时候那么只让最先的一个生效,可以有效避免写冲突
apc.max_file_size 超过设置值大小的文件不被缓存
apc.filters 需要特例的文件,多个文件用逗号(,)相隔
apc.filters 与 apc.cache_by_default结合使用,
当apc.cache_by_default为1时apc.filters文件不被缓存,当apc.cache_by_default为0时仅apc.filters文件被缓存
相关文章:
运动目标检测ViBe算法
一、运动目标检测简介 视频中的运动目标检测这一块现在的方法实在是太多了。运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测。先简单从视频中的背景类型来讨论。 静态背景下的目标检测,就是从序列图像中…

急缺开源人才怎么办?来看看大厂和高校怎么解决
开源,是数字中国建设的热点领域之一,也是数字经济时代的基础。在我国加速实现数字化转型的背景下,开源已经从个人行为、企业行为发展到了国家新基建的战略层面。它打破传统的组织架构与商业教条,彻底颠覆了工业经济时代的运转逻辑…

经验分享 | Burpsuite抓取非HTTP流量
使用Burp对安卓应用进行渗透测试的过程中,有时候会遇到某些流量无法拦截的情况,这些流量可能不是HTTP协议的,或者是“比较特殊”的HTTP协议(以下统称非HTTP流量)。遇到这种情况,大多数人会选择切换到Wireshark等抓包工具来分析。下…

Xdebug 配置
第一部分: 安装预编译模块安装预编译模块是很容易的。只需要将它们放到一个目录中,并将下面的内容添加到php.ini中:(不要忘记更改路径和文件名为你自己的值,并确信你使用的是完整路)zend_extension_ts &qu…

yield学习续:yield return迭代块在Unity3D中的应用——协程
必读好文推荐: Unity协程(Coroutine)原理深入剖析 Unity协程(Coroutine)原理深入剖析再续 上面的文章说得太透彻,所以这里就记一下自己的学习笔记了。 首先要说明的是,协程并不是线程࿰…

从神经元谈到深度神经网络
作者 | 泳鱼来源 | 算法进阶本文将从神经元到逻辑回归模型结构,并将其扩展到深度深度网络模型。一、谈谈智慧对于人类智慧奥秘的探索,不同时代、学科背景的人对于智慧的理解及其实现方法有着不同的思想主张。有的主张用显式逻辑体系搭建人工智能系统&…

【阿里聚安全·安全周刊】Intel芯片级安全漏洞事件|macOS存在漏洞
关键词:Intel漏洞丨mac OS漏洞丨三星漏洞丨安卓安全丨CPU漏洞丨phpMyAdmin漏洞丨iOS设备|安卓恶意软件检测|Burpsuite 本周资讯top3 【Intel漏洞】芯片级安全漏洞后续:谷歌表示不止Intel,每个1995年后的处理器都可能受影响 1月3日,…
BigPipe:高性能的“流水线技术”网页
原文地址:http://www.facebook.com/note.php?note_id389414033919 译文地址:http://isd.tencent.com/?p2419 作者:蒋长浩 Facebook的网站速度做为最关键的公司任务之一。在2009年,我们成功地实现了Facebook网站速度提升两倍 。…

超硬核全套Java视频教程(学习路线+免费视频+配套资料)
文内福利,扫码免费领取Hello,各位锋迷们,我是小千。很多学习Java的小伙伴都在找的全套免费java视频教程,这里全都有,资料齐全,拿来吧你!零基础学Java的学习路线图是怎样的?ÿ…

手机触屏滑动图片切换插件swiper.js
今天给大家分享一款手机触屏滑动图片切换插件swiper.js是一款swiper手机触屏滑动图片幻灯片,适合各种尺寸。效果图如下: 在线预览 源码下载 实现的代码。 html代码: <div style"max-width: 640px; margin: 0 auto;"><di…

Nginx防盗链,Nginx访问控制, Nginx解析php相关配置, Nginx代理
2019独角兽企业重金招聘Python工程师标准>>> Nginx防盗链 Nginx防盗链配置需要与不记录日志和过期时间结合在一起,因为都用到了location。 打开配置文件,注释掉一部分内容(红框上方),添加内容(红…

web高性能开发系列随笔
在BlogJava里写了一些关于高性能WEB开发的随笔,因为都是跟前端技术相关(html,http,js,css等),所以也贴到博客园来,吸收下人气。 1、 HTTP服务器. 2、性能测试工具推荐 3、 图片篇. 4、 如何加载JS,JS应该放在什么位置. 5、…

《Effective C++》第8章 定制new和delete-读书笔记
章节回顾: 《Effective C》第1章 让自己习惯C-读书笔记 《Effective C》第2章 构造/析构/赋值运算(1)-读书笔记 《Effective C》第2章 构造/析构/赋值运算(2)-读书笔记 《Effective C》第3章 资源管理(1&am…

观点:AI 与自动化是矛盾的
作者:cerebralab.com译者:张雨佳原文标题:AI and automation are at odds想象一下,我们生活在一个完美、和谐的地方,所有人在某一天同意让电脑代替人类驾驶汽车,而不是像现在逐步推进自动驾驶。那么&#x…

kaggle之数据分析从业者用户画像分析
数据为kaggle社区发布的数据分析从业者问卷调查分析报告,其中涵盖了关于该行业不同维度的问题及调查结果。本文的目的为提取有用的数据,进行描述性展示。帮助新从业的人员更全方位地了解这个行业。 参考学习视频:http://www.tianshansoft.com/ 数据集&am…

mysql读写分离(MySQL Proxy 安装和使用)
一、必备软件: 1、LUA 可以去LUA的官方下载:www.lua.org 2、MySQL Proxy 这里有好多二进制版本。 http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-Proxy/ 或者去MYSQL官方下载源代码。 3、测试过程中取消了B和C的REPLICATION。这样SQL语句…

微软副总裁、Kubernetes 头号贡献者的他,给云原生带来奇迹!
我们做了一个街头采访,调查路人眼中的程序员到底是怎样的?提到程序员,大家似乎都有刻板印象:总是格子衬衫牛仔裤双肩包打扮,总是埋头敲代码,加班是常态……谁说程序员呆板木讷,只会埋头敲一行行…

查询Oracle中字段名带.的数据
SDE中的TT_L线层会有SHAPE.LEN这样的字段,使用: SQL>select shape.len from tt_l; 或 SQL>select t.shape.len from tt_l t; 是查询不出来的。 需要这样查询: SQL>select t."SHAPE"."LEN" from tt_l t; 转载于:…

再谈session共享
之前一篇已经写过了《springboot中redis的使用和分布式session共享问题》,但是示例不完全,本文加以完善。 使用spring-session-data-redis解决session共享,而不需要再引入其他jar即可 集成简单,上手迅速。 项目结构 1.pngpom <…

使用MySQL Proxy解决MySQL主从同步延迟
MySQL的主从同步机制非常方便的解决了高并发读的应用需求,给Web方 面开发带来了极大的便利。但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数据的,而且由于服务器负 载、网络拥堵等方面的原因,Master与…

Python 操作 MongoDB 数据库!
作者 |黄伟呢来源 |数据分析与统计学之美MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。先来看看MySQL与MongoDB 概念区别:今天的重点,就是要为大家讲述如何使用Python操…

Linux下用汇编输出Hello, world
下列是Intel汇编语法实现的 Hello, world!程序。 ;; hello.asm ;; nasm -f elf hello.asm; will output hello.o ;; ld -s -o hello hello.o;; section, same to segment segment .data ; 数据段声明, 下列代码将放在数据段中msg db "Hello, world!", 0xA ; 要…

利用bigpipe机制实现页面模块的异步渲染 chunked技术
bigpipe基于HTTP/1.1 支持的chunked编码,可以由浏览器接收到服务器发送的chunked块后,立即解析该块代码。因为chunked编码使消息主体成块发送,每块有自己的大小指示器,在所有的块之后会紧接着一个可选的包含实体头域的尾部。这种编…

hibernate 全面学习【lazy策略 】
2019独角兽企业重金招聘Python工程师标准>>> lazy策略可以用在: * <class>标签上:可以取值true/false * <property>标签上,可以取值true/false,这个特性需要类增强 * <set>/<list>等集合上…

深度学习发现古人类遗址,AI 考古比胡八一更高效
作者 |神经星星来源 |HyperAI超神经By 超神经内容一览:伊利诺伊州立大学人类学专业考古方向的研究人员,将空间遥感技术和深度学习应用于古人类遗址的发掘和研究。关键词:考古 遥感 机器视觉考古,一直是个神秘又充满吸引力的话题。…

linux resource
1. centos repo https://centos.pkgs.org/转载于:https://www.cnblogs.com/gojoin/p/8241068.html

MySQL 水平分区方案Spock Proxy
Spock Proxy 是由实际项目产生的一个开源项目(Spock是Rails的应用,Speck Proxy应当可用于Rails之外的,例如PHP或.NET),基于MySQL Proxy开发,是MySQL Proxy的一个分支,支持range-based horizonta…

卷学历、卷加班……程序员拥有什么能力才能破局内卷?
全世界的天才程序员都在疯狂的造轮子,其它程序员只能被动的学习轮子,这简直就像一场绝地求生。程序员行业的内卷已是有目共睹,选择程序员作为职业的人越来越多;大厂对程序员的学历要求越来越高;程序员工作加班越来越严…

LeetCode - Maximum Depth of Binary Tree
递归求二叉树的最大深度。 /*** Definition for binary tree* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ public class Solution {public int maxDepth(TreeNode root) {if(root null)return 0…
2018年IT市场最大的技术趋势和热点预测
随着数字化,物联网(IoT)设备,区块链应用以及新的服务器战略日益普及,这可能会成为2018年最大的技术趋势。我们期待看到大量与边缘计算相关的新产品,即所谓的无服务器计算,智能家居,智…