首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
139 阅读
2
php接口优化 使用curl_multi_init批量请求
131 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
102 阅读
5
PHP 文件I/O
89 阅读
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
累计撰写
785
篇文章
累计收到
7
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
785
篇与
的结果
2023-08-11
Laravel 将数据表中的数据导出,并生成seed文件
Laravel 将数据表中的数据导出,并生成seed文件在 laravel 开发过程中,我们为了将自己本地数据库中的数据导出给别人用有两种方法:最普通的也就是将自己的数据库用命令行或者图形操作工具导出成 .sql 的文件给对方使用 ,另外一种就是 laravel 提供的数据库 seed 文件,来看看怎么使用 seed :安装isseedcomposer require "orangehill/iseed": "2.1"然后把 seed 添加到 provider 中:'providers' => [ ... Orangehill\Iseed\IseedServiceProvider::class, ],到此 iseed 已经安装好了,下面来看看 iseed 的用法:假如要导出某张表的数据,命令为:``phpphp artisan iseed 表名如果要导出多张表的话,那么在命令后加 , 表名2 导出数据并且强制覆盖:php artisan iseed 表名1[,表名2...]--force导出指定的数据库里指定的表,并生成seed文件: php artisan iseed 表名--database=数据库名最后执行命令重新执行 migrate 文件并且填充 seed 文件数据:php artisan migrate:refresh --seed
2023年08月11日
15 阅读
0 评论
0 点赞
2023-08-11
PHP框架最新性能压力测试比较
PHP框架最新性能压力测试比较有人说PHP性能低?go语言性能高?到底谁高谁低数据说话!我们就来实际对比一下各PHP框架及一款go语言框架的性能是怎样的。硬件: CPU:Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz 16核心。内存:16GB。操作系统:Ubuntu 18.04PHP版本:7.4压力测试命令: ab -n 100000 -c 1000 -k $urlPHP框架最新输出hello world压力测试结果:框架 版本 方式 web服务器 RPS 最高日/PVlaravel 8.x web nginx 1000 8640wsymfony 4.4 web nginx 2300 1.98亿symfony 4.4 api nginx 4800 4.14亿CI 4.0 web nginx 4800 4.14亿thinkphp 6.0 web nginx 2400 2.0亿lumen 7.2 api nginx 5500 4.75亿ubiquity 2.3 web nginx 6400 5.52亿phalcon 3.4.4 nginx webman 1.0 web php-cli 30000 25.9亿mixphp 2.2 web php-cli 44000 38亿go-zero 1.1.1 api go语言 25000 21.6亿*mixphp为基于swoole 4.5的框架,开启多核与端口复用(并不是核心越多性能越高,以上开了4核)PHP框架最新模板渲染输出hello world压力测试结果:框架 版本 方式 web服务器 RPS 最高日/PVlaravel 8.x web nginx 1000 8640wsymfony 4.4 web nginx 2200 1.9亿CI 4.0 web nginx 4700 4亿thinkphp 6.0 web nginx 2300 1.98亿lumen 7.2 api nginx 4600 3.9亿ubiquity 2.3 web nginx 6400 5.52亿phalcon 3.4.4 nginx webman 1.0 web php-cli 31000 26.7亿mixphp 2.2 web php-cli 25000 21.6亿PHP框架最新读取mysql 5.7数据库压力测试结果:框架 版本 方式 web服务器 RPS 最高日/PV 说明laravel 8.x web nginx 700 6048w DB::table()->get()symfony 4.4 web nginx 1300 1.1亿 symfony 5.2 api nginx 1900 1.64亿 CI 4.0 web nginx 2900 2.5亿 thinkphp 6.0 web nginx 1500 1.29亿 lumen 7.2 api nginx 2500 2.16亿 ubiquity 2.3 web nginx 5600 4.8亿 phalcon 3.4.4 nginx webman 1.0 web php-cli 31000 26.7亿 mixphp 2.2 web php-cli 25000 21.6亿 *从mysql数据库的用户表,读取约10个用户名后,循环输出(不经过模板渲染)。*ubiquity:如果用了php7.4 preloading 有性能高达50-60%的性能提升.*laravel 8.x 优化后测试达到1200RPS。附图:说明:0.以上各框架都为下载框架后,按各框架默认安装方式安装好,同时关闭debug模式,无其它性能优化情况下进行测试,同时关闭nginx的 access log。1.为了测试准确,laravel 的SESSION_DRIVER不要设置为file,这里设置为array,否则会由于大量磁盘IO会造成结果比较低。2.Mysql的连接数要设置足够大,不然会出错完不成压力测试。3.如果由于高并发出现php-fpm错误:connect() to unix:/var/run/php-fpm.sock failed (11: Resource temporarily unavailable),请修改参数:1)内核修改sudo vim /etc/sysctl.confnet.ipv4.tcp_max_syn_backlog = 4096net.core.netdev_max_backlog = 4096sudo sysctl -p生效2)php-fpm配置修改修改 /etc/php/7.4/fpm/pool.d/www.conflisten.backlog = 4096sudo service php-fpm7.4 restart4.日最高PV,为RPSx86400(一天的秒数),为可能达到的日最高页面浏览量.当然由于网民一般在夜里的浏览量比较低,实际的PV,是小于这个数的,根据百度统计的用户上网时间分布,得出的实际PV应该是日最高PVx0.72,当然百度统计是全网网站的平均值,根据网站类型不同,有些网站的实际日PV可能是日最高PV/2或日最高PV/3。5.此测试结果保证严谨,此压力测试前前后后大约一年内时间经历了好几轮测试,此为2021最新版本结果。每个框架的结果误差大约在100以内。2021.2.18更新:因为ap工具只支持http/1.0,不支持http/1.1,所以 如果响应头中有Transfer-Encoding: chunked 的,则ab不会启用keep-alive 连接,所以会造成测试数据比较低。如上图中的,没有keep-alilve数据的,可能不准确。而用Content-Length头,则可以以keep-alive连接。可以换为wrk测试工具进行测试。待以后数据更新。结论:go的框架没有比过php框架。ubiquity:(https://ubiquity.kobject.net/) ,做为一个纯PHP框架,目前是传统PHP框架中性能最高的。webman(https://www.workerman.net/doc/webman),mixphp(swoole)框架为cli模式,因为是长驻内存,所以性能最高,并在hello world测试中超过了go语言的go-zero框架。如果你用的是laravel技术栈,那么在做接口时,强烈建议用laravel的微框架lumen,除具有非常高的性能外,还具有laravel的大部分功能,并且可以极容易升级到laravel框架。ps:https://github.com/lizhichao/one (此框架性能也很高。)
2023年08月11日
30 阅读
0 评论
0 点赞
2023-08-11
PHP 7.4中的箭头函数
PHP 7.4中的箭头函数短闭包(也称为箭头函数)是用PHP编写短函数的一种方式。当将闭包传递给类似array_map或array_filter的函数时,此符号很有用。这是他们的样子:// A collection of Post objects$posts = [/ … /];$ids = array_map(fn($post) => $post->id, $posts);以前,您必须编写以下代码:$ids = array_map(function ($post) {return $post->id;}, $posts);让我们总结一下如何使用短闭包。自PHP 7.4起可用他们以fn关键字开头它们只能有一个表达式,即return语句不允许return关键字参数和返回类型可以类型提示上面示例的更严格类型的编写方式可能是:$ids = array_map(fn(Post $post): int => $post->id, $posts);还有两件事要提到:还可以使用展开运算符允许引用,这两个参数都作为返回值如果要通过引用返回值,则应使用以下语法:fn&($x) => $x简而言之,除了仅允许一个表达式之外,短闭包还具有与普通闭包相同的功能。没有多行您没看错:短闭包只能有一个表达式。这意味着您不能包含多行。理由如下:短闭包的目标是减少冗长。 fn当然比function所有情况都短。RFC的创建者Nikita Popov辩称,如果您要处理多行功能,则使用短闭包将带来的好处更少。毕竟,按照定义,多行闭包已经更加冗长;因此能够跳过两个关键字(function和return)不会有太大的区别。您是否同意这种观点取决于您。虽然我可以在项目中想到许多单行闭包,但也有很多多行闭包,在这些情况下,我个人会错过简短的语法。不过还是有希望的:将来有可能添加多行短闭包,但这只是一个RFC。来自外部范围的值短闭包和普通闭包之间的另一个显着区别是,短闭包不需要use关键字能够从外部范围访问数据。$modifier = 5;array_map(fn($x) => $x * $modifier, $numbers);请务必注意,不允许从外部作用域修改变量。值由值绑定,而不是由引用约束。这意味着您可以在短闭包内更改$modifier,尽管它不会对外部作用域中的$modifier变量产生影响当然有一个例外是$this关键字,它的作用与普通的闭包完全相同:array_map(fn($x) => $x * $this->modifier, $numbers);未来的可能性我已经提到了多行短关闭,这仍然是未来的可能性。浮动的另一个想法是允许在类中使用短闭包语法,例如,用于getter和setterclass Post {private $title; fn getTitle() => $this->title;}总而言之,短闭包是一个受欢迎的功能,尽管仍有改进的空间。最大的一个可能是多行短闭包。
2023年08月11日
20 阅读
0 评论
0 点赞
2023-08-11
100 个最常用的 PHP 函数
100 个最常用的 PHP 函数下面的列表是最常用的前 100 个 PHP 函数:它们是最常用的 PHP 中自带的函数。这些函数被命名使用,并从 1 到 100 进行排序。 其他的 4500 个函数现在还没在排名中。 下面频率列表表示在 PHP 代码中使用此函数的频率:参考资料来自于 1900 个 PHP 开源项目。 他们使用了 Exakat static analysis engine 静态分析引擎的 1.2.5 版本进行了审核。平均值是在一个项目中调用此函数的次数。有些函数是被封装使用的,而另一些则是主要函数。比如说,5 个项目里面有 4 个用到了 count 函数,函数被调用大概 150 次。说明它很流行且被大量使用。单击函数名跳转到 PHP 文档。在 Top 100 文章的底部有一些总结见解。排行 函数 频率 平均值1 count 81.41 % 147.672 is_array 77.32 % 117.863 substr 74.62 % 142.924 in_array 74.16 % 79.555 explode 73.19 % 71.516 str_replace 72.32 % 101.057 implode 72.27 % 66.598 strlen 70.07 % 98.329 array_merge 69.46 % 64.0110 strpos 67.98 % 78.1811 preg_match 67.31 % 76.6012 sprintf 67.16 % 119.4613 trim 66.75 % 81.2814 strtolower 65.99 % 59.6215 file_exists 65.12 % 45.1316 is_string 61.39 % 45.1017 preg_replace 60.27 % 54.2818 file_get_contents 59.96 % 20.7119 array_key_exists 59.70 % 57.5020 array_keys 59.35 % 39.5921 dirname 56.44 % 54.8422 function_exists 53.58 % 42.6223 array_map 53.22 % 19.4524 get_class 53.12 % 33.0725 class_exists 52.50 % 23.1326 is_object 51.94 % 35.3527 time 51.79 % 41.4228 json_encode 51.48 % 24.8129 date 50.72 % 52.1830 is_null 49.69 % 60.5231 is_numeric 49.49 % 40.6932 array_shift 49.49 % 23.2833 defined 48.72 % 86.8234 is_dir 48.57 % 22.8635 json_decode 48.42 % 17.3936 header 48.16 % 59.7137 strtoupper 47.80 % 30.9538 array_values 47.24 % 17.2739 md5 46.88 % 23.7440 method_exists 46.73 % 19.0541 file_put_contents 46.68 % 12.4942 rtrim 45.91 % 18.0843 array_pop 45.51 % 20.6044 unlink 44.59 % 23.5545 basename 44.59 % 27.2346 realpath 44.08 % 15.9047 call_user_func 43.97 % 16.4148 call_user_func_array 43.92 % 18.4049 fopen 43.77 % 25.6150 microtime 43.46 % 14.4151 fclose 42.85 % 28.3652 is_int 42.75 % 15.7853 is_file 42.08 % 20.5254 array_slice 41.83 % 13.2055 preg_match_all 40.55 % 14.6656 ucfirst 40.25 % 17.0257 intval 40.19 % 88.1358 str_repeat 40.14 % 19.5159 serialize 40.14 % 22.0560 array_filter 39.99 % 13.8761 mkdir 39.79 % 11.1762 is_callable 39.43 % 11.9463 ltrim 39.17 % 10.9064 ob_start 39.12 % 13.2665 round 39.07 % 28.5666 fwrite 38.97 % 23.3967 array_unique 38.87 % 15.9668 array_search 38.82 % 14.1969 reset 38.71 % 20.7970 array_unshift 38.10 % 10.3271 parse_url 37.90 % 9.6172 func_get_args 37.79 % 28.3373 end 37.49 % 12.7074 base64_encode 37.39 % 14.1575 unserialize 37.18 % 18.3576 max 36.98 % 22.8877 preg_split 36.98 % 13.2778 gettype 36.93 % 16.1679 strrpos 36.67 % 11.9580 version_compare 36.67 % 14.8781 array_push 36.67 % 26.1882 floor 36.11 % 18.7883 strtotime 36.01 % 27.9484 htmlspecialchars 35.96 % 51.0885 ini_get 35.85 % 19.2586 ini_set 35.60 % 14.4987 chr 35.34 % 186.9788 extension_loaded 35.29 % 14.1789 is_bool 35.24 % 11.4490 ksort 34.98 % 10.8291 array_reverse 34.93 % 8.2792 ord 34.73 % 53.1793 uniqid 34.68 % 9.8394 strtr 34.47 % 12.9095 array_diff 34.32 % 11.1396 error_reporting 34.17 % 8.9997 ceil 33.35 % 11.9998 urlencode 33.30 % 29.6399 min 32.69 % 18.31100 print_r 32.64 % 14.12前 100 分析最常用的 PHP 函数是字符串函数,然后是数组函数,接着是文件函数。 (运算函数不在此列主要是因为他们通常基于运算符)每个函数的链接都指向其对应的文档,事实上许多函数经过发展以及获得了许多新特性,例如:count() 的第二个参数,dirname() 的第二个参数以及 preg_match() 和 str_replace() 接受数组作为参数等。有很多彩蛋。以上 100 个函数没有近期要废弃的计划。在非内置库中,mbstring 排名第一、curl 第二,然后是 gd、filter 和 iconv。md5 是最常用的加密函数,其次是 Sha1 (#147)。print_r 出现在 1/3 的项目代码里面的某处,任何地方 ...由于 dirname(dirname(dirname())) 的调用,dirname 的使用频率非常高。array、echo、print、empty、isset 这些没有纳入此排名,它们的使用度肯定是非常高的。如下几个函数应该用运算符替代 : array_push, is_object, func_get_arg, chr, call_user_func。相当多的调用是为了知道值的类型。数据库函数没有在这里排名:他们经常使用类,但功能仍然很频繁。可能是另一个前 100 名?相比写入文件 PHP 更多的应用于读取文件。它还解码 base64。使用键排序比使用值或使用键更频繁。通常使用 file_get_contents 读取文件,使用 fwrite 写入文件。后记如果你正在学习 PHP,最好回顾一下这里排名的 100 个功能。它们是你加入一个编码团队后最常找到的功能。它们不是唯一的,但遇到它们时你会不那么惊讶。PHP 函数
2023年08月11日
13 阅读
0 评论
0 点赞
2023-08-11
PHP 中使用 TUS 协议来实现大文件的断点续传
PHP 中使用 TUS 协议来实现大文件的断点续传你是否曾经为大文件上传而苦恼?如果文件上传的过程中,因为某种原因中断了,是否可以从中断的位置继续上传,而不用重新上传整个文件?如果你有这样的困惑,那么请继续阅读下面的内容。在现代网站应用中,上传文件是非常常见的。在任何语言中,通过使用一些工具,都可以实现文件上传的功能。但是,如果处理大文件上传的需求,还是有点麻烦的。假如你此时正在上传一个很大的文件,大约一个小时过去了,进度是 90%。突然断网了或者浏览器崩溃了,上传的程序退出,你要再全部重新来过。真的很不爽,对不对?还有更让人郁闷的是,如果你的网速很慢,那么,无论你重来多少次,你都不可能上传成功。在 PHP 中,我们可以尝试利用 tus 协议的断点续传功能来解决这个问题。什么是 tus?Tus 是一个基于 HTTP 的 文件断点续传开放协议。 断点续传的意思是不管是用户自行中断,还是由于网络等原因的意外中断,都可以从中断的地方继续上传,而不用重新开始。Tus 协议是在 2017 年5月被 Vimeo 采用的。为什么用 tus?引用 Vimeo 的博客:我们之所以决定用 tus,是因为它能以简洁开放的形式,将文件上传的过程标准化。这种标准化有利于 API 的开发者更加专注于应用本身的逻辑,而非文件上传的过程。使用这种方式上传的另一个好处是,你可以在笔记本上开始上传文件,然后又转到手机或者其他设备继续上传同一个文件,这可以极大地提升用户体验。图片: Tus 大致的工作流程开始第一步,加载依赖。$ composer require ankitpokhrel/tus-phptus-php 是用于 tus 断点续传协议 v1.0.0 的一个的纯 PHP 框架,完美实现了 服务端与客户端的交互 。更新: 现在 Vimeo 官方 PHP 库 的 v3 用的是 TusPHP。创建一个处理请求的服务端你可以像下面这样创建一个服务端.// server.php$server = new \TusPhp\Tus\Server('redis');$response = $server->serve();$response->send();exit(0); // 退出当前 PHP 进程你需要配置你的服务器以便能对特定的终端进行响应。如果使用 Nginx 的话你可以像下面这样配置:nginx.conflocation /files {try_files $uri $uri/ /path/to/server.php?$query_string;}假设我们服务端的 URL 是 http://server.tus.local. 因此,基于我们上面的 Nginx 配置,我们可以通过 http://server.tus.local/files. 来访问到我们的 tus 终端.基于 RESTful 风格的端点配置:获取有关服务器目前配置的信息\OPTIONS /files检查上传的文件是否合法\HEAD /files/{upload-key}创建\POST /files修改\PATCH /files/{upload-key}删除\DELETE /files/{upload-key}查看 协议细则 获取更多关于路由的信息。如果你是用类似于 Laravel 的框架,那么你就不需要在配置文件里定义这些了, 可以直接定义路由来访问 tus 的基础端点。我们会在另外的教程里介绍相关细节。使用 tus-php 客户端处理上传服务器到位后,客户端可以块的形式上传文件。 让我们首先创建一个简单的 HTML 表单来获取用户的输入。 提交表单后,我们需要按照几个步骤来处理上传。创建一个 tus-php 客户端对象// Tus client$client = new \TusPhp\Tus\Client('http://server.tus.local');上面代码中的第一个参数是你的 tus 服务器地址。2. 使用文件元数据初始化客户端为了确保上传文件的唯一性,我们需要给每个上传的文件以唯一标识。这样在文件中断后续传的时候,服务器就可以很清晰地辨识出,哪几个片段是属于同一个文件得。这个标识码可以自己指定,也可以由系统生成。// 设置标识码和文件元数据$client->setKey($uploadKey)->file($_FILES['tus_file']['tmp_name'], 'your file name');如果不想指定标识码,可以这样写,由系统会自动生成:$client->file($_FILES'tus_file', 'your file name');$uploadKey = $client->getKey(); // Unique upload key3. 分块上传文件// $chunkSize 是以字节为单位的,例如 5000000 等于 5 MB$bytesUploaded = $client->upload($chunkSize);当你想要续传下一块的时候,就可以带上同样的标识码参数来续传。// 在下一个请求中续传文件$bytesUploaded = $client->setKey($uploadKey)->upload($chunkSize);文件全部上传完成后,默认情况下,服务器会使用 sha256 来校验文件总和,以确保不会有丢失的文件。使用 tus-js-client 客户端处理文件上传tus 协议的团队还开发了一个模块化的文件上传插件 Uppy。这个插件可以在官方 tus-js-client 和 tus-php 服务器之间建立连接。也就是说我们可以使用 php 配合 js 来实现文件上传了。uppy.use(Tus, { endpoint: 'https://server.tus.local/files/', // 你的 tus 服务器 resume: true, autoRetry: true, retryDelays: [0, 1000, 3000, 5000]})更多细节可以查看 uppy 的文档, 这里 还有些例子可以供你参考。分块上传tus-php 服务器支持 concatenation 扩展,可以把多次上传的文件合为一个文件。因此,我们可以在客户端支持并行上传以及非连续的分块文件上传。使用 tus-php 实现分块上传tus-partial-upload.php<?php// 文件唯一标识码$uploadKey = uniqid();$client->setKey($uploadKey)->file('/path/to/file', 'chunk_a.ext');// 从第 1000 个字节开始上传 10000 字节$bytesUploaded = $client->seek(1000)->upload(10000);$chunkAkey = $client->getKey();// 从 第 0 个字节开始上传 10000 字节$bytesUploaded = $client->setFileName('chunk_b.ext')->seek(0)->upload(1000);$chunkBkey = $client->getKey();// 从第 11000 个字节 (10000 + 1000) 开始上传剩余的字节$bytesUploaded = $client->setFileName('chunk_c.ext')->seek(11000)->upload();$chunkCkey = $client->getKey();// 把分块上传的文件组合起来$client->setFileName('actual_file.ext')->concat($uploadKey, $chunkAkey, $chunkBkey, $chunkCkey);分块上传的完整例子 在这里.总结由于 tus-php 项目 本身还出于初级阶段,后面可能还会有一些改动。在 example 文件夹里,有三个不同的例子供你参考。如果任何问题或者建议,欢迎留言交流。Happy Coding!
2023年08月11日
17 阅读
0 评论
0 点赞
1
...
86
87
88
...
157