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个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
182 阅读
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
篇文章
累计收到
28
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
10
篇与
的结果
2023-12-30
在PHP应用中使用Redis缓存技术优化Session管理
在PHP应用中使用Redis缓存技术优化Session管理Redis是一个高性能的key-value数据库,支持多种数据结构,包括字符串、哈希、列表、集合、有序集合等,还支持发布/订阅、事务等高级功能,同时拥有非常好的性能和可靠性。Redis可以将数据缓存在内存中,这样可以极大地提高数据的读写性能,特别适合用来缓存会话数据等常用数据。在本文中,将介绍如何在PHP应用中使用Redis缓存技术来优化session管理。具体内容包括:Redis的安装和配置PHP Redis扩展的安装PHP应用中使用Redis进行session管理在完成Redis的安装和配置,并安装好Redis扩展后,就可以在PHP应用中使用Redis进行session管理了。在PHP中,session可以通过session_start()函数启动。可以通过在php.ini文件中修改session.save_handler来改变默认的session存储方式,将session存储到Redis中。具体操作步骤如下:1. 修改php.ini文件在修改之前,可以使用phpinfo()函数来查看当前的session配置,确认是否已启用Redis作为session存储方式。session.save_handler = redis session.save_path = "tcp://127.0.0.1:6379"2. 启动session可以在每个PHP页面的顶部使用session_start()函数来启动session。启动session后,就可以使用$_SESSION数组来存储和获取session数据了。<?php session_start(); $_SESSION['username'] = 'johnny'; echo $_SESSION['username']; ?>3. 设置session过期时间在Redis中,可以通过设置过期时间来控制session的生命周期,可以通过修改php.ini文件中的session.gc_maxlifetime来设置session的过期时间,单位为秒。同时,也可以在PHP页面中使用ini_set()函数来动态设置过期时间。ini_set("session.gc_maxlifetime", 3600); //设置session过期时间为1小时4. 使用前缀来区分不同的session在使用Redis缓存技术进行session管理时,为了避免不同应用之间的session数据冲突,可以在session键名前加上前缀来区分不同的session。可以在php.ini文件中设置session前缀:session.name = "PHPSESSID_MYAPP_"同时,也可以在PHP页面中使用ini_set()函数来动态设置前缀:ini_set("session.name", "PHPSESSID_MYAPP_");5. 其他常用的session函数在使用Redis缓存技术进行session管理时,可以使用PHP中提供的其他常用session函数来控制和管理session:session_id():获取当前session的ID session_destroy():销毁当前session session_unset():清空session中所有数据 session_regenerate_id():重新生成session ID在PHP中使用Redis缓存技术进行session管理,可以大大提高应用的性能和稳定性。本文介绍了Redis的安装和配置,PHP Redis扩展的安装,以及如何在PHP应用中使用Redis进行session管理。同时还介绍了常用的session函数,为PHP开发人员提供了一些思路和参考。通过合理的配置和使用,可以使PHP应用在高并发的情况下也能够保持高性能和稳定性。
2023年12月30日
12 阅读
0 评论
0 点赞
2023-08-30
彻底搞懂 Cookie、Session、Token、JWT
彻底搞懂 Cookie、Session、Token、JWT
2023年08月30日
11 阅读
0 评论
0 点赞
2023-08-12
PHP session创建过程,详解基于cookie的session机制
PHP session创建过程,详解基于cookie的session机制PHP session创建机制详解,PHP session是基于cookie的(一般是,如果客户端不支持cookie,则使用url query方式)。PHP创建session代码:<?php session_start(); $_SESSION['name'] = 'value'; ?>,用浏览器访问此文件,会生成一个Set-Cookie的http响应头,在客户端设置一个名字为“PHPSESSID” 的cookie.如图:打开F12的“应用”,查看已存在的cookie,则看到刚才已设置的cookie.再次刷新此php文件。可以看到响应头中已经没有了Set-Cookie头,此时,因为cookie中已经存在PHPSESSID的cookie.则后续将使用已经存在的PHPSESSID cookie.
2023年08月12日
19 阅读
0 评论
0 点赞
2023-08-10
PHP session.save_path目录大量session临时文件带来的服务器效率问题
PHP session.save_path目录大量session临时文件带来的服务器效率问题如果访问量大,可能产生的 SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path="N;/save_path",N 为分级的级数,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。 检查了下各web节点,所有web服务器的httpd线程均达到满负荷,很奇怪。因为所有web节点都通过nfs来共享session目录来达到 session的一致性,检查了下nfs文件服务器,IO读写比较大,检查了session_tmp目录,发现session目录临时文件达到 70000多个,初步判断也许是因为一级目录下文件过多带来的IO性能下降。以前没有想过session存放的效率问题,今天由此想到了session多级存放的问题,来解决一个目录下session文件过多带来的读写效率问题,查了下php.net其实php在配置中已经给出了有关选项。 php.net上的:http://cn.php.net/manual/zh/ref.session.phpsession.save_path 定义了传递给存储处理器的参数。如果选择了默认的 files 文件处理器,则此值是创建文件的路径。默认为 /tmp。参见 session_save_path()。 此指令还有一个可选的 N 参数来决定会话文件分布的目录深度。例如,设定为 '5;/tmp' 将使创建的会话文件和路径类似于/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If。 要使用 N 参数,必须在使用前先创建好这些目录。在 ext/session 目录下有个小的 shell 脚本名叫 mod_files.sh 可以用来做这件事。此外注意如果使用了 N 参数并且 N 大于 0,那么将不会执行自动垃圾回收,更多信息见 php.ini。另外如果用了 N 参数,要确保将 session.save_path 的值用双引号 "quotes" 括起来,因为分隔符分号( ;)在 php.ini 中也是注释符号。 session.save_path string 在定义session.save_path中可以定义多级存放的路径,修改php.ini session.save_path = "2;/data/session_tmp" 将session文件分成两级存放,即/data/session_tmp/4/b /sess_4b1e384ad74619bd212e236e52a5a174If,取前两位字符,但是php并不生成目录,需要自己手工生成,所以写了个脚本来生成初始的目录。 附上一个创建二级文件夹包的代码。 <?php$string = '0123456789abcdefghijklmnopqrstuvwxyz'; $length = strlen($string);for($i = 0; $i < $length; $i++) {for($j = 0; $j < $length; $j++) { createfolder('/session_tmp/'.$string[$i].'/'.$string[$j]); } }function createfolder($path) {if (!@file_exists($path)) { createfolder(@dirname($path)); @mkdir($path, 0777); }//return $this -> createfolder; }?>session目录分级处理之后,IO处理值增加,http进程降低,web处理效率明显好转
2023年08月10日
7 阅读
0 评论
0 点赞
2023-08-10
php session阻塞页面分析及优化 (session_write_close session_commit使用)
php session阻塞页面分析及优化 (session_write_close session_commit使用)这个问题很多做PHP开发朋友应该都有遇到过,一个启用了session_start 页面,由于执行时间过长。导致用户访问另外一个很简单的启用session_start页面一直阻塞着。 直到第一个页面执行完了。第二个页面才可以读取。这个就是,我们常说的,session阻塞机制。也就是说session是有锁的,为防止并发的写会话数据,php自带的的文件保存会话数据是加了一个互斥锁(在session_start()的时候)。程序执行session_start(),此时当前程序就开始持有锁。程序结束,此时程序自动释放Session的锁。如果同一个客户端同时并发发送多个请求(如ajax在页面同时发送多个请求),且脚本执行时间较长,就会导致session文件阻塞,影响性能。因为对于每个请求,PHP执行session_start(),就会取得文件独占锁,只有在该请求处理结束后,才会释放独占锁。这样,同时多个请求就会引起阻塞。我用file 存放用户sessionsession默认以文件保存,当一个用户访问session_start页面后,这个时候,就会默认创建一个包含session_id文件名,并且这个时候,会对文件进行锁定。如果这个用户点击链接,又访问一个该站session_start网页。这是,由于session_id一样,这个页面也有读取锁定该用户存放session文件。 由于,第一个页面没有执行完,它一直锁定了该文件。 第2个页面就不能获取锁,一直处于等待状态。这样一个看似小的问题,实际上,如果网站上面有大量用户访问,会导致session读取文件一直阻塞等待着。用户浏览器一直跟服务器保持连接,会消耗很多服务器资源。web服务器活跃连接数也会增大,可能很快就会耗费完连接资源,出现拒绝服务器。我用memcache 存放用户session用memcache保存用户session,相比读取文件有很大速度提升。而且可以做到多服务器共享session。确实很方便,这个时候,我们发现不会出现用文件保存session锁定清理。memcached读取时候,是共享的,不会出现等待。但是,我们会发现,memcached连接数,还是会保持着。并且,连接数会增加,如果这个时候,你设置的memcached连接数过小,你会发现,很快memcached就挂死了。 这也是,做memcache接管session时候,经常遇到问题。 有时候,web服务器很多,session(memcache)很少。发现memcache莫名其妙死掉,可能跟这个有关系。太多反映很慢的页面(启动session),会导致占用了大量memcached连接数。改变session使用习惯、优化调用方法其实,通过file或者session,如果处理耗时页面,都会带来服务器资源很大消耗。其实我们一般写入session或者读取时候,如果自己能够控制。用完了,就关闭掉文件锁,或者mem连接。就会自动释放资源,其实,php里面的:session_write_close,session_commit 函数就能做到改功能。我们看下下面代码执行过程:<?phpini_set('session.save_path', './tmp/');function open($save_path, $session_name) {echo __FUNCTION__,"<br/>"; return (true);}function close(){echo __FUNCTION__,"<br/>"; return (true);}function read($id){echo __FUNCTION__,"<br/>";}function write($id, $sess_data){echo __FUNCTION__,"<br/>"; return (true);}function destroy($id){echo __FUNCTION__,"<br />"; return(true);}function gc($maxlifetime){echo __FUNCTION__,"<br />"; return true; }session_set_save_handler("open", "close", "read", "write", "destroy", "gc");register_shutdown_function('test');function test(){ echo __FUNCTION__,"";}session_start();echo 'aaaaa',"";/*结论->session_start开启后, 会自动执行open,read函数。等页面执行完后,会执行shutdown函数.最后后会把session写入进去,然后执行close关闭文件从session_start 到页面结束,会一直锁定文件或者保持连接的。*/然后通过1个实例子来理解 , 先执行 session2.php 代码, 20秒内执行 session3.phpsession2.php 文件<?php//执行 session2.php和session3.php, /*因为 session2.php 脚本一直没有结束,结束后 session才会执行写入和关闭操作 (看session1.php 结论), session一直被锁定了因此执行session3.php 时会发现 一直处于阻塞状态。 */session_start();$_SESSION['uname'] = 'lily';//当有session写入时会阻塞sleep(20);/*//如果用以下代码 就没问题了, 立即提交 写入关闭session_start();$_SESSION['uname'] = 'lemon';session_commit();sleep(20);*/session3.php 文件<?phpsession_start();echo $_SESSION['uname'];总结://可以用 session_commit (别名 session_write_close) 立即执行写入关闭 /*session_start();$_SESSION['aaaa'] = 1000;session_commit(); //执行commit后,直接会调用,wirte,close操作*//*1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit3.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非,中间执行很耗时的业务。后记:其实,使用完session,随手commit也不是坏事,养成习惯后。可以节省性能,减少服务器开销。是个不错选择!欢迎大家交流!*/
2023年08月10日
15 阅读
0 评论
0 点赞
1
2