首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
185 阅读
2
php接口优化 使用curl_multi_init批量请求
145 阅读
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基础
页面
关于
搜索到
560
篇与
的结果
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实现文件断点续传下载
PHP实现文件断点续传下载<?php //PHP 断点续传下载 function download($fileurl, $start = 0, $end = '') { $task_sourcefile = '/path/downfile.mp4'; //本地保存的文件 $sourceurl = $fileurl ; //要下载的远程文件 $tokenfile = 'downfile.token'; $isfileexist =$this->check_remote_file_exists($sourceurl); if (!$isfileexist) { $isfileexist2 =$this->check_remote_file_exists($sourceurl); if (!$isfileexist2) { throw new \Exception('远程文件不存在'); } } if (!is_dir(dirname($tokenfile))) { mkdir(dirname($tokenfile), 0777, true); } $sourcefilepath = dirname($task_sourcefile); if (!is_dir($sourcefilepath)) { @mkdir($sourcefilepath, 0777, true); } $ch = curl_init($sourceurl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_BINARYTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_USERAGENT, 'SyncTask'); curl_setopt($ch, CURLOPT_NOSIGNAL, 1); //注意,超时一定要设置这个 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_DNS_CACHE_TIMEOUT, 3600); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 300); curl_setopt($ch, CURLOPT_TIMEOUT, 600); //此选项,是下载超时时间,时间设置短的话,没有下载完,就会断开连接,然后再重新断点续传下载。如果设置过长,可能会发生由于网络原因产生的下载长时间卡住 的现象。请设置合理值。建议不要设置太长。 //curl_setopt($ch, CURLOPT_TIMEOUT_MS, 100 * 1000); //超时毫秒 curl_setopt($ch, CURLOPT_BUFFERSIZE, 20971520); if ($end) { curl_setopt($ch, CURLOPT_RANGE, "$start-$end"); } else { curl_setopt($ch, CURLOPT_RANGE, "$start-"); } $flag=$tag = 0; curl_setopt($ch, CURLOPT_WRITEFUNCTION, function ($ch, $str) use (&$flag, $task_sourcefile, $end, $sourceurl, $tokenfile, $start, &$tag) { $len = strlen($str); $flag++; if ($flag==1) { $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $length = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); if ($length ==-1) { $tag = 2; return false; } if ($httpcode!=200 && $httpcode!=206) { $tag = 2; return false; } if ($start ==0) { $data= ['name'=>$sourceurl,'size'=>$length]; file_put_contents($tokenfile, <a class="wpal-linked-keyword" href="http://json.p2hp.com/" target="_blank">json</a>_encode($data, JSON_UNESCAPED_UNICODE)); } if ($end) { if ($end-$start!=$length) { $tag = 1; return false; } } } file_put_contents($task_sourcefile, $str, FILE_APPEND|LOCK_EX); return $len; }); $output = curl_exec($ch); if ($tag ==2 || $output===false) { curl_close($ch); clearstatcache(); download($fileurl, filesize($task_sourcefile), ''); } if ($tag ==1) { unlink($task_sourcefile); unlink($tokenfile); curl_close($ch); download($fileurl, 0, ''); return true; } $tokeninfo = json_decode(file_get_contents($tokenfile), true); $length = $tokeninfo['size']; sleep(1); clearstatcache();//这里要去除文件信息缓存 if ($length!= filesize($task_sourcefile)) { curl_close($ch); echo '下载出错:长度不长度不匹配~~'; clearstatcache(); download($fileurl, filesize($task_sourcefile), ''); } curl_close($ch); return true; } //run $download= download('http://www.test.com/333.mp4'); var_dump($download);
2023年08月10日
8 阅读
0 评论
0 点赞
2023-08-10
PHP获取远程http或ftp文件的md5值
PHP获取远程http或ftp文件的md5值获取本地文件的md5值:md5_file("/path/file.jpg");获取远程http文件的md5值:md5_file("https://www.baidu.com/img/bd_logo1.png")PHP获取远程ftp文件的md5值:md5_file("ftp://username:password@192.168.6.1/aa4c319f1b8197e381beeb8c45e6c68d.apk")如果远程文件很大的话,执行会非常费时,因为要先下载下来。
2023年08月10日
25 阅读
0 评论
0 点赞
2023-08-10
如何正确的用PHP进行url编码urlencode
如何正确的用PHP进行url编码urlencode<?php function myUrlEncode($string) { $entities = array('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D'); $replacements = array('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]"); return str_replace($entities, $replacements, rawurlencode($string)); } echo myUrlEncode('http://192.168.8.232/红尘情歌 高安.mp4'); //输出 http://192.168.8.232/%E7%BA%A2%E5%B0%98%E6%83%85%E6%AD%8C%20%E9%AB%98%E5%AE%89.mp4
2023年08月10日
14 阅读
0 评论
0 点赞
2023-08-10
PHP的SimpleXML遍历所有子元素
PHP的SimpleXML遍历所有子元素<?phpheader('Content-Type:text/html;charset=utf-8'); //设置编码/ 创建XML格式的字符串 /$str = <<<XML<?xml version='1.0' encoding='gb2312'?> <computerbook>PHP从入门到精通</computerbook> <computerbook>PHP项目开发全程实录</computerbook>XML;/ /$xml = simplexml_load_string($str); //创建一个simplexml对象foreach($xml->children() as $layer_one){ //循环输出根节点 print_r($layer_one); //查看节点结构 echo ''; foreach($layer_one->children() as $layer_two){ //循环输出第二层根节点print_r($layer_two); //查看节点结构 echo '<br>';}}?>运行结果SimpleXMLElement Object ( [computerbook] => PHP从入门到精通 )SimpleXMLElement Object ( [0] => PHP从入门到精通 )SimpleXMLElement Object ( [computerbook] => PHP项目开发全程实录 )SimpleXMLElement Object ( [0] => PHP项目开发全程实录 )PHP的SimpleXML访问特定节点元素和属性<?phpheader('Content-Type:text/html;charset=utf-8'); //设置编码/ 创建XML格式的字符串 /$str = <<<XML<?xml version='1.0' encoding='gb2312'?> <computerbook>PHP从入门到精通</computerbook> <computerbook name='PHP项目开发全程实录'/>XML;/ /$xml = simplexml_load_string($str); //创建simpleXML对象echo $xml[name].''; //输出根元素的属性nameecho $xml->book[0]->computerbook.''; //输出子元素中computerbook的值echo $xml->book[1]->computerbook['name'].''; //输出computerbook的属性值?>运行结果商品PHP从入门到精通PHP项目开发全程实录
2023年08月10日
17 阅读
0 评论
0 点赞
1
...
55
56
57
...
112