Deprecated
: htmlspecialchars(): Passing null to parameter #1 ($string) of type string is deprecated in
/www/wwwroot/testblog.58heshihu.com/var/Widget/Archive.php
on line
1057
首页
关于
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基础
页面
关于
搜索到
9
篇与
的结果
2023-08-08
PHP异步并发访问mysql简单实现
PHP异步并发访问mysql简单实现在实际的开发过程中,我们常常会遇到需要操作多张表,多个库的情况。有时因为一些限制我们不能进行连表(例如,异地数据库),所以只能用php串行访问后再在php里进行合并,有时还需要模拟mysql对合并后的结果进行排序、归并等。这里产生的一个问题就是串行带来的访问时间问题。由于传统的串行访问方式,我们只能等到一条sql执行完毕后才可以执行下一条,所以执行时间是累加的。PHP官方手册提供了一种可以异步并发访问mysql的方式,详见:http://php.net/manual/zh/mysqli.poll.php,参考资料:https://svn.osgeo.org/mapguide/sandbox/rfc94/Oem/php/ext/mysqli/tests/mysqli_poll.phpt,使用此种方式,我们可以对Mysql进行异步并发访问,访问时间不再是串行累加,而是取决于执行时间最长的sql。项目地址:https://github.com/huyanping/async-mysql-phpshow you the code: try{ $async_mysql = new \Jenner\Mysql\Async(); $async_mysql->attach( ['host' => '127.0.0.1', 'user' => 'root', 'password' => '', 'database' => 'test'], 'select * from stu' ); $async_mysql->attach( ['host' => '127.0.0.1', 'user' => 'root', 'password' => '', 'database' => 'test'], 'select * from stu limit 0, 3' ); $result = $async_mysql->execute(); print_r($result); }catch (Exception $e){ echo $e->getMessage(); }async_mysql对象对mysql进行异步并发访问,attach方法接收每个请求必须的配置信息,execute方法为执行入口,其返回值是每条sql执行结果的数组,顺序与attach调用顺序一致。当任何一个连接mysql出错或执行任何一条sql出错,都会引起异常抛出。这样设计主要是基于完整性的考虑,我们把所有需要执行的sql看做是一个整体事务,任何一个执行失败,则认为该事务失败。composer信息:"require":{ "jenner/async-mysql-php": "v0.1" }或者直接引入/path/to/async-mysql-php/autoload.php文件最后在阿里云上做了一个简单的测试,测试结果如下:# 同步 [root@iZ942077c78Z async-mysql-php]# php tests/performance_sync.php ------------------------------------------ mark:[total diff] time:4.2648551464081s memory_real:18944KB memory_emalloc:18377.171875KB memory_peak_real:28416KB memory_peak_emalloc:27560.3828125KB [root@iZ942077c78Z async-mysql-php]# php tests/performance_sync.php ------------------------------------------ mark:[total diff] time:4.2285549640656s memory_real:18944KB memory_emalloc:18377.171875KB memory_peak_real:28416KB memory_peak_emalloc:27560.3828125KB [root@iZ942077c78Z async-mysql-php]# php tests/performance_async.php ------------------------------------------ mark:[total diff] time:1.455677986145s memory_real:38144KB memory_emalloc:32574.015625KB memory_peak_real:66816KB memory_peak_emalloc:65709.7734375KB # 异步 [root@iZ942077c78Z async-mysql-php]# php tests/performance_async.php ------------------------------------------ mark:[total diff] time:1.8936941623688s memory_real:38144KB memory_emalloc:32574.015625KB memory_peak_real:66816KB memory_peak_emalloc:65709.7734375KB [root@iZ942077c78Z async-mysql-php]# php tests/performance_async.php ------------------------------------------ mark:[total diff] time:1.5208158493042s memory_real:38144KB memory_emalloc:32574.015625KB memory_peak_real:66816KB memory_peak_emalloc:65709.7734375KB实际上以上测试结果并没有太大意义。因为理论上这种异步并发的访问方式会绝对优于传统的串行访问方式,再次需要说明的是,访问数据库的时间接近执行时间最长的SQL。由于同一时间要处理多个SQL返回的结果,程序需要连续申请多个内存空间用于存储SQL的返回结果。所以使用这种方式会造成内存翻倍。从下面的测试结果来看,内存基本位置在两倍以内(测试程序执行了两条SQL)。到了这一步,我们已经可以实现对mysql进行异步并发访问了。如果我们还需要做多个数组的归并,可以使用《PHP模拟SQL的GROUP BY算法》中介绍的方法。其中提供的归并方式非常灵活,更胜mysql原生的group by。如果还需要对合并后的结果做排序,可以使用https://github.com/huyanping/Zebra-Tools/blob/master/src/Jenner/Zebra/Tools/CommonArray.php#L90这段代码实现,非常方便。改函数来源于php手册http://php.net/manual/zh/function.array-multisort.php
2023年08月08日
9 阅读
0 评论
0 点赞
2023-08-08
PHP 线程,进程和并发
PHP 线程,进程和并发进程进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。 进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。 综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动, 进程是系统进行资源分配和调度的一个独立单位。在进程执行时,进程都可以被唯一的表示,由以下一些元素组成:进程描述符:进程的唯一标识符,用来和其它进程区分。在Linux中叫进程ID,在系统调用fork期间生成,只是我们通过getpid返回的不是其pid字段,而是其线程组号tgid。进程状态:我们常说的挂起、运行等状态,其表示的是当前的状态。优先级:进程间的执行调度相关,相对于其它进程而言。程序计数器:程序中即将被执行的下一条指令的地址,该地址是内核术中或用户内存空间中的内存地址。内存指针:包括程序代码和进程相关数据的指针,还有和其它进程共享内存块的指针。上下文数据:进程执行时处理器的寄存器的数据。I/O状态信息:包括显式的I/O请求、分配给进程的I/O设备等记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制等以上的这些元素都会放在一个叫做进程控制块的数据结构中。进程控制块是操作系统能够支持多进程和提供多处理的结构。 当操作系统做进程切换时,它会执行两步操作,一是中断当前处理器中的进程,二是执行下一个进程。 不管是中断还是执行,进程控制块中的程序计数器、上下文数据和进程状态都会发生变化。 当进程中断时,操作系统会把程序计数器和处理器寄存器(对应进程控制块中的上下文数据)保存到进程控制块中的相应位置, 进程状态也会有所变化,可能进入阻塞状态,也有可能进入就绪态。 当执行下一个进程时,操作系统按规则将下一个进程设置为运行态,并加载即将要执行进程的程序上下文数据和程序计数器等。线程进程有两个特性部分:资源所有权和调度执行。 资源所有权是指进程包括了进程运行所需要的内存空间、I/O等资源。 调度执行是指进程执行过程中间的执行路径,或者说程序的指令执行流。 这两个特性部分是可以分开的,分开后,拥有资料所有权的通常称为进程,拥有执行代码的可分派部分的被称之为线程或轻量级进程。线程有“执行的线索”的意思在里面,而进程在多线程环境中被定义为资源所有者,其还是会存储进程的进程控制块。 线程的结构与进程不同,每个线程包括:线程状态: 线程当前的状态。一个执行栈私有的数据区: 用于每个线程局部变量的静态存储空间寄存器集: 存储处理器的一些状态每个进程都有一个进程控制块和用户地址空间,每个线程都有一个独立的栈和独立的控制块,都有自己一个独立执行上下文。 其结构如图8.1所示。hread-model图8.1 进程模型图线程在执行过程中与进程有一些不同。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。 但是线程不能够独立执行,必须依存在于进程之中,由进程提供多个线程执行控制。 从逻辑角度来看,多线程的意义在于一个进程中,有多个执行部分可以同时执行。 此时,进程本身不是基本运行单位,而是线程的容器。线程较之进程,其优势在于一个快,不管是创建新的线程还是终止一个线程;不管是线程间的切换还是线程间共享数据或通信,其速度与进程相比都有较大的优势。并发及并行并发又称共行,是指能处理多个同时性活动的能力,并发事件之间不一定要同一时刻发生。 比如,现代计算机系统可在同一段时间内以进程的形式将多个程序加载到存储器中,并借由处理器的时分复用, 以在一个处理器上表现出同时运行的感觉。并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行。并发和并行的区别就是一个处理器同时处理多个任务和多个处理器或者是多核的处理器同时处理多个不同的任务。 前者是逻辑上的同时发生(simultaneous),而后者是物理上的同时发生。PHP的各种并发模型既然有两种模型,那么PHP使用的是哪一种呢?答案是都支持,也就是说PHP支持多线程的模型, 在多线程情况下通常要解决资源共享和隔离的问题。PHP本身是线程安全的。具体来说是那种模型需要看使用的是哪个SAPI,比如说在Apache中,那么就可能使用多线程模型, 也可能使用多进程模型。而php-fpm使用的就是多进程模型。目前比较推荐的方式是使用php-fpm的模型,因为这个模型对于PHP来说有诸多的优势:内存释放简单,使用多进程模型时进程可以容易通过退出的方式来释放内存, 由于PHP有非常多的扩展,稍有不慎就可能导致内存泄露,fpm通过进程退出方式 简单除暴的解决了问题。容灾能力强,同样的问题,扩展或者php可能会出现段错误,如果是单进程多线程模型, 那么整个PHP就挂掉了。这会影响服务,多进程的话,某个进程死掉了也不会影响整体的服务。多进程有多进程的优势,多线程也有多线程的优势,比如HHVM它选择的是多线程模型。 多线程模型最大的好处是信息共享和通信方便,因为在同一个进程空间内,可以直接使用指针。比如opcode cache工具,在PHP里,apc以及opcache等等使用的是共享内存来共享opcode, 那么在HHVM中则不需要走共享内存,共享内存还有个问题是存储复杂的数据结构不方便, 因为指针的问题,多线程情况下C/C++中的数据结构是可以共享的。这对效率提升也是有帮助的。多进程和多线程还有一个明显的模型区别:在处理请求时的逻辑。在多进程情况下,由于跨进程是不好传递fd连接的。那么多进程通常采用在父进程中listen(), 然后各个子进程accept()的方式来实现负载均衡。这样的模型下可能会有惊群的问题。而多线程模型下,可以采用一个独立线程接受请求然后派发到各个worker线程的方式。参考资料《操作系统精髓与设计原理》
2023年08月08日
16 阅读
0 评论
0 点赞
2023-08-08
PHP高并发高负载系统架构
PHP高并发高负载系统架构1、为什么要进行高并发和高负载的研究1.1、产品发展的需要1.2、公司发展的需要1.3、当前形式决定的2、高并发和高负载的约束条件2.1、硬件2.2、部署2.3、操作系统2.4、Web 服务器2.5、PHP2.6、MySQL2.7、测试3、解决之道——硬件篇处理能力的提升:部署多颗CPU,选择多核心、具备更高运算频率、更大高速缓存的CPU;处理能力的提升最直接的反应在于Web请求的处理效率和PHP程序的执行效率。内存带宽与容量:更大的内存带宽和容量;内存带宽与容量的提升最直接的反应在于应对数据库大量的数据交换。磁盘搜索与I/O能力:选择更高的转速、更大的硬盘缓存、组件磁盘阵列(RAID);磁盘搜索与I/O能力的提升最直接反应在于数据库大量的查询和读写以及文件的读写。网络带宽的提升可考虑的因素包括: 更大带宽、多线路接入、独享带宽;服务器在大负载的情况下,对网络带宽的占用是十分可观的。策略:硬件设施是应对大负载的基础,硬件设施的投入可根据实际压力和预算量力而行。4、解决之道——部署篇4.1、服务器分离4.2、数据库集群和库表散列4.3、镜像4.4、负载均衡分类:1)、DNS轮循2)代理服务器负载均衡3)地址转换网关负载均衡4)NAT负载均衡5)反向代理负载均衡6)混合型负载均衡策略:根据硬件投入和业务需求,选择合理的部署方案。部署方案1:适用范围:静态内容为主体的网站和应用系统;对系统安全要求较高的网站和应用系统。Main Server:主服务器承载程序的主体运行压力,处理网站或应用系统中的动态请求;将静态页面推送至多个发布服务器;将附件文件推送至文件服务器;安全要求较高,以静态为主的网站,可将服务器置于内网屏蔽外网的访问。DB Server:数据库服务器承载数据库读写压力;只与主服务器进行数据量交换,屏蔽外网访问。File/Video Server:文件/视频服务器承载系统中占用系统资源和带宽资源较大的数据流;作为大附件的存储和读写仓库;作为视频服务器将具备视频自动处理能力。发布服务器组:只负责静态页面的发布,承载绝大多数的Web请求;通过Nginx进行负载均衡部署。部署方案2:适用范围:以动态交互内容为主体的网站或应用系统;负载压力较大,且预算比较充足的网站或应用系统;Web服务器组:Web服务无主从关系,属平行冗余设计;通过前端负载均衡设备或Nginx反向代理实现负载均衡;划分专用文件服务器/视频服务器有效分离轻/重总线;每台Web服务器可通过DEC可实现连接所有数据库,同时划分主从。数据库服务器组:相对均衡的承载数据库读写压力;通过数据库物理文件的映射实现多数据库的数据同步。共享磁盘/磁盘阵列将用于数据物理文件的统一读写用于大型附件的存储仓库通过自身物理磁盘的均衡和冗余,确保整体系统的IO效率和数据安全;方案特性:通过前端负载均衡,合理分配Web压力;通过文件/视频服务器与常规Web服务器的分离,合理分配轻重数据流;通过数据库服务器组,合理分配数据库IO压力;每台Web服务器通常只连接一台数据库服务器,通过DEC的心跳检测,可在极短时间内自动切换至冗余数据库服务器;磁盘阵列的引入,大幅提升系统IO效率的同时,极大增强了数据安全性。5、解决之道——环境篇5.1、操作系统操作系统的选择,关注点在于•是否适应于搭建SiteEngine所需要的环境程序?•系统本身占用的资源比;•系统安全性;•系统是否易于操作?策略:我们选择FreeBSD,而且是最小化安装以后的FreeBSD。5.2、Web服务器Web服务器很大一部分资源占用来自于处理Web请求,通常情况下这也就是Apache产生的压力,Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx (“engine x”) 是俄罗斯人编写的一款高性能的 HTTP 和反向代理服务器。在国内,已经有新浪、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。Nginx的优势:高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。策略:相对于老牌的Apache,我们选择Lighttpd和Nginx这些具有更小的资源占用率和更高的负载能力的web服务器。5.3、MysqlMySQL本身具备了很强的负载能力,MySQL优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解。大家都知道数据库工作就是大量的、短时的查询和读写,除了程序开发时需要注意建立索引、提高查询效率等软件开发技巧之外,从硬件设施的角度影响MySQL执行效率最主要来自于磁盘搜索、磁盘IO水平、CPU周期、内存带宽。根据服务器上的硬件和软件条件进行MySQl优化。MySQL优化的核心在于系统资源的分配,这不等于无限制的给MySQL分配更多的资源。在MySQL配置文件中我们介绍几个最值得关注的参数:改变索引缓冲区长度(key_buffer)改变表长(read_buffer_size)设定打开表的数目的最大值(table_cache)对缓长查询设定一个时间限制(long_query_time)如果条件允许 ,一般MySQL服务器最好安装在Linux操作系统中,而不是安装在FreeBSD中。策略: MySQL优化需要根据业务系统的数据库读写特性和服务器硬件配置,制定不同的优化方案,并且可以根据需要部署MySQL的主从结构。5.4、PHP1、加载尽可能少的模块;2、如果是在windows平台下,尽可能使用IIS或者Nginx来替代我们平常用的Apache;3、安装加速器(都是通过缓存php代码预编译的结果和数据库结果来提高php代码的执行速度)eAcceleratoreAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了性能php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。ApcAlternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。memcachememcache是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。主要机制是通过在内存里维护一个统一的巨大的hash表,Memcache能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等Xcache国人开发的缓存器,策略: 为PHP安装加速器。5.5、代理服务器(缓存服务器)Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。策略:安装Squid 反向代理服务器,能够大幅度提高服务器效率。6、解决之道——SiteEngine篇7、解决之道——测试篇7.1、测试方法7.2、测试用例7.3、压力测试压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽等。一般用并发来做压力测试。压力测试工具:webbench,ApacheBench等7.4、漏洞测试在我们的系统中漏洞主要包括:sql注入漏洞,xss跨站脚本攻击等。安全方面还包括系统软件,如操作系统漏洞,mysql、apache等的漏洞,一般可以通过升级来解决。
2023年08月08日
28 阅读
0 评论
0 点赞
2023-08-08
关于php的libevent扩展的应用 并发请求
关于php的libevent扩展的应用 并发请求php有个libevent扩展,在一年前我曾经拿它实现了一个thrift socket server,虽然我没有把它放在正式的场合来使用,但是我觉得这个扩展应该可以有更广泛的用途,比如:phpDaemon ― 一个异步的服务器端开发框架.tail - 用php实现类似unix下的tail命令行ZeroMQ + libevent in PHP - 用php和ZeroMQ实现的一个事件驱动服务器端我所想到的一个比较实用的使用场景是,在页面中利用libevent请求多个http接口来获得数据。若是在从前,一个可行的办法是利用curl_multi_exec来同时请求好几个接口,但是这个办法需要用一个do … while循环来完成请求,很是坑爹。那么看看采用libevent的例子:代码实例 http.php为了省事,这个php脚本仅仅是重复抓取一个网页5次,并且回调的逻辑我没怎么做处理,仅仅是echo出来而已,可以通过下面命令行来运行这个例子:php http.php "www.baidu.com"代码中的http_get($argv[1])这行虽然是靠一个命令行顺序执行,但是不会阻塞后面的代码,直接就进行下一次请求了。而且我们看看回调方法部分是不是很像用javascript调用ajax写的回调方法?这都是php 5.3中闭包的功劳。event_set($event_fd, $fd, EV_WRITE | EV_PERSIST, function($fd, $events, $arg) {//回调方法,后续处理随意 echo fread($fd, 4096); if(feof($fd)) { fclose($fd);event_base_loopexit($arg[1]); echo "done";}}, array($event_fd, $base_fd));想到更多在mysqlnd,memcached…这些php扩展中,都已经有delay回调的实现,如果能好好利用,对性能提升岂不是有莫大的帮助?或者在libevent扩展的基础上,实现一个事件驱动的开发框架,也是可行的。
2023年08月08日
17 阅读
0 评论
0 点赞
1
2