首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
185 阅读
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
篇文章
累计收到
34
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
786
篇与
的结果
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 点赞
2023-08-09
php 加密解密小程序
php 加密解密小程序php 加密解密小程序,按键盘顺序重新排序字母表$subject=$_GET['s']; $replace = ['a'=>'q','b'=>'w','c'=>'e','d'=>'r','e'=>'t','f'=>'y','g'=>'u','h'=>'i','i'=>'o','j'=>'p','k'=>'a', 'l'=>'s','m'=>'d','n'=>'f','o'=>'g','p'=>'h','q'=>'j','r'=>'k','s'=>'l','t'=>'z','u'=>'x', 'v'=>'c','w'=>'v','x'=>'b','y'=>'n','z'=>'m']; $encrypt=strtr($subject, $replace); $decrypt=strtr($encrypt, array_flip($replace)); echo '加密:'.$encrypt; echo '解密:'.$decrypt; //输入abcdefg //输出 加密:qwertyu解密:abcdefg
2023年08月09日
14 阅读
0 评论
0 点赞
2023-08-09
ReactPHP── PHP版的Node.js
ReactPHP── PHP版的Node.js从名字说起虽然ReactPHP项目已经发展了有4年之久,但是对于其称呼显得有点混乱。在开源中国为其建立的项目主页上,其被命名为React,或者node.PHP。国外的一些的博客谈及这个项目时,多数使用的是ReactPHP。到底哪种说法比较标准呢?我们不妨来看看官方的态度。此项目的官方主页是http://www.reactphp.org。打开官网,你会发现网站的title是React,其logo上的文字为reactphp。可以看出,官方更倾向于被命名为React或者ReactPHP。我建议使用ReactPHP作为其名称。原因大概有两个。React单词的意思太泛,并且已经有一些项目的名称与React相关,容易引起误解。目前国内使用ReactPHP的人比较少,相关资料文档也比较少。在国外它一般被称为ReactPHP,使用ReactPHP在国外检索资料更容易。ReactPHP与Node.js有着相同的特点许多人认为ReactPHP是Node.js的php版本,这是有一定道理的。他们的确有很多相似的特点。事件驱动,异步执行,非阻塞IO什么是事件驱动?所谓事件驱动,简单的说就是,你告诉我你关注什么事情,等事情发生的时候我会主动通知你,然后你再作相应的处理。这样可以就可以把你解放出来,你只关注于处理好相应事件即可。采用事件驱动有什么优势呢?相对于常见的多进程编程,能更好的利用CPU资源。多进程编程会使进程数量变多,进程上下文切换频繁会增加系统压力,浪费宝贵的CPU资源。相对于多线程编程而言,可以降低编程复杂度。开发者不必再考虑线程间资源共享导致资源竞争等问题。ReactPHP和Node.js都采用了事件驱动和非阻塞IO。从官方主页的宣传语上就可以得到印证。在Node.js的官网上有一段话:Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient。上面的意思是,Node.js使用事件驱动和非阻塞IO模型,以保证轻量级和高效。在ReactPHP官网也有一段话:Event-driven, non-blocking I/O with PHP.上面的意思是,ReactPHP使用PHP语言实现了事件驱动和非阻塞。ReactPHP和Node.js在实现事件驱动机制时也有相似之处。在事件的监听上,ReactPHP和Node.js都使用了libev库,但是也都是不只使用libev库。由于libev对windows支持不够好。因此,Node.js中封装了一层libuv。libuv是基于windows的IOCP和*nix的libev进行封装。而ReactPHP除了使用libev库外,还是用了其他的库。如,libevent。ReactPHP和Node.js都各自有自己的生态圈。在各自生态圈中的一些模块一般都采用了事件驱动,异步编程的风格。如,ReactPHP的Stream模块,提供了以下几个事件:drain、error、close、pipe、end、data。相应的,在Node.js中也有一些类似的事件。Node.js的Net模,其中的net.Socket对象就有以下事件:connect、data、end、timeout、drain、error、close等。这样,开发人员只需要知道自己关注那些事件,并在这些事件上注册回调函数。等事件发生的时候,会主动执行这些注册的回调函数。这些回调函数都是异步执行的,这些函数虽然在注册的时候有先后顺序,但是在执行的时候是无序的,随机的,执行顺序和事件发生顺序相关。事件驱动再加上非阻塞IO,就可以极大的利用系统资源,代码无需阻塞等待资源可用。单进程单线程ReactPHP和Node.js一样都是采用了单进程和单线程的运行方式。单进程,单线程方式,没有多线程的资源抢占和上下文切换,高效率的运行,维护着一个事件队列。这种运行方式,通常情况下瓶颈一般在CPU而不是内存。由于单进程,单线程只能在一个CPU上运行,本身不能充分利用多个CPU资源。为了解决这个问题,我们可以启动多个进程,监听不同的端口,前端使用nginx等做代理,把请求分发到不同的进程上。对于多进程的管理上,现在已经有不少开源项目可以实现。如,php-pm(https://github.com/php-pm/php-pm)。ReactPHP性能压测相对于传统的nginx+php-fpm方式,ReactPHP的性能表现如何呢?现在我们来做下性能压测。服务器环境如下:8核CPUPHP版本为5.5.15,使用opcache扩展操作系统为Centos5Nginx版本为nginx/1.2.9ReactPHP版本为0.4为了公平起见,我们php-fpm和ReactPHP都只启动一个进程。压测工具我们使用ab,Apache开源的http服务压测工具。我们压测分两种情况来进行:第一种情况是只输出简单的Hello World。第二种情况只进行一次简单的sql语句查询,select 1 as num。第一种情况:Hello World的压测结果如下,QPS:第二种情况:SQL查询的压测结果如下,QPS:可见,对于cpu密集型的应用,nginx+php-fpm的方式要比ReactPHP有更好的表现。但是对于数据库查询这样涉及网络IO的场景,ReactPHP的性能要远远好于nginx+php-fpm的方式。ReactPHP的应用场景根据上面的测试,ReactPHP更适合IO密集型的应用。以下是ReactpHP比较适合的应用场景。从RESTful API获取数据,并进行拼装输出只是请求api获取数据,然后进行简单的拼装,最后输出到客户端。本身业务逻辑不复杂。在请求的时候,可以同时对多个api进行请求,相对于顺序调用api的方式,会节省很多的时间,大大提高了响应的效率。实时推送,在线聊天实时推送和在线聊天都需要维护大量的链接。这个正是ReactpHP擅长的。他可以很轻松的维护上万的链接。分布式IO系统如一个数据库中间件层,它需要解析SQL为多条子SQL,然后把子SQL分发到不同的服务器查询数据,然后合并数据返回给客户端。这种情况下可以使用ReactPHP同时对多个数据库服务器进行查询。如何使用ReactPHPReactPHP可以使用composer安装,这个也是官方推荐的安装方式。首先安装composer。curl -s https://getcomposer.org/installer| php安装完成后,会在当前目录下生成一个composer.phar文件。然后我们使用composer.phar安装react。php ./composer.phar require react/react安装成功后,会在当前目录下生成一个vendor目录。下载的程序就在这个目录下。现在你就可以使用ReactPHP写程序了。例如,我们想提供一个http服务,我们将把客户端通过data参数提交的数据加上www.后进行返回。代码如下:<?phprequire 'vendor/autoload.php';$port = $argv[1];$app = function ($request, $response) { $response->writeHead(200, array('Content-Type' => 'text/plain')); $query = $request->getQuery(); $data = isset($query["data"]) ? $query["data"] : ""; $response->end("www.{$data}\n");};$loop = React\EventLoop\Factory::create();$socket = new React\Socket\Server($loop);$http = new React\Http\Server($socket, $loop);$http->on('request', $app);$socket->listen($port, '0.0.0.0');$loop->run();?>把上面的代码保持为文件reactphp.php。然后启动服务:php ./reactphp.php 5501最后,我们验证下效果,可以通过下面的方式访问。$curl http://10.101.80.141:5501/?data=bo56.comwww.bo56.comReactPHP也有自己的生态圈。如进行异步mysql查询的react-php。小结ReactPHP作为Node.js的PHP版本。在实现思路,使用方法,应用场景上的确有很多相似之处。但是ReactPHP毕竟比Node.js年轻,目前生态圈还是不如Node.js完善。目前文档也不是很完善,在国内应用也比较少。但是相信,它会越来越完善,应用越来越广。(责编:张之颖)作者简介信海龙,淘宝技术专家。2006年毕业于河北大学政法学院。之后,便踏上了互联网开发的不归路。目前已经有9年的互联网开发经验。2013年加入淘宝技术部,把工作中遇到的问题记录到博客(www.bo56.com)。同时也是多个开源项目的开发者和维护者。
2023年08月09日
6 阅读
0 评论
0 点赞
1
...
107
108
109
...
158