首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
136 阅读
2
php接口优化 使用curl_multi_init批量请求
129 阅读
3
2024年备考系统架构设计师
102 阅读
4
《从菜鸟到大师之路 ElasticSearch 篇》
101 阅读
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
篇文章
累计收到
5
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
559
篇与
的结果
2023-12-28
PHP设置脚本最大执行时间的三种方法
PHP设置脚本最大执行时间的三种方法php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中的 max_execution_time 变量指定,如果脚本需要跑很长时间;这种情况就要更改php脚本最大执行时间。1、在php.ini里面设置max_execution_time = 120;2、通过PHP的ini_set函数设置ini_set("max_execution_time", "120");3、通过set_time_limit 函数设置set_time_limit(120);方法一主要适用于网站已经做好了,后期维护人员对代码结构不熟悉,方法二和三适用于写代码时候,不过不推荐使用方法二,因为要注意ini_set函数是否会被禁用。
2023年12月28日
7 阅读
0 评论
0 点赞
2023-12-28
thinkphp Hook行为的使用案例
thinkphp Hook行为的使用案例行为,官方是如下介绍:行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为既可以独立调用,也可以绑定到某个标签中进行侦听,在官方提出的CBD模式中行为也占了主要的地位,可见行为在ThinkPHP框架中意义非凡。这里指的行为是一个比较抽象的概念,你可以把行为想象成在应用执行过程中的一个动作或者处理。在框架的执行流程中,例如路由检测是一个行为,静态缓存是一个行为,用户权限检测也是行为,大到业务逻辑,小到浏览器检测、多语言检测等等都可以当做是一个行为,甚至说你希望给你的网站用户的第一次访问弹出Hello,world!这些都可以看成是一种行为,行为的存在让你无需改动框架和应用,而在外围通过扩展或者配置来改变或者增加一些功能。而不同的行为之间也具有位置共同性,比如,有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置称之为标签(位),当应用程序运行到这个标签的时候,就会被拦截下来,统一执行相关的行为,类似于AOP编程中的“切面”的概念,给某一个切面绑定相关行为就成了一种类AOP编程的思想。使用行为的定义很简单,只是在某些场景下的应用,可能有点难以理解。在 laravel 中, 类似于其事件监听器, 当触发了某一行为进行自动触发相关的操作方法举个例子来说一个登录的功能,前期我们只需要校验密码即可,按照以往的方法可以这样做function checkLogin() { $this->checkPass(); // -- 新增加的功能 $this->checkMobile(); $this->checkCaptcha(); //... 等等 echo '登录成功'; }在如上操作中,是不是很麻烦,针对一个登录行为, 如果后期功能的增加我们需要不断的去增加功能就必须得去修改控制器代码我们进行解耦该怎么做呢?即将行为,逻辑(钩子)分离开, 让代码更加易于管理使用如下,我们直接上图如上,我们定义了三个不同的即将发生的行为, 分别为连接网络 、 关闭电脑、使用电脑// Connect.php namespace app\index\behavior; class Connect { public function run() { echo '连接网络'; } public function __destruct() { echo '<br/>'; } } // End.php namespace app\index\behavior; class End { public function run() { echo '关闭电脑'; echo '<br/>'; } } // On.php namespace app\index\behavior; class On { public function run() { echo '开启电脑'; echo '<br/>'; } public function qq() { echo '打开QQ'; echo '<br/>'; } public function opBrowser() { echo '打开浏览器'; echo '<br/>'; } public function app_end(&$param) { $param = '结束了'; } }控制器文件 Index.phpnamespace app\index\controller; use think\Hook; class Index { public function __construct() { // 开始绑定使用电脑需要进行的操作 Hook::add('app_init', [ 'app\\index\\behavior\\On', 'app\\index\\behavior\\Connect', ] ); // 批量绑定 Hook::add('qq', 'app\\index\\behavior\\On'); // 自定义标签名 Hook::add('opBrowser', 'app\\index\\behavior\\On'); // 自定义标签名 // Hook::add('app_end', 'app\\index\\behavior\\End'); // 系统标签位,无需绑定,自动执行 } public function index() { echo '我现在需要使用电脑进行社交'; echo '<br/>'; Hook::listen('app_init'); // 手动初始化 Hook::listen('qq'); // 打开qq Hook::listen('opBrowser'); // 打开浏览器 } }输出结果1) 解析首先,我们可以在一个全局中,例如控制器初始化中可以使用 Hook::add 开始进行绑定, 绑定完成后就可以使用 Hook::listen() 执行相关绑定的方法,尽量不要使用Listen音译去理解这个方法他实际上不算监听,实际上是运行的意思, 当Listen的时候,会执行相关在前面绑定的方法, 例如 Hook::listen('app_init') 后便会执行 'app\index\behavior\On', 'app\index\behavior\Connect'中的 run 方法如果 执行的行为标签 app_init 非系统标签或者在 app\index\behavior\On 中有 app_init 方法,则会就会执行其中app_init的方法,而不是执行run2) 自定义标签使用自定义标签必须满足两个条件, 1、Hook::add('qq') 对自定义标签 qq 进行绑定了, 2、对应的行为类中必须存在 qq 这个方法, 否则自动运行 run 方法3) tags.php 行为绑定// ..tags.php <?php return [ 'app_init'=> [ 'app\\index\\behavior\\On', 'app\\index\\behavior\\Connect', ], 'app_end'=> [ 'app\\index\\behavior\\End' ] ];可以在控制器下目录下使用 tags.php 进行绑定。
2023年12月28日
10 阅读
0 评论
0 点赞
2023-12-28
5个PHP+Swoole/Go的问答
5个PHP+Swoole/Go的问答一、Swoole协程的原理?Swoole 和 Go 都支持协程,它们的协程实现原理是不同的:Swoole原理:Swoole是一个基于 C++ 实现的 PHP 协程框架,通过底层的 epoll、reactor、worker 等技术实现协程的调度和事件驱动。在 Swoole 中,通过协程的方式可以实现超常规的并发处理。在 Swoole 中,协程是通过扩展了的 PHP 内核实现的,它底层依托于 epoll、reactor、worker 等技术对 PHP 协程进行调度。对于一个协程任务,Swoole 采用了状态机的设计方式,将任务的每个状态封装成一个函数,从而达到了对协程的全程控制。Go原理:Go语言内置支持协程,通过利用 Go 的调度器实现协程的调度。Go 语言实现中,使用的是基于 M:N 的调度器,其中,M 表示系统线程,N 表示用户级线程(协程),调度器会将多个协程与少量的线程绑定在一起。在 Go 中,协程的实现方式被称为 goroutine。Goroutine 根据需要动态增减系统线程,这使得 Goroutine 的调度能够更加灵活和高效。当一个 Goroutine 阻塞时,调度器会将其挂起,然后继续调度其他 Goroutine,从而提高 Goroutine 的执行效率。同时,Go 的调度器会将多个 Goroutine 绑定在一个 M 上,并将多个 M 绑定在多个系统线程上,这样可以有效提高性能。总体来说,Swoole 和 Go 的协程实现原理都是基于事件循环的原理,底层实现方式略有不同。二、swoole 协程需要注意的点?1、协程不能进行阻塞操作:协程的设计本意就是为了避免线程或进程阻塞,因此在协程中也不能进行阻塞操作,如网络操作应该使用异步非阻塞的方式。2、避免多次切换:协程切换的开销很小,但是多次切换会累加开销,影响性能。因此,应该尽量减少协程的切换。3、注意内存管理:协程之间共享内存空间,需要特别注意内存管理,避免出现内存泄漏等问题。4、禁止在协程内关闭 socket:因为协程之间共享 socket,如果在协程内关闭 socket,会导致其他协程无法继续使用该 socket,从而导致程序出现异常。5、不能使用全局变量:协程之间共享内存空间,如果使用全局变量,可能会导致同时访问全局变量时出现冲突。6、警惕死循环:协程的退出需要使用 co::exit 或者 return 语句,避免出现死循环等异常情况。7、依赖 Swoole 扩展:在使用 Swoole 协程的过程中,需要确保 Swoole 扩展已经正常安装和加载,否则会导致出现错误或无法使用。三、Swoole和Workerman的区别?1、Swoole是异步编程框架,而Workerman使用的是多进程编程。由于异步编程技术的高效性和稳定性,Swoole在性能和负载均衡方面具有明显的优势。2、在异步编程的情况下,Swoole的事件循环机制具有更好的性能和可扩展性,而Workerman的多进程方案可以充分利用多核处理器的性能。3、从代码设计的角度来看,Swoole提供了更多的API和功能,可以方便地实现高性能网络应用。Workerman的API更加简洁明了,更适合初学者。4、Swoole支持协程,可以充分利用CPU资源。workerman虽然在进程间可以共享数据,但是在进程间的内存共享上并不是很好。四、Swoole 协程之间多种方式进行通信?1、协程上下文2、Swoole 协程通讯 API:Swoole 提供了一些协程通信的 API,例如 chan,go 等,可以用于协程之间的任务分配和结果返回等。3、全局变量:Swoole 协程之间也可以通过 PHP 的全局变量进行数据交换,这需要确保变量不会被多个协程同时修改、访问,可以使用 Swoole 提供的 Lock、Condition 等工具来实现协程之间对共享变量的同步访问。4、Topic/Channel:类似于消息队列,Swoole 的 Topic/Channel 可以用于协程之间的消息发送和接收,可以分发异步任务,广播事件消息等。5、MySQL 等 I/O 操作的协程等待和唤醒机制:当使用 Swoole 协程进行 MySQL 等 I/O 操作时,可以使用 Swoole 协程提供的协程等待和唤醒机制,使得程序在等待 I/O 操作时可以立即切换到其它协程,提高程序的并发性能。五、PHP代码常见的优化方法?1、使用swoole等常驻内存的框架,使用协程、连接池提高并发2、减少数据库查询:尽量避免重复查询数据库,可以使用缓存技术,如 memcached、Redis 来存储查询结果。3、代码缓存:使用 APC(Alternative PHP Cache)、OPcache、XCache 等缓存工具可以大幅度提高 PHP 程序的性能。这种方法可以将编译后的 PHP 脚本缓存到内存中,以便下一次执行时能够直接读取。4、减少 HTTP 请求:合并 CSS、JavaScript,图片 CSS Sprites、延迟加载等方法可以减少 HTTP 请求,从而提高网页性能。5、减少代码重复:抽象出相同部分的代码,使其能够多次被调用。这样可以减少代码的重复性,增加 PHP 程序的速度。6、减少正则表达式的使用:正则表达式虽然很强大,但它的运行效率比较低,在 PHP程序中尽可能少使用正则表达式。7、避免过度加载:如果只需要使用一个函数,就不要加载整个类。只加载必要的 PHP 扩展。8、将 PHP 代码中的变量尽可能压缩在局部环境中,避免全局变量的使用。9、使用缓存的模板:Smarty 等缓存模板可以减少服务器的压力,提高页面的显示速度。10、使用高效的字符串函数:PHP 提供了很多高效的字符串处理函数,如 str_replace、substr、preg_match 等。使用这些函数可以提高 PHP 程序的速度。11、使用最新版本的 PHP:每一个新版本的 PHP 都有新的性能优化,使用最新版本的 PHP 能够大幅度提高 PHP 程序的运行速度。
2023年12月28日
7 阅读
0 评论
0 点赞
2023-12-28
php.ini 路径的查找获取方法
PHP配置文件 php.ini 路径的查找获取方法目的:查看当前 PHP 开启了哪些扩展模块笨方法 新建个目录,里面创建一个 index.php 文件,写上如下代码:<?php echo phpinfo();保存后,然后用 PHP 开启一个临时访问 web 端口:php -S localhost:2233用浏览器访问 localhost:2233 就能看到配置.推荐使用方法php -m这个命令能看到当前安装的扩展模块,快且直观:$ php -m [PHP Modules] bcmath bz2 calendar Core ctype curl date dba dom exif FFI ....php.ini 路径怎么找可以通过上面的 笨方法,直接在页面上查看到 php.ini 文件路径,但笨方法始终是笨方法.推荐使用 php --ini效果:$ php --ini Configuration File (php.ini) Path: /usr/local/etc/php/8.1 Loaded Configuration File: /usr/local/etc/php/8.1/php.ini Scan for additional .ini files in: /usr/local/etc/php/8.1/conf.d Additional .ini files parsed: /usr/local/etc/php/8.1/conf.d/ext-opcache.ini #或者使用linux的find # find / -name php.ini这样,就能知道 它的路径 /usr/local/etc/php/8.1/php.ini
2023年12月28日
9 阅读
0 评论
0 点赞
2023-12-28
PHP Base64 、Blob、File间的相互转换
PHP Base64 、Blob、File间的相互转换前言在获取时,遇到需要转换格式的情况,所以记录下来分享。正文一、格式的基本介绍Base64Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法举个例子BlobBlob 对象表示一个不可变、原始数据的类文件对象。它的数据可以按文本或二进制的格式进行读取,也可以转换成 ReadableStream来用于数据操作。举个例子File文件(File)接口提供有关文件的信息,并允许网页中的 JavaScript 访问其内容。 举个例子就不过多介绍了,主要来讲如果转换。二、如何判断这三种格式1.判断是否为Base64字符串// 判断是否为base64格式字符串 function isBase64(str) { //正则表达式判断 var reg = /^\s*data:([a-z]+\/[a-z0-9-+.]+(;[a-z-]+=[a-z0-9-]+)?)?(;base64)?,([a-z0-9!$&',()*+;=\-._~:@\/?%\s]*?)\s*$/i; return reg.test(str) //返回 true or false }2.判断是否为Blob对象console.log(data instanceof Blob) //ture or false3.判断是否为File对象console.log(data instanceof File && !data instanceof Blob) //ture or falsePS:Blob和File都用instanceof来判断是否为对应类型数据有一点需要注意,File对象也是Blob对象 ,因为File继承于Blob,所以其中的判断逻辑可以自己定义。三、格式之间的转换1.Base64转换为Filefunction dataURLtoFile(dataurl, filename) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new File([u8arr], filename, { type: mime }); }需要传两个参数,第一个是数据,第二个是自定义文件名字符串2.Base64转换为Blobfunction dataURLtoBlob(dataurl, filename) { var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1], bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n); while (n--) { u8arr[n] = bstr.charCodeAt(n); } return new Blob([u8arr], { type: mime }); }和转File基本一样,就最后一句return不一样3.Blob转Filefunction blobToFile(blob) { return new File([blob], 'screenshot.png', { type: 'image/jpeg' }) }这里和Base64转File其实用的都是new File()这个方法,上面的第二个参数是传进来的,这里是定死的,这个参数不是很重要,可以自行修改函数,方法都已经提供了,直接使用就可以。
2023年12月28日
8 阅读
0 评论
0 点赞
1
...
29
30
31
...
112