首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
184 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
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
篇文章
累计收到
32
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-09
用php-fpm的慢执行日志slow log分析PHP执行效率
用php-fpm的慢执行日志slow log分析PHP执行效率启用 php-fpm 的 slow log 日志,查看执行时间过长的php文件,并将执行时间过长的进程直接终止掉!看看效果如何!具体操作方法也简单,就修改一个文件,执行命令:# vi /usr/local/php/etc/php-fpm.confPHP 5.3.3 之前版本设置如下:The timeout (in seconds) for serving a single request after which the worker process will be terminatedShould be used when 'max_execution_time' ini option does not stop script execution for some reason'0s' means 'off'10sThe timeout (in seconds) for serving of single request after which a php backtrace will be dumped to slow.log file'0s' means 'off'1sThe log file for slow requestslogs/slow.logPHP 5.3.3 之后版本设置如下:; The timeout for serving a single request after which a PHP backtrace will be; dumped to the 'slowlog' file. A value of '0s' means 'off'.; Available units: s(econds)(default), m(inutes), h(ours), or d(ays); Default Value: 0request_slowlog_timeout = 1s (对执行时间超过1s的php脚本进行日志记录); The log file for slow requests; Default Value: /usr/local/php/var/log/php-fpm.log.slowslowlog = /usr/local/php/var/log/php-fpm.log.slow (开启慢执行日志,日志目录路径一定要正确存在,否则会报错); The timeout for serving a single request after which the worker process will; be killed. This option should be used when the 'max_execution_time' ini option; does not stop script execution for some reason. A value of '0' means 'off'.; Available units: s(econds)(default), m(inutes), h(ours), or d(ays); Default Value: 0request_terminate_timeout = 30s (当php脚本执行时间超过30秒后终止该php脚本)注:request_terminate_timeout 将执行时间太长的进程直接终止request_slowlog_timeout 将执行过慢的文件写入日志以后即可根据慢执行日志 /usr/local/php/var/log/slow.log 来优化程序文件了!
2023年08月09日
10 阅读
0 评论
0 点赞
2023-08-09
匿名函数的那些事儿
匿名函数的那些事儿本文依旧以php为主。匿名函数,说白了就是“没有名字的函数”,恩废话。给一段代码可能更为直白:$foo = function() {// this is a closure}对,这就是匿名函数,没什么特别的,和一般函数结构神似,唯独少了个函数名。而且这个函数可以作为一个值被赋予一个变量或者对象属性。这种特性使得拥有匿名函数的编程语言再设计一些应用时,更为灵活。匿名函数和普通函数最大的区别是在于,匿名函数可以作为一个具体的“值”赋予给变量或者对象属性,其次,由于匿名函数可以被定义在不同地方,使得他可以有效利用他所在的局域内的变量(或者说上下文中的变量)。下面例子中就是这样一种情况。class foo{public function exec(Closure $callback) { echo $callback(); }}$name = 'nick';(new foo)->exec(function() use ($name) {return 'hi, '. $name;}); // 输出: hi, nick我们可以看到,匿名函数使用了上下文中的变量$name。而实际上,这个匿名函数是在另一个地方被执行(是在foo类里面被执行的)。这样使得我们不必将变量name的值通过参数传递到类foo的exec方法中,而且可以减少在exec方法中不必要的处理逻辑,使得类更容易专注于自己的职责。匿名函数的作用还有很多,要知道,函数定义的时候是不会执行的,除非被调用。上文中例子其实就是这样,我们可以看到,例子中,对$name变量的处理是在方法exec被调用后才发生,且利用了匿名函数被定义时的上下文中的变量。这种特性,我们可以利用来实现一个控制反转(IoC)容器。/**一个简单的IoC容器 */class Container{protected static $bindings; public static function bind($abstract, Closure $concrete) { static::$bindings[$abstract] = $concrete; } public static function make($abstract) { return call_user_func(static::$bindings[$abstract]); }}/**示例用的 talk 类 */class talk{public function greet($target) { echo 'hi, ' . $target->getName(); }}/**示例用的 A 类 */class A{public function getName() { return 'Nick'; }}/**示例用的 B 类 */class B{public function getName() { return 'Amy'; }}// 以下代码是主要示例代码// 创建一个talk类的实例$talk = new talk;// 将A类绑定至容器,命名为fooContainer::bind('foo', function() {return new A;});// 将B类绑定至容器,命名为barContainer::bind('bar', function() {return new B;});// 通过容器取出实例$talk->greet(Container::make('foo')); // hi, Nick$talk->greet(Container::make('bar')); // hi, Amy上述例子中,只有在通过make方法获取实例的时候,实例才被创建,这样使得我们可以实现容器,我们依照这一特性,还可以更多的实现高级的特性如事件触发等。利用好匿名函数,可以让应用变得更加丰满。
2023年08月09日
9 阅读
0 评论
0 点赞
2023-08-09
闭包——藏在代码中的“房间”
闭包——藏在代码中的“房间”“闭包”这词儿是学javascript时听来的。没错,听来的。我一直对这个词所代表的学术概念嗤之以鼻,不为别的,就因为这些概念严重的欺负了我对概念性知识的超弱理解能力。正是如此,让我一直对明确其概念这一行为抱有深深的芥蒂。不过,哪能跟自己过不去呢?于是,在不断学习新事物的同时,不知不觉中就慢慢领会了这个小家伙的神奇之处。由于本人写此文时主要偏好于php,主要以php中的闭包作为阐述对象,其他语言的闭包概念与其产生的冲突,若是我了解的,我会补充说明。好吧,还是聊聊闭包——藏在代码中的“房间”。什么是闭包?引用一段百度百科的第一句介绍:闭包是可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。如果你也是第一次了解这玩意儿,像我一样对概念性文字头大的人,懵懵懂懂的去开始走进闭包——一个对你而言是从未了解过概念时,你会由衷地感叹——这TM是啥(四声)JB玩意儿。这段描述其实没错。只是有点绕。来说说闭包闭包的概念往往无法通过描述解释清楚,我就先来写一段代码:<?phpfunction foo(){$i = 0; $bar = function() use (&$i) { return ++$i; } return $bar;}$closure = foo();echo $closure(); // 1echo $closure(); // 2?>以上代码中,我们可以说$closure就是一个闭包。上述例子中,我们无法直接从外部获取或者操作函数foo中的局部变量$i。在上述例子中,在函数内部定义了一个没有名字的函数,这个是匿名函数。关于匿名函数可以在另一篇文章里找到介绍。该匿名函数由于在foo函数内,自然而然通过use并且以引用的方式获取其内部变量$i(若是javascript则连use这一关键字都不需要),并对该变量进行自加(++)操作,然后返回。匿名函数作为一种可被传递的“值”赋给了变量 $bar,并返回。我们在示例代码第11行,全局变量 $closure 接收了 foo 函数返回的匿名函数,我们通过 $closure() 这一方式调用了这一个匿名函数,由于该匿名函数看似是在外部被调用,但实际上而言,匿名函数在定义的时候引用了它当时所处的上下文的变量 $i,而该匿名函数最终又被赋予了全局变量 $closure,假如全局变量 $closure 不被释放,则 $i 里面的值将会一直保留而不会被 GC(垃圾回收机制)所释放,因此,每一次调用该匿名函数的结果都是在上一次运算结果的基础上累加。好了,现在我们理一理。其实,简单理解,闭包就是一个操作函数内部变量的东西,它往往以匿名函数的形式体现,因为“操作”是一个过程、一个逻辑的实现,简单的代码无法完成,而匿名函数内,就和一般函数一样,里面可以包含一个完整的逻辑。因此,匿名函数有时候也叫做闭包函数,他是在一个封闭代码内的一个可以与外界沟通的桥梁,就像一个封闭的军事基地中的一个通讯室一样,一个藏在代码中的“房间”。闭包的用处我们看得出,闭包有一个很有用的功能就是保证了内部变量不被释放。这在 javascript 里很有用。但在 php 里这个用处不像 javascript,为什么?php 里你可以通过 static 将变量声明为静态,在整个程序执行期间,这个静态变量会一直保存在内存中而不会被释放,而 javascript 为了保证一些变量不被释放,只能保持其引用状态,这时候就可以利用闭包。我们把上一个例子中的php代码换成差不多的 javascript 代码:function foo(){var i = 0; var bar = function() { return ++i; } return bar;}closure = foo();alert(closure()); // 1alert(closure()); // 2上述代码中,由于将来自foo内部的匿名函数赋予了全局变量closure,因此程序运行期间都将保持对该匿名函数的引用,且该匿名函数引用了foo内部的变量,相当于程序运行期间也必须保持引用内部变量i,因此我们可以看到,i的值得以保留上一次的运算结果。假设我们没有使用闭包去引用这个内部变量i,将代码变为下面这个例子:function foo(){var i = 0; return ++i;}alert(foo()); // 1alert(foo()); // 1两次输出的值都为1,说明变量i在每次自加后,由于没有被其他地方所引用因而被释放,最终导致了两次得到的都是初始化后的i自加的结果。所以说,在 javascript 中,这样做的意义非常大,可以更灵活的实现更多功能。当然,php程序也可以这样,只是我们有其他的替代方案而已。不过php要通过匿名函数引用内部变量需要使用use,而且引用传值要求变量名前面必须要加&,这是和javascript不一样的地方。对于php而言,匿名函数的作用远远大于闭包,虽然两者关系紧密,要知道,闭包通常只能以匿名函数的方式实现,这也是为什么很多人会将两者概念搞混淆的原因。还可以做什么有时候,我们太过于计较一个设计能做什么的时候,往往带来太多困惑,其实存在即合理,有时候只是没发现,也许在某一天,某个项目的开发遇到头疼的问题时,这些特性说不准会让你突然脑洞大开。当然,闭包的用处太多了,尤其是 javascript 的开发。闭包的用处在php下似乎显得并不那么意义非凡,不过闭包带来的“匿名函数”,也叫做“闭包函数”,却让我们有了实现一些更为灵活程序的基础。我会在介绍匿名函数的一篇文章里,来谈谈关于匿名函数的神奇之处。
2023年08月09日
16 阅读
0 评论
0 点赞
2023-08-09
Nginx Unit 初探及其性能对比分析 & 压测
Nginx Unit 初探及其性能对比分析 & 压测Nginx Unit初探Nginx Unit是一个开源的,以Nginx为基础、支持多语言的Web服务器,它支持Python,PHP,Go等多语言应用程序,可以在不中断服务的情况下完成部署配置更改,以多种语言运行代码。而它运行多种语言的能力是基于内部路由器进程之间的隔离,路由器进程可终止传入的HTTP请求,以及应用程序进程的分组,路由器进程是持久的,不重新启动。它具有以下特征:使用RESTful JSON API进行动态重配置服务器;同时支持多语言,多版本应用;即将支持的特性有:动态语言的进程管理功能;TLS支持;TCP,HTTP,HTTPS,HTTP/2路由和代理。下面我们以一个简单的php-test应用为例介绍nginx unit的安装和使用。安装Nginx Unit以centos 6.9为例。创建/etc/yum.repos.d/unit.repo。1[unit]2name=unit repo3baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/4gpgcheck=05enabled=1开始安装1# yun install unit配置和运行每个单独的应用,都可以在NGINX Unit的配置文件中,使用JSON语法来定义一个applications。下面以配置一个应用为例,名为php-test,该应用的本地路径为/data0/www/htdocs/nginxUnit/。首先,我们创建一个目录并进入相应目录。1# cd /data0/www/htdocs/nginxUnit/在该目录下创建一个index.php文件用于测试。1<?php2echo "hello world";3?>在/data0/www/htdocs目录下创建一个名为phpConfig.json的配置文件。1{ 2 "listeners": { 3 "*:8100": { 4 "application": "php-test" 5 } 6 }, 7 "applications": { 8 "php-test": { 9 "type": "php",10 "processes": 20,11 "root": "/data0/www/htdocs/nginxUnit",12 "index": "index.php"13 }14 }15}该配置文件包含一个监听器和应用配置。当应用被通过HTTP访问时,须定义至少一个监听器 listeners。监听器是一个IP地址和一个被定义的端口,当用户访问时,Unit的监听器会返回正确的结果,IP地址可以是一个完整的IP地址(如127.0.0.1:8100)或(*:8100)。在命令行执行如下命令来创建一个应用php-test1# curl -X PUT -d @/data0/www/htdocs/phpConfig.json --unix-socket /var/run/control.unit.sock http://localhost成功配置后会出现如下提示1# curl -X PUT -d @/data0/www/htdocs/phpConfig.json --unix-socket /var/run/control.unit.sock http://localhost2{3 "success": "Reconfiguration done."4}这时可以访问http://localhost:8100/ 查看index.php的程序是否正常运行。至此我们的环境搭建和应用配置已经完成。性能对比接下来我们进行性能对比分析。将Nginx Unit与我们现在使用的tengine+php-fpm进行对比分析。在进行分析之前,介绍下基本环境。CPU:1核内存:4G操作系统:Centos 6.9php版本:7.0.6nginx unit 的部分参数配置1"listeners": { 2 "*:8100": { 3 "application": "php-test" 4 } 5 }, 6 "applications": { 7 "php-test": { 8 "type": "php", 9 "processes": 20,10 "root": "/data0/www/htdocs/nginxUnit",11 "index": "index.php"12 }13 }tengine +php-fpm 的部分参数配置:1[unit.local] 2user = www 3group = www 4listen = 127.0.0.1:9008 5listen.allowed_clients = 127.0.0.1 6pm = static 7pm.max_children = 20 8pm.start_servers = 1 9pm.min_spare_servers = 110pm.max_spare_servers = 3211pm.max_requests = 150012pm.status_path = /h3_monitor13slowlog = /data0/www/logs/$pool-slow_log14request_slowlog_timeout = 315request_terminate_timeout = 2016catch_workers_output = no17security.limit_extensions = ""压测参数:每个压测指令指令10次,取10次qps值的平均值作为最后的统计数据。压测指令:[root@lianjia ~]# ab -n 10000 -c 100 http://127.0.0.1:8100/[root@lianjia ~]# ab -n 10000 -c 100 http://unit.local/[root@lianjia ~]# ab -n 10000 -c 50 http://unit.local/[root@lianjia ~]# ab -n 10000 -c 50 http://127.0.0.1:8100/[root@lianjia ~]# ab -n 1000 -c 50 http://127.0.0.1:8100/[root@lianjia ~]# ab -n 1000 -c 50 http://unit.local/压测结果:图片每行的的后两列数据是Requests per second和Time per request服务器平均处理时间值。Requests per second是总时间除以总请求数的值,也就是我们平常所所的QPS值,QPS值越高表明服务器处理请求数越高,性能越好。Time per request是服务器平均处理时间,值越小表示服务器处理速度越快。分析这三行数据:1.在并发请求参数相同均为50的前提下,压测请求总数设置为1000和10000两种情况时,发现相同并发数时,压测请求总数越高,其QPS值相对越高,服务器处理速度相对越快,tengine+php-fpm和nginx+unit均是如此;2.对比tengine+php-fpm和nginx+unit在并发请求总数50,压测请求总数10000时,nginx+unit的QPS值高于tengine+php-fpm的91%;服务器平均处理时间也是快87.5%;综上:Nginx+Unit在纯文本输出中的QPS值和服务器平均处理时间是明显高于tengine+php-fpm组合的.其动态化的配置方式也是为未来创造无限可能。
2023年08月09日
18 阅读
0 评论
0 点赞
2023-08-09
让PHP7达到最高性能的几个Tips
让PHP7达到最高性能的几个TipsPHP7已经发布了, 作为PHP10年来最大的版本升级, 最大的性能升级, PHP7在多放的测试中都表现出很明显的性能提升, 然而, 为了让它能发挥出最大的性能, 我还是有几件事想提醒下.PHP7 VS PHP5.6Opcache记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcache快, 所以之前测试时期就发生了有人一直没有启用Opcache的事情. 启用Opcache非常简单, 在php.ini配置文件中加入:zend_extension=opcache.soopcache.enable=1opcache.enable_cli=1"使用新的编译器使用新一点的编译器, 推荐GCC 4.8以上, 因为只有GCC 4.8以上PHP才会开启Global Register for opline and execute_data支持, 这个会带来5%左右的性能提升(Wordpres的QPS角度衡量)其实GCC 4.8以前的版本也支持, 但是我们发现它支持的有Bug, 所以必须是4.8以上的版本才会开启这个特性.HugePage我之前的文章也介绍过: 让你的PHP7更快之Hugepage , 首先在系统中开启HugePages, 然后开启Opcache的huge_code_pages.以我的CentOS 6.5为例, 通过:$sudo sysctl vm.nr_hugepages=512分配512个预留的大页内存:$ cat /proc/meminfo | grep HugeAnonHugePages: 106496 kBHugePages_Total: 512HugePages_Free: 504HugePages_Rsvd: 27HugePages_Surp: 0Hugepagesize: 2048 kB然后在php.ini中加入:opcache.huge_code_pages=1这样一来, PHP会把自身的text段, 以及内存分配中的huge都采用大内存页来保存, 减少TLB miss, 从而提高性能.Opcache file cache开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对于一些脚本, 会有很明显的性能提升.在php.ini中加入:opcache.file_cache=/tmp这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.PGO我之前的文章: 让你的PHP7更快(GCC PGO) 也介绍过, 如果你的PHP是专门为一个项目服务, 比如只是为你的Wordpress, 或者drupal, 或者其他什么, 那么你就可以尝试通过PGO, 来提升PHP, 专门为你的这个项目提高性能.具体的, 以wordpress 4.1为优化场景.. 首先在编译PHP的时候首先:$ make prof-gen然后用你的项目训练PHP, 比如对于Wordpress:$ sapi/cgi/php-cgi -T 100 /home/huixinchen/local/www/htdocs/wordpress/index.php >/dev/null也就是让php-cgi跑100遍wordpress的首页, 从而生成一些在这个过程中的profile信息.最后:$ make prof-clean$ make prof-use && make install这个时候你编译得到的PHP7就是为你的项目量身打造的最高性能的编译版本.
2023年08月09日
13 阅读
0 评论
0 点赞
1
...
72
73
74
...
112