首页
关于
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
篇文章
累计收到
30
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
138
篇与
的结果
2023-12-28
PHP用流方式下载文件的优势浅析
PHP用流方式下载文件的优势浅析在PHP中,可以使用fopen()函数打开一个远程文件,并使用流来下载文件内容到本地文件。这样优点是不用将文件全部一次性放入内存中,可以避免内存溢出的问题。下面是一个示例代码:$url = 'http://example.com/file.zip'; $local_file = '/path/to/local/file.zip'; // 打开远程文件 $remote_file = fopen($url, 'r'); // 打开本地文件 $fp = fopen($local_file, 'w'); // 使用流下载文件内容 while (!feof($remote_file)) { fwrite($fp, fread($remote_file, 1024)); } // 关闭文件 fclose($remote_file); fclose($fp);在上面的代码中,使用fopen()函数打开远程文件和本地文件,然后使用fread()函数从远程文件读取内容,并使用fwrite()函数将内容写入本地文件。注意,在使用流下载文件时,需要确保服务器允许远程访问,否则可能会出现错误。使用流下载文件时,需要注意以下事项:需要确保服务器允许远程访问,否则可能会出现错误。如果本地文件已存在,会被覆盖。如果不希望覆盖,可以在打开本地文件时指定 a 模式,表示追加到文件末尾。在下载大文件时,可能会用时较长,可以使用进度条显示下载进度。如果远程文件不存在或访问出错,可能会导致下载失败。在下载文件时,可以使用 HTTP 头信息来控制文件缓存、文件类型和文件下载方式等。在下载过程中,需要确保远程文件和本地文件都已正常打开,否则可能会出现错误。在读取远程文件时,需要使用 feof () 函数检查文件是否已读完,否则可能会出现死循环。在下载过程中,需要注意带宽限制和网络状况,否则可能会导致下载速度过慢。在 PHP 中,使用 fopen () 函数打开远程文件需要在 php.ini 中启用 allow_url_fopen 选项,在 PHP 中,allow_url_fopen 选项默认是开启的。
2023年12月28日
9 阅读
0 评论
0 点赞
2023-12-26
三个实用的PHP函数小工具!
三个实用的PHP函数小工具!1.PHP检测IP是否内网地址、保留地址/** * @param string $ip 被检测的IP * @return bool 是否内网或者保留IP */ public function isInternalIp($ip) { $ip = ip2long($ip); if (!$ip) { //非法IP,直接算true吧 return true; } $net_a = ip2long('10.255.255.255') >> 24; //A类网预留ip的网络地 $net_b = ip2long('172.31.255.255') >> 20; //B类网预留ip的网络地址 $net_c = ip2long('192.168.255.255') >> 16; //C类网预留ip的网络地址 $net_local127 = ip2long('127.255.255.255') >> 24; //127保留地址 $net_local169 = ip2long('169.254.255.255') >> 16; //169保留地址 return $ip >> 24 === $net_a || $ip >> 20 === $net_b || $ip >> 16 === $net_c || $net_local127 === $ip >> 24 || $net_local169 === $ip >> 16; }这个是我网上找来的,具体地址我忘了,然后自己加了保留地址的检测。2.PHP获取HTTP包流量整个HTTP请求包流量 public function http() { $row = $_SERVER['REQUEST_URI'] . "\r\r"; $header = getallheaders(); foreach ($header as $k => $v) { $row .= $k . ': ' . $v . "\r"; } $row .= "\r\r" . file_get_contents("php://input"); return $row; }3.vue差量更新包-PHP处理public function test() { $config = json_decode(file_get_contents('vueconfig.json'), true); //配置目录,初次使用要先建立配置 $path = 'D:\\web\\project\\vue\\dist\\static\\'; // 打包的静态地址 foreach ($config as $dir => $type) { foreach (scandir($path . $dir) as $fkey => $fva) { if ($fva == '.' || $fva == '..') { continue; } else { if (in_array($fva, $type)) { //没有更新就删除该文件 unlink($path . $dir . '\\' . $fva); } else { echo '新增文件:' . $path . $dir . '\\' . $fva . "<br>"; //有更新就把新文件加入到配置表里记录 $config[$dir][$fkey] = $fva; } } } } //更新配置表 file_put_contents('vueconfig.json', json_encode($config)); }直接运行即可删除没有改变的文件,保留更新的文件,实现差量更新。
2023年12月26日
15 阅读
0 评论
0 点赞
2023-12-04
php接口优化 使用curl_multi_init批量请求
需求:一个接口里请求了多个接口(方法),查询速度缓慢,每个请求2s,加起来11、12s。实现:PHP中的curl_multi一类函数可以实现同时请求多个url,而不是一个一个依次请求,这就类似一个进程实现了多个线程的功能,最终接口请求耗时优化到2s,即查询耗时最长的那次是最终的查询时长。<?php class XClass extends BaseSys { public function index() { $rs = []; $local_url = "当前请求地址"; $urlArr = []; $paramsArr = []; $params = $_POST; $curAction = [ ['name'=>'getANum','bool'=>''], ['name'=>'getCNum','bool'=>true], ['name'=>'getCNum','bool'=>false], ['name'=>'getLNum','bool'=>''], ...... ];//接口名、参数 foreach ($curAction as $key => $item) { $urlArr[] = $local_url . "XClass/".$item["name"]; $subparams = $params; $subparams["bool"] = $item["bool"]; $subparams["isMutil"] = 1; $paramsArr[] = $subparams; } $contentArr = $this->mutil_curl($urlArr, $paramsArr); foreach ($contentArr as &$item) { $rs[] = json_decode($item,true); } return $rs; } public function getCNum($isNew = false) { //TODO if (isset($_POST["isMutil"])) {//mutil_curl并发请求结果 exit($json_encode($rs, JSON_UNESCAPED_UNICODE) . ''); } return $rs; } /** * 多url同时访问curl操作封装,一般用于内部并行数据查询 * $urlArr 要访问的网址集合,get方法的时候请在此网址上直接带上参数 * $paramsArr 要post的数据集合 */ public function mutil_curl($urlArr, $paramsArr = null, $timeout = 60) { $contentArr = []; $num = 0; $len = count($urlArr)-1; foreach ($urlArr as $k => $url) { if($num == 0){ $subrulArr = []; } $subrulArr[$k] = $url; $num++; if($num == 16 || $len == $k){ $subcontentArr = $this->_do_mutil_curl($subrulArr, $paramsArr); foreach ($subcontentArr as $subkey => $subvalue) { $contentArr[$subkey] = $subvalue; } $num = 0; } } return $contentArr; } public function _do_mutil_curl($urlArr, $paramsArr = null, $timeout = 60) { set_time_limit($timeout); // curl 批处理 $mh = curl_multi_init(); // 保存单个句柄 $handles = []; // 向 curl 批处理会话 中添加单独的 curl句柄 foreach ($urlArr as $k => $url) { $ch = curl_init(); // 初始化curl并设置链接 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); // 设置是否为post传递 curl_setopt($ch, CURLOPT_POST, !empty($paramsArr)); // 对于https 设定为不验证证书和host curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//设置是否返回信息 if (!empty($paramsArr)) { $params = $paramsArr[$k]; if ($params) { if (is_array($params)) { $params = http_build_query($params); } // POST 数据 curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); } } $handles[$k] = $ch; curl_multi_add_handle($mh, $handles[$k]); } $active = null; $contentArr = []; do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active and $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } // 循环输出 大小以及地址 foreach ($handles as $i => $handle) { // 内容 $content = curl_multi_getcontent($handle); $contentArr[$i] = $content; curl_multi_remove_handle($mh, $handle); } curl_multi_close($mh); return $contentArr; } PS:这里为了方便显示,把mutil_curl()和_do_mutil_curl()放在同一个类中,实际上它们是放在一个工具类里,方便调用。
2023年12月04日
144 阅读
6 评论
0 点赞
2023-11-27
哈希分表方法
/* * 根据账号名获取分表 * 函数接受两个参数,$u代表账号名,$n代表分表的数量,默认为256(即账号表分256张表) */ function calc_hash_tbl($u, $n = 256) { $h = sprintf('%u', crc32($u));//使用crc32函数计算账号名的哈希值,并使用sprintf函数将其转换为无符号整数 $h1 = intval($h / $n);//将哈希值除以分表数量$n得到$h1 return $h1 % $n;//将$h1对$n取模得到最终的分表索引值 }这个函数默认输出的值范围是从0到255,因为在最后一行代码中,对$h1取模$n的操作会得到0到$n−1的余数。$accountname = "xx"; $table = "account_info_".calc_hash_tbl($accountname); ...
2023年11月27日
9 阅读
0 评论
0 点赞
2023-10-20
php使用正则表达式和翻译字典json文件做翻译
需求:把页面中的中文翻译成越南文。思路:在框架渲染页面的地方(这个地方能获取到页面渲染后的所有html数据,设为$str),使用以下方法。//翻译中文 读取json文件,使用正则表达式替换中文 public static function pregReplaceChinese($str,,$toLanguageType = 'vietnam',$isNotHtml = false){ if(empty($str)){ return $str; } else { //翻译字典json文件 例子 //$jsonFile ='{ // "追风剑": "Truy Phong Kiếm", // "追风镯": "Truy Phong Trạc" //}'; //0、翻译前准备 正则关键字符数组,避免影响到后面正则替换翻译 $regexChars = ['^', '$', '.', '|', '?', '*', '+', '(', ')', '[', ']', '/', '-']; $unicodeChars = ['%u005e','%u0024','%u002e','%u007c','%u003f','%u002a','%u002b','%u0028','%u0029','%u005b','%u005d','%u002f','%u002d']; $oldContent = $str; //1、获取翻译关键字的json文件,将其转换为数组 $jsonFile = 'http://xxx/language/vietnam.json'; $fyChars = file_get_contents($jsonFile); $jsonArr = json_decode(str_replace($regexChars,$unicodeChars,$fyChars), true);//翻译json文件转换为数组 if (is_string($str)) { $str = str_replace($regexChars,$unicodeChars,$str);//正则关键字符替换 } //1-1、非页面翻译 if ($isNotHtml) { // 处理数组(如道具数组)翻译 if (is_array($str)) { $jsonArr = json_decode($fyChars, true);//翻译json文件转换为数组 foreach($str as $key => $item){ if (!empty($jsonArr[$item['name']])) { $str[$key]['name'] = $jsonArr[$item['name']]; } } return $str; } // 处理Excel表格内容和表格文件名称翻译 if (strpos($str,'交易ID') !== false || strpos($str,',') !== false) { $str = iconv('gbk', 'utf-8', $str); if (strpos($str,'交易ID') !== false) { $str = str_replace('交易ID','交易id',$str); } $arr[0] = explode(',',$str); } if (empty($arr[0])) { preg_match_all('/[\x{4e00}-\x{9fa5}]+/u', $str, $arr); } } else { //2、获取页面中的>任意内容<,将其转换为数组 $pattern = '/>[\s\S]*?<|title="([^"]+)"|value="([^"]+)"/'; preg_match_all($pattern, $str, $arr); } //3、使用正则表达式preg_replace翻译替换中文处理,需要生成的两个关联数组,且索引保持一致才能进行顺序替换,其中匹配翻译的数组,当没有找到翻译关键字则设置为当前关键字 $patterns = [];//需要翻译的数组 $replaces = [];//匹配翻译的数组 foreach($arr[0] as $item){ $itemArr = []; $item = trim(str_replace(['>','<','title=','value='],'',$item)); if(empty($item) || strstr($item, "u005d%u002e") || strstr($item, "'u005d'") || strstr($item, "'%u0029;")|| strstr($item, "}%u0029;") || strstr($item, "html") || strstr($item, "function ") || strstr($item, "label {") || strstr($item, "+json") || strstr($item, "%u002a")){//可能是页面代码如html、js/css代码 continue; } $item = trim($item, '"'); if (strpos($item,' 数量:') !== false) {//邮件列表道具翻译特殊处理 $itArr = explode('%u002e',$item);// %u002e--| foreach ($itArr as $it1) { $it1Arr = array_filter(explode(' ',$it1)); foreach ($it1Arr as $it2) { $it2Arr = array_filter(explode(':',$it2)); foreach ($it2Arr as $it3) { if (strpos($it3,'数量') !== false) { $it3 = ' '.$it3.':'; } if (strpos($it3,'物品') !== false) { if (strpos($it3,'充值额度%u0029') !== false) {//例 (不增加充值额度)物品 $it4Arr = explode('%u0029',$it3); $itemArr[] = $it4Arr[0].'%u0029'; $itemArr[] = $it4Arr[1].':'; continue; } else { $it3 = $it3.':'; } } $itemArr[] = $it3; } } } } if (strstr($item, " 总充值")) {//处理个别翻译 $itemArr[] = '总充值'; } if (!isset($itemArr[$item])) { $itemArr[$item] = $item; } foreach ($itemArr as $item) { self::arrayAss($jsonArr,$patterns,$replaces,$item); } } //数组按照键值长度 倒叙排序 uksort($patterns, function($a, $b) { return strlen($a) < strlen($b); }); uksort($replaces, function($a, $b) { return strlen($a) < strlen($b); }); $content = preg_replace($patterns, $replaces, $str); if(!empty($content)){ $content = str_replace($unicodeChars,$regexChars,$content); if (strpos($content,'<|/|d|i|v|>|') !== false) {//有些页面经过转换后 出现多余| $content = str_replace('|','',$content); } } else { $content = $oldContent; } return $content; } } //拼接原字符串和翻译字符串的数组 public static function arrayAss($jsonArr,&$patterns,&$replaces,$item){ $patterns[$item] = '/'.$item.'/'; if (!empty($jsonArr[$item])) { $replaces[$item] = $jsonArr[$item]; } else { $replaces[$item] = $item; } }调用方法//页面翻译 if (Tool::isvietnam()) {//翻译(用户点击了翻译按钮,Tool::isvietnam()方法是从缓存中获取用户是否点击了翻译按钮) $content = Tool::pregReplaceChinese($content); } //或者 Excel内容/文件名(纯中文)翻译 if (Tool::isvietnam()) {//翻译 $filename = Tool::pregReplaceChinese($filename,'vietnam',true);//Excel文件名 $data = Tool::pregReplaceChinese($data,'vietnam',true);//Excel内容字符串 交易ID,x,x,商品名称,x,x等 }
2023年10月20日
12 阅读
0 评论
0 点赞
1
...
15
16
17
...
28