首页
网站导航
关于
Search
1
解决Typecho Joe主题访问fastly.jsdelivr.net速度慢的方案 | 快速优化技巧
2,252 阅读
2
解决WSL2内存不释放问题的最佳指南
1,529 阅读
3
如何在 Typecho Joe 主题的文章中增加目录
1,186 阅读
4
GO语言环境的搭建教程 - 完全指南
1,042 阅读
5
如何解决Win11电脑桌面上方显示横线问题 | 窗口11教程
1,028 阅读
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
登录
Search
标签搜索
重要
go基础
git 命令
go包
phpstorm
sublime
thinkphp6
mysql问题
软件分享
redis命令
php基础
thinkphp3.2
php第三扩展包
小蚯蚓博客
累计撰写
335
篇文章
累计收到
48
条评论
首页
栏目
默认分类
编程语言
GO语言
PHP
Node
javascript
html
rust
java
Css
Python
资源分享
chrome插件
阅读思考
运维架构
redis
Nginx
linux
memcached
mongodb
mysql
windows
docker
k8s
Mq
apache
CI
Git
swoole
elk
系统设计
thinkPhp
beego
页面
网站导航
关于
搜索到
44
篇与
的结果
2022-09-18
PHP7的改进和新特性:全面解析
性能的提升 可以分别通过php5.6和php7,对源码下的zend目录下的bench.php文件和micro_bench.php文件进行测试,会发现php7的执行速度明细的提高。 太空船的操作符 操作符号<=>就很像太空船,该操作符可可以用于快速的比较大小,不过感觉平时用的很少 echo 1 <=> 0; // 1,左边大于右边1 echo 1 <=> 1; // 0,左边等于右边0 echo 1 <=> 2; // -1,左边 标量类型申明 在团队合作的时候,我们经常想要说我们写的方法,需要调用者严格按照我们的规范来调用,避免一些问题,所以就需要对参数进行严格的限制 // 这个必须写,不然如果传入其它类型还是不会报错 declare(strict_types=1); $page = isset($_GET['page']) ? $_GET['page'] : 1; $page = $_GET['page'] ?? 1; null合并运算符
2022年09月18日
214 阅读
0 评论
0 点赞
2022-09-13
PHP如何返回空对象:前端一致性的关键
我们经常会返回json结果给前端,但是有时候没有值的是如果是以下写法的话,返回数据格式将不一致 $processRepairModel->materialRepairOrder ? [ 'id' => 1, ] : [], 如果$processRepairModel->materialRepairOrder有值的话,返回是json对象 { id: 1 } 如果$processRepairModel->materialRepairOrder没有值的话,返回是空数组 [] 为了确保$processRepairModel->materialRepairOrder没有值的时候返回一个空对象,可以改成 $processRepairModel->materialRepairOrder ? [ 'id' => 1, ] : new stdclass(),
2022年09月13日
285 阅读
0 评论
0 点赞
2022-08-19
PHP7 RabbitMQ扩展AMQP安装指南
安装rabbitmq-c库 php的rabbitmq的amqp.so扩展,在安装的需要依赖这个库,所以要先安装这个库(好像编译方式安装rabbitmq的时候,也要依赖这个库,不过前面我安装rabbitmq是直接通过下载二进制文件的方式安装,安装过程见https://www.xiaoqiuyinboke.cn/archives/334.html) 首先是github上下载最新的版本,githbub地址是:https://github.com/alanxz/rabbitmq-c/releases wget https://github.com/alanxz/rabbitmq-c/archive/refs/tags/v0.11.0.tar.gz 然后解压安装 tar -zxvf v0.11.0.tar.gz cd rabbitmq-c-0.11.0/ # 我这边rabbitmq和rabbitmq-c都安装在/usr/local/rabbitmq目录下 cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/rabbitmq/rabbitmqC make && make install 安装完成之后,需要复制一份lib目录,不然的话安装php扩展的时候,也会有问题 cd /usr/local/rabbitmq/rabbitmqC cp -R ./lib64 ./lib 至此,rabbitmq-c已经安装完成了 安装php ampq.so扩展 安装方式采用pecl的方式安装,去https://pecl.php.net/package/amqp网页,获取最新版本的下载地址 pecl install https://pecl.php.net/get/amqp-1.11.0.tgz 如果提示ERROR: unable to unpack /private/tmp/pear/download/amqp-1.11.0.tgz,则需要修改目录权限 chmod 777 -R /tmp/pear/download 然后继续执行pecl install https://pecl.php.net/get/amqp-1.11.0.tgz命令,等到出现[autodetect]出来的时候 输入rabbitmq-c 的安装目录即可。 顺利的话,应该就可以正常安装完成了 ::(哈哈)
2022年08月19日
264 阅读
0 评论
0 点赞
2022-08-02
PHP的Yield用法详细教程
基础特性 一个函数中有yield出现的话,这个函数就是生成器 function &gen_reference() { $value = 3; while ($value > 0) { yield $value; } // 如果省略则函数返回null return true; } var_dump(gen_reference()); // object(Generator)#1 (0) {} 既然是生成器,执行顺序就和生成器的顺序是一样的,如下下所示: // 使用引用生成值 function gen_reference() { $value = 3; while ($value > 0) { yield $value; $value -= 1; echo 2; } return 1; } $gen = gen_reference();// 初始化 // 执行gen_reference函数,直到阻塞在yield,然后这里继续往下执行,输出1 // foreach刚开始相当于调用这个方法 // 一开始调用rewind,valid,current,key,next方法都会开始执行函数里的内容 $gen->rewind(); echo 1; $gen->valid(); // 获取yield的值,gen_reference方法还是阻塞在yield $val1 = $gen->current(); // 多次调用current还是得到当前值,也就是3,,gen_reference方法还是阻塞在yield $val2 = $gen->current(); // 获取yield的key,gen_reference方法还是阻塞在yield $key1 = $gen->key(); // 多次调用key还是得到当前值,也就是0,gen_reference方法还是阻塞在yield $key2 = $gen->key(); $gen->next(); 也可以用foreach自动执行上述流程,方法前面要加& function &gen_reference() { $value = 3; while ($value > 0) { yield $value; } } // 引用的方式,会自动修改函数了的value值 foreach (gen_reference() as &$number) { echo (--$number).'... '; } 应用 读取大文件 可以使用迭代器读取超过10个G的大文件 function readTxt() { $handle = fopen("./test.txt", 'rb'); while (feof($handle) === false) { yield fgets($handle); } fclose($handle); } foreach (readTxt() as $key => $value) { sleep(1); echo $value; } 协程 和go的协程不一样的是,这个协程需要自己调度,并且不能并行执行,可以通过共享变量的方式进行通信 class Coroutine { /** * @param callable $callback * @return Generator */ public static function create(callable $callback): Generator { // 调用含有yield的函数,是返回Generator实例 return (function () use ($callback) { // 把各自的逻辑封装在闭包里,等待调用执行 yield $callback; })(); } /** * 分配各个生成器的执行 * @param array $cos * @throws Exception */ public static function run(array $cos) { $cnt = count($cos); while ($cnt > 0) { $loc = random_int(0, $cnt - 1); // 用 random 模拟调度策略。 // 取出指定的闭包,并且执行,其实这个跟自己在数组里定义闭包,然后随机执行某个数组元素的闭包是一样的 // 所以这种实现的方式,优势在哪里呢? // 应该是在于,如果yield后还有值的话,可以实现逻辑可以执行到一半的时候,将控制器返给主程序 $cos[$loc]->current()(); array_splice($cos, $loc, 1); $cnt--; } } } $co = new Coroutine(); $cos = []; for ($i = 1; $i <= 10; $i++) { // 初始化生成器 $cos[] = $co::create(function () use ($i) { echo "Co.{$i}.", PHP_EOL; }); } $co::run($cos); 生成大数组 function xrange($start,$limit) { for($i = $start;$i<=$limit;$i++){ yield $i; } } // 使用生成器,可以用于迭代 foreach (xrange(0,10) as $number) { echo $number; } // 这个会报错,不支持这样的方式 echo count(xrange(0,1000));
2022年08月02日
274 阅读
0 评论
0 点赞
2022-07-21
PHP 函数语法详解 | 全面学习编程指南
// function add(...$param) { print_r($param);// [1,2,3] } add(1, 2, 3); // function add($a, $b, $c) { echo $a, $b, $c;// 123 } $num = [1, 2, 3]; add(...$num);
2022年07月21日
236 阅读
0 评论
0 点赞
2022-07-21
PHP字符串处理教程和最佳实践 - 详解PHP编程
// 1.parse_str // 字符串解析 parse_str("page=1&limit=2", $result);// $result 结果 array([page] => 1,[limit] => 2) // 2.substr // 英文截取,第一个字符的位置是0 substr('abc',1,1);// b,从第2位置开始,截取一个 substr('abc',1);// bc,从第2位置开始,截取到后面 echo substr($d,0,strrpos($d,'-'));// 截取从后往前出现的第一个- // 3.mb_substr // 中文截取,参数同上 mb_substr('一二三',1,1);// 二 mb_substr('一二三',1);// 二三 random_bytes ( int $length ) : string // 随机字符串 // 字符串替换 str_replace(",",";","你好,世界"); // 把英文逗号替换成中文逗号
2022年07月21日
262 阅读
0 评论
0 点赞
2022-07-21
PHP CLI Bin目录脚本命令行操作指南
bin/php脚本 php -m // 查看所有扩展 php --ri swoole //查看某个扩展的信息 php -r "phpinfo();" // 运行代码 php -v // 查看版本 php index.php // 运行文件 bin/php-cgi php-cgi -b 127.0.0.1:9009 参数-b用于告诉PHP我们希望启动FastCGI服务。执行上述命令将会绑定PHP到127.0.0.1这个IP地址的9000端口上。至此,PHP便运行起来了
2022年07月21日
207 阅读
0 评论
0 点赞
2022-07-21
PHP数组使用深度解析和教程
// 1.array_filter // 返回过滤后的数组 $resArr = array_filter(["a"=>1,"b"=>2], function ($value) { return $value == 1;// 为true的将保留值 }); $resArr = array_filter(["a"=>1,"b"=>2], function ($value, $key) { return $value == 1 || $key == 'a';// 为true的将保留值 }, ARRAY_FILTER_USE_BOTH); $resArr = array_filter(["a"=>1,"b"=>false,"c"=>'']); // 2. array_walk // $originArr数组的元素应用回调,可以修改数组元素的值 $originArr = [1,2,3]; array_walk($originArr, function (&$value, $key, $userValue) { $value *= $userValue; }, 2); // 3.array_map,比较特殊,回调是第一个参数 // 返回映射结果 $returnRes = array_map(function ($value) { return $value * 2; }, [1,2,3]); // 4.array_reduce // 求1+2+3+4+5的和 // $carry是前一次的返回值,第一次的值是$init // $item是本次迭代的元素值 // 返回值是回调函数最后一次的返回值 $result = array_reduce([1, 2, 3, 4, 5], function($carry, $ele){ $carry += $ele; return $carry; },0); // 5. array_multisort // 二维数组排序 $arr = [ ['name' => 'a', 'score' => 98], ['name' => 'b', 'score' => 99], ['name' => 'c', 'score' => 96], ['name' => 'd', 'score' => 98], ]; foreach ($arr as $key => $row) { $score[$key] = $row['score']; $name[$key] = $row['name']; } // 参数1:一定是个要排序的数组 // 参数2:是排序顺序,可以省略 // 参数3:是排序规则,可以省略 // ...重复上面一套规则,后面的数组顺序跟随前面的那个数组的排序,如果值相同的话再按自身的排序规则来 $returnRes = array_multisort($score, SORT_DESC, $name, SORT_DESC, SORT_REGULAR, $arr); // 注意:排序后$arr,关联(string)键名保持不变,但数字键名会被重新索引 // 6. ksort,krsort排序 $arr = [ 0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd' ]; // 按key升序排序 ksort($arr); // 按key降序排序 krsort($arr); // 7.array_splice // 裁剪拼接 $input = ["red", "green", "blue", "yellow"]; // 需要裁剪的数组,必须赋值给变量后传入array_splice,因为是引用的方式 $replace = ['black']; // 替换裁剪的数组 // 将$input数组的第2个和第3个剪切掉,并且用black数组拼接上去 // 裁剪开始offset 1(这个不是key值,是顺序值),裁剪长度2,也就是green和blue元素 $return = array_splice($input, 1, 2, $replace); // 原来的是数组被裁剪替换["red", "black", "yellow"] print_r($input); // 返回剪掉的那部分数组["green", "blue"] print_r($return); // 8. array_column $arr = [ ['id'=>1,'name'=>'张三'] ]; array_column($arr , null, 'id');// [1 => ['id'=>1,'name'=>'张三']] array_column($arr , 'name', 'id'); // [1 => '张三'] // 9.array_search // 返回值的key $arr = [ 'one'=>'一', 'two'=>'二', ]; echo array_search('二',$arr); // two echo array_search('三',$arr); // false // 10.in_array in_array('012',[12]);//true in_array('012',[12],true);//false,文本类型的比较要用这个
2022年07月21日
180 阅读
0 评论
0 点赞
2022-07-19
PHP第三方时间处理包Carbon - 详细介绍和教程
基本使用 获取当前时间戳 Carbon::today()->timestamp; 当前时间,减掉60天的时间戳 Carbon::today()->subDays(60)->timestamp;
2022年07月19日
249 阅读
0 评论
0 点赞
2022-07-14
PHP项目排错技巧和策略 - 掌握PHP错误诊断的秘诀
nginx错误日志 首先从nginx的错误日志入手,查看nginx的错误日志配置文件,在nginx.conf文件里 error_log logs/error.log; 这里是相对于nginx里的安装目录,这个文件里可以查看一些服务器配置性的错误 php错误日志 因为很多时候,我们用的都是php的框架,除了语法错误这种很严重的,很多错误都会被框架给捕捉了,所以这里看的致命错误,查看php错误日志文件 display_errors = On error_reporting = E_ALL log_errors = On error_log = /usr/local/php7.4/var/log/php_errors.log error_log记录的就是php的错误文件的位置,这个目录php-fpm要有权限,不然无法记录 框架的日志 每个框架基本上都会捕捉一些非致命的错误,记录到日志文件里,所以一开始要对框架的日志缓存目录设置php-fpm的权限,然后查看里面的日志记录即可
2022年07月14日
218 阅读
0 评论
0 点赞
1
2
3
...
5