关于php:laravelsoar-在-Laravel-中轻松容易的优化-sql-语句的扩展包

laravel-soar - 在 Laravel 应用程序中轻松容易的优化 sql 语句的扩大包。 性能反对基于启发式算法的语句优化反对简单查问的多列索引优化(UPDATE, INSERT, DELETE, SELECT)反对 EXPLAIN 信息丰盛解读反对 SQL 指纹、压缩和丑化反对 Eloquent 查问构建器办法生成 SQL 优化报告源码链接https://github.com/guanguans/laravel-soar相干我的项目https://github.com/XiaoMi/soarhttps://github.com/guanguans/soar-phphttps://github.com/huangdijia/laravel-web-soarhttps://github.com/wilbur-yu/hyperf-soarhttps://github.com/guanguans/think-soar环境要求laravel >= 5.5装置$ composer require guanguans/laravel-soar --dev -vvv公布服务$ php artisan vendor:publish --provider="Guanguans\\LaravelSoar\\SoarServiceProvider"应用生成 sql 评分报告示例use App\Models\Member; Member::query() ->select([ 'id', 'nickname', ]) ->where('id', 100) // ->toSoarScore() // ->dumpSoarScore() ->ddSoarScore(); // 查问构建器应用示例DB::table('yb_member') ->select('*') ->join('yb_member_account as yb_member_account', 'yb_member_account.member_id', '=', 'yb_member.id') ->whereRaw('1 <> 1') ->where('yb_member.nickname', 'like', 'admin') ->where('yb_member.username', 'like', '%admin%') ->whereRaw("substring(yb_member.username, 1, 5) = 'admin'") ->whereIn('yb_member.id', [110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120]) ->orWhereNotNull('yb_member.realname') ->groupByRaw("yb_member.status, '100'") ->having('yb_member.id', '>', '100') ->inRandomOrder() // ->toSoarScore() // 生成 sql 评分报告 // ->dumpSoarScore() // 打印 sql 评分报告 ->ddSoarScore() // 打印 sql 评分报告,并且退出应用程序。; ...

June 15, 2021 · 2 min · jiezi

关于php:面向祖传代码-Debug我挽回了一位准备跑路的程序员

交换群的格调忽然骤变,没有了来日的灌水扯淡,竟然聊起了技术。 看了大家的全副的聊天记录,发现问题并没解决。群里难得这么多人聊技术,抱着问答一直,必有回响的准则,被动勾结一起看看是什么问题。 大略理解其问题是这样,apache 子过程始终异样退出 $ sudo tail -f /var/log/httpd/error_log[Sun Jun 13 19:32:25.660349 2021] [core:notice] [pid 23340] AH00052: child pid 20605 exit signal Bus error (7)[Sun Jun 13 19:32:25.660413 2021] [core:notice] [pid 23340] AH00052: child pid 20606 exit signal Bus error (7)[Sun Jun 13 19:35:39.862368 2021] [core:notice] [pid 23340] AH00052: child pid 21332 exit signal Bus error (7)[Sun Jun 13 19:35:50.872363 2021] [core:notice] [pid 23340] AH00052: child pid 21369 exit signal Bus error (7)[Sun Jun 13 19:39:43.079650 2021] [core:notice] [pid 23340] AH00052: child pid 18595 exit signal Bus error (7)[Sun Jun 13 19:42:08.210353 2021] [core:notice] [pid 23340] AH00052: child pid 21348 exit signal Bus error (7)[Sun Jun 13 19:42:16.221076 2021] [core:notice] [pid 23340] AH00052: child pid 21331 exit signal Bus error (7)[Sun Jun 13 19:42:16.221177 2021] [core:notice] [pid 23340] AH00052: child pid 23156 exit signal Bus error (7)[Sun Jun 13 19:44:11.329344 2021] [core:notice] [pid 23340] AH00052: child pid 27824 exit signal Bus error (7)现场复现理解到其架构是 apache + php ,群友也是长期承受的祖传代码,我的项目也不是很分明。能够应用strace来看看,背地到底是什么问题 ...

June 15, 2021 · 3 min · jiezi

关于php:多商户一台服务器部署两套多商户修改说明

1.config/swoole.php文件 批改 port端口号,每一套代码不能反复 2.根目录.env文件音讯队列应用这个命令:php think queue:listen --queue=default(注:default 是自定义后的队列名称) 留神:每一套代码都须要用这个命令开启队列 3.config/app.php 批改 app_key,能够批改为任意值. 每一套代码不能反复 改完重启swoole服务 如果以上文章对您有帮忙,请给咱们的开源我的项目点点star:github.crmeb.net/u/defu不胜感激!

June 15, 2021 · 1 min · jiezi

关于php:PHP中的PDO对象操作学习一初始化PDO及原始SQL语句操作

PDO 曾经是 PHP 中操作数据库事实上的规范。包含当初的框架和各种类库,都是以 PDO 作为数据库的连贯形式。基本上只有咱们本人在写简略的测试代码或者小的性能时会应用 mysqli 来操作数据库。留神,一般的 mysql 扩大曾经过期了哦! PDO 实例首先来看看一个 PDO 实例是如何初始化的。 $dns = 'mysql:host=localhost;dbname=blog_test;port=3306;charset=utf8';$pdo = new PDO($dns, 'root', '');一般状况下,咱们间接实例化的时候传递结构参数就能够取得一个 PDO 对象。这样,咱们就和数据库建设了连贯。如果连贯失败,也就是参数写得有问题的时候,在实例化时间接就会报异样。 PDO 对象的参数包含 DNS 信息、用户名、明码,另外还有一个参数就是能够设置 PDO 连贯的一些属性,咱们将在前面看到它的应用。 dns 参数PDO 结构参数的第一个参数是一个 DNS 字符串。在这个字符串中应用分号 ; 分隔不同的参数内容。它外面能够定义的内容包含: DSN prefix,也就是咱们要连贯的数据库类型,MySQL 数据库个别都是间接应用 mysql: 这样来定义即可。host,连贯的地址,在这里咱们连贯的是本地数据库 localhostport,端口号,MySQL 默认为 3306 ,能够不写dbname,要连贯的数据库名称unix_socket,能够指定 MySQL 的 Unix Socket 文件charset,连贯的字符集咱们能够通过一个函数来查看以后 PHP 环境中所反对的数据库扩大都有哪些: print_r(PDO::getAvailableDrivers());exit;// Array// (// [0] => dblib// [1] => mysql// [2] => odbc// [3] => pgsql// [4] => sqlite// )PDO 对象属性PDO 结构参数的最初一个参数能够设置连贯的一些属性,如: ...

June 15, 2021 · 4 min · jiezi

关于php:PHP中的数组分页实现非数据库

在日常开发的业务环境中,咱们个别都会应用 MySQL 语句来实现分页的性能。然而,往往也有些数据并不多,或者只是获取 PHP 中定义的一些数组数据时须要分页的性能。这时,咱们其实不须要每次都去查询数据库,能够在一次查问中把所有的数据取出来,而后在 PHP 的代码层面进行分页性能的实现。明天,咱们就来学习一下能够实现这个能力的一些函数技巧。 首先,咱们还是筹备好测试数据。 $data = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',];// $p = $_GET['p'];$p = 2;$currentPage = $p <= 1 ? 0 : $p - 1;$pageSize = 3;$offset = $currentPage * $pageSize;假如 \$data 就是从数据库中取出的全副数据,或者就是咱们写死在 PHP 代码中的数据。而后咱们设定 $p 为接管到的申请参数,以后拜访的是第二页。$currentPage 是用于查问偏移量的修改,在代码开发的世界中,下标索引都是从0开始的,所以咱们须要对接管到的参数进行减一的操作。当然,你也能够设定前端传递的参数就是以 0 为第一页的。这个就不多解释了,置信大家只有正式的学习或者参加过开发我的项目都会明确它的意思。 而后咱们定义了以后页面所显示的信息条数 $pageSize ,也就是只获取 3 条数据。最初,咱们计算了一下偏移量,也就是相似于 MySQL 的 LIMIT 中的那个参数。它的作用就是通知咱们从第几条开始查问,而后配合 $pageSize 查问几条。这样咱们就能够取得当前页面对应的数据了。(貌似把分页的原理都讲了一下) array_slice第一个也是最根底和最常见的分页形式,就是应用 array_slice() 函数来实现。它的作用是从数组中截取出一段内容来并返回这段内容的数组。 var_dump(array_slice($data, $offset, $pageSize));// array(3) {// [0]=>// string(1) "D"// [1]=>// string(1) "E"// [2]=>// string(1) "F"// }array_slice() 函数须要三个参数,第二个参数就是偏移量,第三个参数是查问几条数据。其中,第三个参数是可选的,不填的话就会把以后设定的偏移量之后的数据全副显示进去。是不是和咱们的 MySQL 查问语句截然不同。没错,他们自身就是相似的操作。 ...

June 14, 2021 · 2 min · jiezi

关于php:PHP中操作数据库的预处理语句

明天这篇文章的内容其实也是十分根底的内容,不过在现代化的开发中,大家都应用框架,曾经很少人会去本人封装或者常常写底层的数据库操作代码了。所以这回咱们就来温习一下数据库中相干扩大中的预处理语句内容。 什么是预处理语句?预处理语句,能够把它看作是想要运行的 SQL 语句的一种编译过的模板,它能够应用变量参数进行管制。预处理语句能够带来两大益处: 查问仅需解析(或预处理)一次,但能够用雷同或不同的参数执行屡次。当查问筹备好后,数据库将剖析、编译和优化执行该查问的打算。对于简单的查问,此过程要花费较长的工夫,如果须要以不同参数多次重复雷同的查问,那么该过程将大大降低应用程序的速度。通过应用预处理语句,能够防止反复剖析/编译/优化周期。简言之,预处理语句占用更少的资源,因此运行得更快。提供给预处理语句的参数不须要用引号括起来,驱动程序会主动解决。如果应用程序只应用预处理语句,能够确保不会产生SQL 注入。(然而,如果查问的其余局部是由未本义的输出来构建的,则仍存在 SQL 注入的危险)。上述内容是摘自官网文档的阐明,但其实预处理语句带给咱们最直观的益处就是可能无效地预防 SQL 注入。对于 SQL 注入的内容咱们未来在学习 MySQL 的时候再进行深刻的学习,这里就不过多地介绍了,反正预处理语句就是能够实现这项工作就好了。 PDO 操作预处理语句在 PHP 的扩大中,PDO 曾经是支流的外围数据库扩大库,天然它对预处理语句的反对也是十分全面的。 $pdo = new PDO('mysql:host=localhost;port=3306;dbname=blog_test', 'root', '');$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);// :xxx 占位符$stmt = $pdo->prepare("insert into zyblog_test_user (username, password, salt) values (:username, :password, :salt)");$stmt->bindParam(':username', $username);$stmt->bindParam(':password', $password);$stmt->bindParam(':salt', $salt);$username = 'one';$password = '123123';$salt = 'aaa';$stmt->execute();$username = 'two';$password = '123123';$salt = 'bbb';$stmt->execute();在代码中,咱们应用 prepare() 办法定义预处理语句,这个办法会返回一个 PDOStatement 对象。在预处理的语句内应用 :xxx 这样的占位符号,并在内部应用 PDOStatement 对象的 bindParam() 办法为这些占位符绑定上变量。最初通过 execute() 来真正地执行 SQL 语句。 从这段代码中,咱们就能够看到预处理语句的两大劣势的体现。首先是占位符,应用占位符之后,咱们就不必在 SQL 语句中去写单引号,单引号往往就是 SQL 注入的次要破绽起源。bindParam() 办法会主动地转换绑定数据的类型。当然,bindParam() 办法也能够在可选的参数中指定绑定的数据类型,这样就能让咱们的代码更加平安了,大家能够查阅相干的文档。 ...

June 13, 2021 · 1 min · jiezi

关于php:php-实现一个简单的图片边缘检测

一个简略的图片边缘检测办法大抵步骤: 缩放图片 提高效率图片灰度化依据亮度计算边缘第三步是最要害的,办法很多 这里采纳的间接比照相邻的亮度。 应用办法: 装置composer require lizhichao/one-img应用$img_path = '1.jpg';$img = new \OneImg\Border();$img->setImg($img_path) ->scale(300, 300) ->outline() ->save(); //输入到浏览器成果 代码仓库https://github.com/lizhichao/doImg 我的其余仓库 欢送star一个极简高性能php框架,反对swoole | php-fpm 环境clickhouse tcp 客户端中文分词nsq客户端

June 11, 2021 · 1 min · jiezi

关于php:PHP的Sodium加密扩展函数了解

这是本次加密扩大系列的最初一篇文章,也是咱们要学习理解的最初一个 PHP 加密扩大。Sodium 呈现的目标也是为了代替 Mcrypt 这个原来的加密扩大。在 PHP7.2 之后,Mcrypt 曾经被移除,在 PHP7.1 时就曾经被标记为过期。不过,Sodium 扩大的利用也并不是很多,大部分状况下咱们都会应用 OpenSSL 来进行加密操作,同时,Sodium 扩大提供的函数也十分多,所以,咱们这篇文章只做理解即可。当然,最次要的是,对于这个扩大即便是官网文档也没有欠缺,大部分函数的参数阐明都没有,搜寻进去的材料也是非常少。 Sodium 扩大在 PHP7.2 后是追随 PHP 源码一起公布的,只须要在编译的时候加上 --with-sodium 即可装置胜利。如果是 PHP7.2 之前的版本,须要独自装置这个扩大。同时,操作系统中也须要装置 libsodium-devel 库。 AEAD_AES_256_GCM 加解密首先是这个 AEAD_AES_256_GCM 加解密能力函数的利用。在微信领取相干的开发中,有一个接口就是应用的这种形式进行数据加密,在官网文档中,也提供了 PHP 对应的解密形式,其中应用的就是 Sodium 扩大库中的函数。(见文末参考文档中第二条链接) $data = '测试加密'; // 原始数据$nonce = random_bytes(SODIUM_CRYPTO_AEAD_AES256GCM_NPUBBYTES); // 加密证书的随机串,加密证书的随机串$ad = 'fullstackpm'; // 加密证书的随机串$kengen = sodium_crypto_aead_aes256gcm_keygen(); // 密钥// 是否可用echo sodium_crypto_aead_aes256gcm_is_available(), PHP_EOL; // 1// 加密$pem = sodium_crypto_aead_aes256gcm_encrypt($data, $ad, $nonce, $kengen);var_dump($pem);// string(28) "��VRw!�����f��l�O�tV=\x�"// 解密$v = sodium_crypto_aead_aes256gcm_decrypt($pem, $ad, $nonce, $kengen);var_dump($v);// string(12) "测试加密"代码中的正文曾经具体阐明了相干函数及参数。在微信领取中应用这个来解密时,ad、key、nonce 等都是由微信提供过去的,而咱们这里做为演示,都是本人生成的内容。 ...

June 11, 2021 · 1 min · jiezi

关于php:服务器上PHP安装配置问题与解决方法未完待续

采纳源码的形式装置PHP,在编译(./configure ....)时往往会遇到各种各样的报错和提醒,整顿一些可能会遇到的装置问题和相干解决办法,继续更新 1. Please reinstall the libzip distribution参考资料https://www.cnblogs.com/gyfluck/p/10478386.html降级Cmake,以后服务器的cmake版本较低,须要重新安装最高版本以后cmake是最新版本间接跳过此步骤 # 删除以后已装置yum remove cmake# 下载wget https://cmake.org/files/v3.14/cmake-3.14.5.tar.gz# 解压缩tar zxvf cmake-3.14.5.tar.gz# 配置./configure --prefix=/usr/local/cmake# 装置 make && make install # 创立链接 ln -s /usr/local/cmake/bin/cmake /usr/bin/cmake # 查看版本 cmake -version装置最新版本的libzip # 删除旧版本yum remove libzip libzip-devel# 下载新版本curl https://libzip.org/download/libzip-1.5.1.tar.gz# 解压到当前目录tar -zxvf libzip-1.5.1.tar.gz# 配置 & 装置cd libzip-1.5.1mkdir buildcd buildcmake ..make && make install2. off_t undefined; check your library configuration参考资讯https://blog.csdn.net/github_38336924/article/details/88898655第一步 echo '/usr/local/lib64/usr/local/lib/usr/lib/usr/lib64'>>/etc/ld.so.conf第二步 ldconfig -v3. unrecognized options: –with-mcrypt, –enable-gd-native-ttf参考资料https://www.qinziheng.com/php/4869.htm将以上两个编译选项删除 4. unrecognized options: --with-mysql参考资料https://blog.csdn.net/zhou75771217/article/details/83303058php7版本不反对mysql模块改用--with-pdo-mysql ...

June 10, 2021 · 1 min · jiezi

关于php:ThinkPHP框架实现的邮箱激活功能示例

本文实例讲述了ThinkPHP框架实现的邮箱激活性能。分享给大家供大家参考,具体如下: 配置框架采纳ThinkPHP3.1框架,如下所示: 配置过程图: 1.批改配置如下: <?phpreturn array( //'配置项'=>'配置值' 'MAIL_ADDRESS'=>'shcg666@sohu.com', // 邮箱地址'MAIL_SMTP'=>'smtp.sohu.com', // 邮箱SMTP服务器'MAIL_LOGINNAME'=>'shcg666@sohu.com', // 邮箱登录帐号'MAIL_PASSWORD'=>'******', // 邮箱明码);2.在性能外面减少一个类 <?phpclass EmailAction extends Action{ /* microtime() 函数返回以后 Unix 工夫戳和微秒数。mt_srand() 收获 Mersenne Twister 随机数生成器。从 PHP 4.2.0 版开始,seed 参数变为可选项,当该项为空时,会被设为随时数。正文:自 PHP 4.2.0 起,不再须要用 srand() 或 mt_srand() 函数给随机数发生器收获,现已主动实现。pow — 指数表达式 */ //random()这个函数是我用来生成一个随机数的,$numeric = 0生成一个6位的大小写字母与数字混合的字符串。$numeric = 1生成一个6位数字的字符串 public function random($length = 6 , $numeric = 0) { PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000); if($numeric) {$hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1)); } else {$hash = '';$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';$max = strlen($chars) - 1;for($i = 0; $i < $length; $i++) { $hash .= $chars[mt_rand(0, $max)];} } return $hash; } //发送邮件的办法 public function index(){//生成6位激活码$random = $this->random(6,0);//获取本网站的域名,域名在config外面配置下.//例如'domain' => 'http://write.blog.csdn.net',$domain = C('domain');//生成激活码模块地址$url = $domain.U("Home/Email/activate")."/?yam=$random";//将邮件地址和随机数放入sessionsession("shcg666@sohu.com","$random");//发送邮件SendMail("shcg666@sohu.com","这是邮件题目","将此网址复制到浏览框$url"); }}function SendMail($address,$title,$message){ //引入文件 vendor('PHPMailer.class#PHPMailer'); require("phpmailer/class.phpmailer.php"); require("phpmailer/class.smtp.php"); //实例化邮件类 $mail=new PHPMailer(); // 设置PHPMailer应用SMTP服务器发送Email $mail->IsSMTP(); // 设置邮件的字符编码,若不指定,则为'UTF-8' $mail->CharSet='UTF-8'; // 增加收件人地址,能够屡次应用来增加多个收件人 $mail->AddAddress($address); // 设置邮件注释 $mail->Body=$message; // 设置邮件头的From字段。//发件人 $mail->From=C('MAIL_ADDRESS'); // 设置发件人名字 $mail->FromName='LilyRecruit'; // 设置邮件题目 $mail->Subject=$title; // 设置SMTP服务器。 $mail->Host=C('MAIL_SMTP'); // 设置为"须要验证" $mail->SMTPAuth=true; // 设置用户名和明码。 $mail->Username=C('MAIL_LOGINNAME'); $mail->Password=C('MAIL_PASSWORD'); // 发送邮件。 return($mail->Send());}3.导入的文件 ...

June 10, 2021 · 1 min · jiezi

关于php:记-Laravel-数据库迁移功能的坑

明天用到 Laravel 数据库迁徙性能,因自己是强迫症处女座所以喜爱本人命名文件例如: 然而在执行迁徙的时候报错: 通过几轮尝试发现 Laravel 对迁徙文件的 文件名命名格局 是有固定的解析的,所以当我文件名齐全依照它的格调去写的时候就失常运行了 当然类名也必须对立: 吐槽的点在于:文档中并没有提及文件名称命名格调的强制要求 故明天记录下此小坑总的来说齐全依照框架文档的规定来就会一帆风顺,可是做我的项目遇到框架默认性能无奈满足需要的状况是十分失常的

June 10, 2021 · 1 min · jiezi

关于php:PHP的DBA扩展学习

明天咱们讲的 DBA 并不是传统的数据库管理员那个 DBA ,而是一个 PHP 中的巴克利格调数据库的扩大。巴克利格调数据库其实就是咱们常说的键值对模式的 K/V 数据库。就像咱们平时用得十分多的 memcached 或者 redis 那样,只是一个键和一个值对应,不过 memcached 它们次要是存储在内存中,而 DBA 扩大则是将数据存储在文件中,就像一个简略的键值对模式的 SQLite 一样。 DBA 扩大所应用的数据库类型根本都是开源的,部署公布都很简略,就是一个 db 文件,所以说它和 SQLite 很类似。不过毛病就是,它会一次性将这个数据库文件加载到内存中,咱们不能让这个数据库太大,否则就会撑爆内存。DBA 数据库都是和程序在一起的,所以它并没有网络相干的接口,咱们个别也只会在代码本地应用这种数据库。 在装置的时候,咱们须要在编译时减少 --enable-dba=shared 配置,而后还要减少一个 --enable-XXXX 配置,XXXX 指的就是咱们要应用的巴克利格调数据库的类型,比拟常见的有 dbm 、 ndbm 、 gdbm 、 db2 等等。同样的,操作系统也须要装置相干的这些软件,比方咱们零碎装置的就是 gdbm ,须要应用 yum install 来进行装置。 一个简略的例子首先还是通过代码来看一下,咱们的 DBA 数据库是如何应用的. // 关上一个数据库文件$id = dba_open("/tmp/test.db", "n", "gdbm");//$id = dba_popen("/tmp/test1.db", "c", "gdbm");// 增加或替换一个内容dba_replace("key1", "This is an example!", $id);// 如果内容存在if(dba_exists("key1", $id)){ // 读取内容 echo dba_fetch("key1", $id), PHP_EOL; // This is an example!}dba_close($id);首先是应用 dba_open() 来关上一个数据库文件,第一个参数是数据库文件的门路,第二个参数是打开方式,包含 r 、 w 、 c 、 n ,r 示意只读,w 示意读写,c 示意创立加读写,n 示意如果没有就创立并能够读写。第三个参数就是指定的数据库类型,咱们的零碎中只装置了 gdbm 库,所以咱们应用的就是 gdbm 作为参数。和 mysql 一样,咱们也能够应用 dba_popen() 来关上一个数据文件的长久链接。 ...

June 10, 2021 · 2 min · jiezi

关于php:一文快速搭建Python-环境入门

环境治理centos装置python wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgztar -zxvf Python-3.5.1.tgzmv Python-3.5.1 /usr/localrm -rf /usr/bin/python 删除本来的python2.6软链接./configure && make install 编译和装置ln -s /usr/local/bin/python3.5 /usr/bin/python 创立3.5的软链接降级pip python3 -m pip install -- upgrade pip装置库指定源 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.ed...装置独立环境 pip install --user virtualenv 或者应用 python3 -m pip freeze | grep pyspider可执行模块 python3 -m scrapy装置virtualenv 增强版 pip install --user virtualenvwrapper export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3 mdfind virtualenvwrapper.sh echo "source ~/Library/Python/3.8/bin/virtualenvwrapper.sh" >> ~/.zshrc source ~/.zshrc 创立独立环境 -a 能够指定目录 进入环境后能够间接跳转到目录 --python 指定版本 mkvirtualenv craw -a /Users/smallshaxiaoche/Desktop/project/python_pro/craw_querylist --python=python3.8列出虚拟环境列表 ...

June 9, 2021 · 1 min · jiezi

关于php:宝塔-自动更新代码代码脚本

#!/bin/bashecho ""# 输入以后工夫date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"echo "Start"# git我的项目门路gitPath="/www/wwwroot/pdr"# git 网址gitHttp="git@git.dev.tencent.com:Fonhua-Team/pdr.git"echo "Web站点门路:$gitPath"# 判断我的项目门路是否存在if [ -d "$gitPath" ]; then cd $gitPath # 判断是否存在git目录 if [ ! -d ".git" ]; then echo "在该目录下克隆 git" git clone $gitHttp gittemp mv gittemp/.git . rm -rf gittemp fi # 拉取最新的我的项目文件 git reset --hard origin/master git pull # 设置目录权限 chown -R www:www $gitPath echo "End" exitelse echo "该我的项目门路不存在" echo "End" exitfi

June 9, 2021 · 1 min · jiezi

关于php:YII2项目几个常用技能知识总结

1、不通过日志获取AR执行的原生SQL语句和打印变量数据$query = User::find() ->select(['username'])->where(['id'=>[1,2,3,4])// get the AR raw sql in YII2$commandQuery = clone $query;echo $commandQuery->createCommand()->getRawSql();$users = $query->all(); 打印变量数据能够这样写://援用命名空间use yii\helpers\VarDumper;//应用VarDumper::dump($var);//应用2 第二个参数是数组的深度 第三个参数是是否显示代码高亮(默认不显示)VarDumper::dump($var, 10 ,true); 2、从数据库二维数组中返回一维数组并配合rules验证规定实现分类数据过滤。 一般返回表记录的二维数组 Member::find()->select('userid')->asArray()->all(); Array( [0] => Array ( [userid] => 1 )[1] => Array ( [userid] => 2 )[2] => Array ( [userid] => 3 )) 返回字段的一维数组 Member::find()->select('userid')->asArray()->column(); 或者: \yii\helpers\ArrayHelper::getColumn(Member::find()->all(), 'userid') Array( [0] => 1[1] => 2[2] => 3) 返回一维数组配合验证规定验证数据正确性,如分类catid正确分为只有1-4,然而在devTools关上批改catid为5,提交同样会到数据库,此时rules验证规定如下: ['catid', 'in', 'range' => category::find()->select('id')->asArray()->column()], 当然,这个也能够通过上面这样子写,一样的: ...

June 9, 2021 · 3 min · jiezi

关于php:PDO操作大数据对象

个别在数据库中,咱们保留的都只是 int 、 varchar 类型的数据,一是因为古代的关系型数据库对于这些内容会有很多的优化,二是大部分的索引也无奈施加在内容过多的字段上,比如说 text 类型的字段就很不适宜创立索引。所以,咱们在应用数据库时,很少会向数据库中存储很大的内容字段。然而,MySQL 其实也为咱们筹备了这种类型的存储,只是咱们平时用得不多而已。明天咱们就来学习理解一下应用 PDO 如何操作 MySQL 中的大数据对象。 什么是大数据对象“大”通常意味着“大概 4kb 或以上”,只管某些数据库在数据达到“大”之前能够轻松地解决多达 32kb 的数据。大对象实质上可能是文本或二进制模式的,咱们在 PDOStatement::bindParam() 或 PDOStatement::bindColumn() 调用中应用 PDO::PARAM_LOB 类型码能够让 PDO 应用大数据类型。PDO::PARAM_LOB 通知 PDO 作为流来映射数据,以便能应用 PHP Streams API 来操作。 对于 MySQL 来说,将字段类型设置为 blob 即是大对象格局的字段。而在 bindParam() 或 bindColumn() 时,指定字段的参数为 PDO::PARAM_LOB 类型,就能够间接以句柄模式取得这个对象外面的内容,就像 fopen() 一样地持续对它进行操作。 CREATE TABLE `zy_blob` ( `id` int(11) NOT NULL AUTO_INCREMENT, `attach` longblob, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;这是咱们测试用的一个数据表,将 attach 字段设置为了 longblob 类型,也就是比拟大的 blob 类型,这样咱们就能够存储更多地信息。毕竟当初的图片或文件随随便便就是轻松地几m或几十m起步的,咱们间接应用最大的 blob 类型来进行简略地测试。tinyblob 的大小为 255 字节,blob 类型的大小为 65k ,mediumblob 为 16M ,longblob 为 4G 。 ...

June 9, 2021 · 1 min · jiezi

关于php:EasyWechat4x源码分析

EasyWechat源码剖析一、组件目录src├─BasicService 根底服务│ ├─... ...│ ├─Application.php 根底服务入口├─... 两头都是一些与根底服务雷同目录构造构造的服务,比方小程序服务、开放平台服务等等├─OfficialAccount 公众号│ ├─Auth│ │ ├─AccessToken 获取公众号AccessToken类│ │ ├─ServiceProvider 容器类 │ ├─Application.php 公众号入口├─Kernel 外围类库以公众号服务为例对EasyWechat源码剖析 二、EasyWeChat\Factory类源码剖析<?phpnamespace EasyWeChat;class Factory{ public static function make($name, array $config) { $namespace = Kernel\Support\Str::studly($name); $application = "\\EasyWeChat\\{$namespace}\\Application"; return new $application($config); } public static function __callStatic($name, $arguments) { return self::make($name, ...$arguments); }}应用组件公众号服务 <?phpuse EasyWeChat\Factory;$config = [ ...];$app = Factory::officialAccount($config);此操作相当于 $app=new EasyWeChat\OfficialAccount\Application($config) 实例化过程: 调用EasyWeChat\Factory类的静态方法officialAccount,因为EasyWeChat\Factory类不存在静态方法officialAccount所以调用了__callStatic,此时的name为officialAccount;__callStatic办法中调用了EasyWeChat\Factory类的make办法;meke办法返回了new $application($config)三、EasyWeChat\OfficialAccount\Application类源码剖析<?phpnamespace EasyWeChat\OfficialAccount;use EasyWeChat\BasicService;use EasyWeChat\Kernel\ServiceContainer;class Application extends ServiceContainer{ protected $providers = [ Auth\ServiceProvider::class, ... BasicService\Jssdk\ServiceProvider::class, ];}操作:$app=new EasyWeChat\OfficialAccount\Application($config),此时的EasyWeChat\OfficialAccount\Application 类中并没有构造函数,然而继承了EasyWeChat\Kernel\ServiceContainer,咱们去看EasyWeChat\Kernel\ServiceContainer源码。 ...

June 8, 2021 · 4 min · jiezi

关于php:一个php文件实现企业微信推送通知企业微信实现发送应用消息推送通知到微信

摘要家喻户晓,服务号是具备模板音讯的接口的,能够被动向用户推送告诉音讯,但前段时间,微信团队开始向开发者告诉模板音讯行将调整为订阅音讯,即用户承受订阅,能力收到推送恰好企业微信没有做扭转,则咱们能够通过企业微信实现接管告诉。 配置步骤1、注册企业微信,集体也能够注册2、注册后,登陆企业微信,欠缺根本信息3、点击利用治理->自建->创立利用 4、创立胜利后,简略批改下本人的材料5、获取企业ID和Secret 企业ID在我的企业能够获取 利用Secret在你创立的利用处能够查看 开发依据企业微信API申请流程可知,要想调用企业微信API,先取得access_token并缓存,因为每天的调用次数无限,access_token有效期为2小时,所以要进行缓存。而后再调用业务API,实现你申请的接口。 我这里用单页面实现整个过程(获取access_token,缓存access_token,发送推送) <?php// 申明页面headerheader("Content-type:text/html;charset=utf-8");// 获取access_tokenfunction getToken(){ // 定义id和secret $corpid='你的企业微信企业ID'; $corpsecret='你的企业微信secret'; // 读取access_token include './access_token.php'; // 判断是否过期 if (time() > $access_token['expires']){ // 如果曾经过期就得从新获取并缓存 $access_token = array(); $access_token['access_token'] = getNewToken($corpid,$corpsecret); $access_token['expires']=time()+7000; // 将数组写入php文件 $arr = '<?php'.PHP_EOL.'$access_token = '.var_export($access_token,true).';'.PHP_EOL.'?>'; $arrfile = fopen("./access_token.php","w"); fwrite($arrfile,$arr); fclose($arrfile); // 返回以后的access_token return $access_token['access_token']; }else{ // 如果没有过期就间接读取缓存文件 return $access_token['access_token']; }}// 获取新的access_tokenfunction getNewToken($corpid,$corpsecret){ $url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={$corpid}&corpsecret={$corpsecret}"; $access_token_Arr = https_request($url); return $access_token_Arr['access_token'];}// curl申请函数function https_request ($url){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $out = curl_exec($ch); curl_close($ch); return json_decode($out,true);}// 发送利用音讯函数function send($data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token='.getToken()); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); return curl_exec($ch);}// 文本卡片音讯体$postdata = array( 'touser' => '@all', 'msgtype' => 'textcard', 'agentid' => '1000002', 'textcard' => array( 'title' => '测试卡片的题目', 'description' => '测试卡片的形容', 'url' => 'http://www.qq.com', 'btntxt' => '浏览全文', ), 'enable_id_trans' => 0, 'enable_duplicate_check' => 0, 'duplicate_check_interval' => 1800);// 调用发送函数echo send(json_encode($postdata));?>上方的代码间接拜访即可实现推送。 ...

June 8, 2021 · 1 min · jiezi

关于php:Swoole-v47-版本新特性预览之-Cocancel

置信之前就有很多用户想要一个勾销协程的 API,迟迟没有增加进来,当初在 v4.7 版本中进行了增加: 具体实现见:#4247 ,#4249 新增 API & 常量新增了两个 API,别离为 Co::cancel($cid): bool用于勾销某个协程,但不能对以后协程发动勾销操作和 Co::isCanceled(): bool用于判断以后协程是不是被勾销的新增了三个错误码: 常量含意SWOOLE_ERROR_CO_CANNOT_CANCEL协程不能取消SWOOLE_ERROR_CO_NOT_EXISTS协程不存在SWOOLE_ERROR_CO_CANCELED协程已被勾销阐明该 API 用于从一个协程或者事件回调中勾销另外一个协程。 只有处于可勾销操作中的协程能力被勾销, 当胜利勾销一个协程时, 上下文环境将会立刻切换到对应协程中 尝试勾销一个处于不可勾销操作中的协程, Co::cancel()胜利时返回 true,失败将会返回false, 此时调用swoole_last_error(),可能有两种状况: 协程不存在 SWOOLE_ERROR_CO_NOT_EXISTS协程处于不可勾销的状态 SWOOLE_ERROR_CO_CANNOT_CANCEL能够通过Co::isCanceled()来判断以后操作是否是被手动勾销的, 手动勾销失常完结, 将返回true, 如失败, 将返回false 目前根本反对了绝大部分的协程 API 的勾销,包含: socketAsyncIO (fread, gethostbyname ...)sleepwaitSignalwait/waitpidwaitEventCo::suspend/Co::yieldchannelnative curl (SWOOLE_HOOK_NATIVE_CURL)有两个不可中断的场景 被 CPU 中断调度器强制切换的协程文件锁操作期间不过,可能在后续版本也会容许进行勾销,敬请期待应用场景基于协程勾销这一性能,能够在用户侧实现: 基于协程粒度的超时熔断在之前的版本中已挂起的协程是不可被动调度的,而Co::cancel()跟Co::resume()的区别就是,不止能够勾销手动Co::yield()的协程,能够勾销所有容许勾销的协程。 更好的 API 设计和传统 PHP 的相似性能的 API 不同的是, Swoole 中大量的 API 减少了 timeout 参数, 当然也有局部难以增加或者说不适合增加 timeout 参数的, 比方文件操作系列函数, 当初所有都有了可能, 能够在 PHP 层实现任意 IO 操作的超时, 而无需依赖于底层的 API 设计 ...

June 8, 2021 · 1 min · jiezi

关于php:学习PDO中的错误与错误处理模式

在 PDO 的学习过程中,咱们常常会在应用事务的时候加上 try...catch 来进行事务的回滚操作,然而大家有没有留神到默认状况下 PDO 是如何处理错误语句导致的数据库操作失败问题呢?明天,咱们就来学习一下。 PDO 中的谬误与错误处理模式简介PDO 提供了三种不同的错误处理形式: PDO::ERRMODE_SILENT,这是 PDO 默认的解决形式,只是简略地设置错误码,能够应用 PDO::errorCode() 和 PDO::errorInfo() 办法来查看语句和数据库对象PDO::ERRMODE_WARNING,除设置错误码之外,PDO 还将收回一条传统的 E_WARNING 信息。如果只是想看看产生了什么问题且不中断应用程序的流程,那么此设置在调试/测试期间十分有用。PDO::ERRMODE_EXCEPTION,除设置错误码之外,PDO 还将抛出一个 PDOException 异样类并设置它的属性来反射错误码和错误信息。原来默认状况下,咱们的 PDO 是不会处理错误信息的,这个你晓得吗?如果不信的话,咱们持续向下看具体的测试状况。不过,首先咱们要阐明的是,PDO 的错误处理机制针对的是 PDO 对象中的数据操作能力,如果在实例化 PDO 对象的时候就产生了谬误,比方数据库连贯信息不对,那么间接就会抛出异样。( PHP5 中会间接返回一个 NULL,PHP7会抛出异样! ) $pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test1', 'root', '');// Fatal error: Uncaught PDOException: SQLSTATE[HY000] [1049] Unknown database 'blog_test1'blog_test1 表并不存在,所以在 new PDO 的时候就曾经间接会抛出异样了。这个在实例化连贯数据库过程中的错误处理机制是固定的,不是咱们能批改的错误处理机制,毕竟如果连数据库连贯都无奈建设的话,就不必谈前面的任何操作了。 默认状况$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', '');$pdo->query('select * from aabbcc');var_dump($pdo->errorCode());// string(5) "42S02"var_dump($pdo->errorInfo());// array(3) {// [0]=>// string(5) "42S02"// [1]=>// int(1146)// [2]=>// string(38) "Table 'blog_test.aabbcc' doesn't exist"// }在下面的测试代码中,咱们查问了 aabbcc 这个表,但其实数据库中并不存在这个表。如果不应用 errorCode() 或者 errorInfo() 的话,这段代码不会有任何输入,也就是说,不会有任何错误信息让你看到,代码就间接运行过来了。 ...

June 8, 2021 · 1 min · jiezi

关于php:PHP密码散列算法的学习

不晓得大家有没有看过 Laravel 的源码。在 Laravel 源码中,对于用户明码的加密,应用的是 password_hash() 这个函数。这个函数是属于 PHP 明码散列算法扩大中所蕴含的函数,它是集成在 PHP 源码中的扩大,并且还是 PHP 官网所举荐的一种明码加密形式。那么它有什么益处呢? 实际上,password_hash() 这一系列的函数是对 crypt() 这个加密函数的一种封装。crypt() 函数也是一种单向散列函数,默认状况下是基于 UNIX DES 算法,这个函数的盐值是可选参数,如果没有盐值的话,它会生成的是一种简略的弱明码,所以在 PHP5.6 之后如果 crypt() 函数没有给盐值的话会报正告谬误。而 password_hash() 就是在它的根底上减少了一套牢靠的随机盐值生成器并封装在这一个函数中了。具体内容咱们通过上面的代码一步一步来进行学习。 查看明码散列函数的加密算法首先,咱们还是看看以后环境中所反对的 password_hash() 算法。 print_r(password_algos());// Array// (// [0] => 2y// )能够看出,以后环境中,咱们只有 2y 这一种算法能够应用,这个函数是 PHP7.4 才提供的。咱们简略的理解一下即可。 应用明码散列函数加密数据重点还是在这个加密函数的利用上,咱们就来看看 password_hash() 这个函数的应用。这个函数是在 PHP5.5 之后就曾经提供了,大家能够释怀地应用。 echo password_hash("this is password", PASSWORD_DEFAULT), PHP_EOL;// $2y$10$vOI56sADJPhebhzq5Bj1quM7grMex3Y4NlI99C3qP83iveEGnfdd.echo password_hash("this is password", PASSWORD_DEFAULT), PHP_EOL;// $2y$10$YMq8zsTw32HCOeWmlLSpruWKiSoO/rlNu2OVcIV4hlVSY4enn8GwS没错,就是这么地简略,PASSWORD_DEFAULT 是咱们指定的加密算法,这里咱们给的就是一个默认值。然而加密进去的数据并不是像 md5() 之类的是一个 16进制 字符串呀。是的,password_hash() 加密进去的内容并不是 md5 类型的 Hash 串,而是相似于像 JWT 一样的一套加密字符串。对于 JWT 的内容大家能够自行理解一下,在这里,最次要的就是 password_hash() 加密进去的内容和 JWT 一样,在加密串的外面是蕴含一些信息的,比方加密循环次数和盐值信息。这些信息是前面咱们进行明码匹配时所必须的内容。有人又说了,既然有盐值,为什么咱们没有定义这个盐值呀,这样咱们前面如何匹配呢?就像后面说的那样,这个加密后的字符串自身曾经蕴含了盐值信息,而且这个盐值信息是零碎随机生成的,只能应用对应的比拟函数能力比拟原始明文明码和加密后的明码是否统一,这样就能让零碎的安全性进步很多。请留神下面的测试代码,咱们两段代码的明文是一样的,然而加密进去的明码散列可是齐全不雷同的哦。当然,更重要的是,这个加密后的明码也是不可反解码的,是一个正规的单向 Hash 散列。所以它是十分平安的一个明码加密函数,这也是官网举荐它的起因。 ...

June 7, 2021 · 2 min · jiezi

关于php:PHP的zlib压缩工具扩展包学习

总算到了咱们压缩相干扩大的最初一篇文章了,最初咱们要学习的也是 Linux 下十分罕用的一种压缩格局:.gz 的压缩扩大。作为 PHP 的自带扩大,就像 zip 一样,zlib 扩大是随着 PHP 的安装包一起公布的,所以咱们在编译的时候间接加上 --with-zlib 就能够了,如果无奈找到对应的软件包的话,应用 yum 装置相应的软件包即可。 创立压缩包// 创立压缩包$zp = gzopen('./gztest.gz', "w9");gzwrite($zp, "Only test, test, test, test, test, test!\n");gzclose($zp);压缩包的创立十分地简略,不过 PHP 的这个扩大中,只能应用 gzwrite() 来创立这种字符串类型的压缩包,无奈间接将某些目录或者文件进行打包。 创立压缩包胜利后,咱们就能够通过零碎的 tar 命令来解压或者查看文件了。 读取压缩包内容// 读取压缩包$zp = gzopen('./gztest.gz', "r");echo gzread($zp, 3);gzpassthru($zp); // 输入 gz 文件指针中的所有残余数据// Only test, test, test, test, test, test!echo PHP_EOL;gzpassthru($zp);//gzrewind($zp); // 将 gz 指针的游标返回到最开始的地位gzpassthru($zp);// Only test, test, test, test, test, test!echo PHP_EOL;gzclose($zp);读取操作其实也非常简单,间接应用 gzpassthru() 就能够输入以后压缩包外面的内容,并且是间接打印进去。当然,它也是以相似于文件指针的模式进行输入的,所以如果咱们输入过一次之后,就必须要应用 gzrewind() 将指针的游标还原到句柄最开始的地位。 ...

June 5, 2021 · 2 min · jiezi

关于php:☘-gMIS吉密斯升级xTree图片水印等批量优化改进

“对资本家和企业家予以鄙视,这是当初极一般的事件。人,总喜爱讥笑比本人的境遇更好的人。“ ——米塞斯Mises :人的行为Human Action, https://ufqi.com/news/ulongpa... Human Action-72:抉择的过程 How many roads must a man walk down, Before they call him a man, … The answer is blowing in the wind… —- Blowing in the Wind , Bob Dylan ☘ gMIS吉密斯继续更新改良,这可能是gMIS自10多年前被推出以来,改良最多的一次,或者是记录改变性能点最多的一篇Blog文章。其中既有新性能的减少,也有对问题Bug的批改,更有一些是将现有性能推高到一个新的程度。 倡议gMIS老用户在适合的时候,安顿降级更新。 gMIS 吉密斯 继续改良细节,备注列如下。 xTree: 对有限宽度和深度的层级数据反对如同咱们在之前Blog:分类、层级与编码( https://ufqi.com/blog/classif... )和 -gMIS更新: 主动层级目录( https://ufqi.com/blog/gmis-up... )中探讨的一样,咱们在层级目录数据中,既可能遇到无限宽度和深度的层级目录数据,如行政地区编码,也可能遇到有限宽度和深度的层级目录数据,如文件目录。或者区块链。在后一种数据结构中,咱们无奈提前预知在某一层级有多少并列项(宽度),也无奈预知到底会有多少层级。 为满足这种数据结构,咱们设计和实现了xTree的输出与输入功能模块,用于反对对这种只晓得父节点数据结构。新增了 extra/xtree.php 和 class/xtree.class.php . 能够反对有限宽度和有限深度的目录数据类型。 这一新出炉的性能,已胜利部署和利用在 Boss选址(老板选址, bossxuanzhi.com )我的项目 和 有福工坊( UfqiWork, ufqi.com/work )我的项目上。 改良对 Preset环境变量的反对,pnskxxx=yyy+ act/preset-vars.inc.php , 得益于咱们所设计的功能强大的Page Navigator组件,gMIS能够通过URL参数主动生成对应的查问SQL语句,在爱护平安的同时也同时提供了便捷的数据查问性能。其中通过 Page Navigator Search Key (pnsk) 形式能够在关上相应表单时,传入查问条件. 这次改良岂但在查问读取时应用pnsk等传入条件,在新增记录等环节,也能够读取和应用pnsk代入的预置条件。 ...

June 4, 2021 · 2 min · jiezi

关于php:PHP的zip压缩工具扩展包学习

总算到了 PHP 的拿手好戏上场了,后面咱们学习过 Bzip2 、 LZF 、 Phar 和 rar 这些压缩相干扩大在 PHP 中的应用,不过它们要么是太冷门,要么就是很多性能不反对。而 Zip 则是在 PHP 中失去最大幅度性能反对的热门压缩格局,或者说是通用常见的一种压缩格局。当然,也次要得益于 Zip 也是事实上的 Linux 环境中的通用压缩格局。 装置对于 PHP 来说,Zip 扩大曾经集成在了 PHP 的安装包中,在 Configure 的时候能够间接加上 --with-zip ,如果在装置的时候没有加上这个参数,咱们也能够在源码包的 ext/zip 下找到源码,而后通过扩大装置的形式进行装置。 创立一个压缩包$zip = new ZipArchive();$filename = './test_zip.zip';if($zip->open($filename, ZIPARCHIVE::CREATE)!==TRUE){ exit('cannot open ' . $filename .'\n');}// 退出文字类型的文件$zip->addFromString('testfile1.txt' . time(), "#1");$zip->addFromString('testfile2.txt' . time(), "#2");// 退出已存在的文件$zip->addFile('rar.php', 'newrar.php');echo $zip->numFiles, PHP_EOL; // 文件数量echo $zip->status, PHP_EOL; // 压缩包状态$zip->close();// 应用操作系统的 unzip 查看// # unzip -l test_zip.zip// Archive: test_zip.zip// Length Date Time Name// --------- ---------- ----- ----// 2 07-08-2020 08:57 testfile1.txt1594169845// 2 07-08-2020 08:57 testfile2.txt1594169845// 2178 07-07-2020 08:55 newrar2.php// --------- -------// 2182 3 files之前学习过的 rar 扩大是无奈打包文件或者创立新的压缩包的,而 Zip 一上来咱们就学习的是创立一个新的压缩包。通过实例化一个 ZipArchive 对象后,咱们就能够应用 open() 函数关上或创立一个压缩包文件。接着,咱们应用了两种增加内容的形式。addFromString() 是退出文字类型的文件,也就是将一段文字转换成文本文件保留在这个压缩包中。另外,咱们通过 addFile() 来将内部的文件退出到这个压缩包中。 ...

June 4, 2021 · 2 min · jiezi

关于php:PHP实现strpos

//办法1function strpos1($str,$str_find){ $a = str_split($str); $b = str_split($str_find); foreach ($a as $ka=>$va) { if ($va==$str_find[0]) { $match=true; //循环看看后几个是否相等 $len = count($b); for ($i=0;$i<$len;$i++) { if ($a[$ka+$i]!==$b[$i]){ $match = false; } } } if ($match) { $res=$ka; break; } } return $res;}//办法2

June 3, 2021 · 1 min · jiezi

关于php:php-实现常见的排序

$arr = [4,5,3,2,1,9,8,6,7];//冒泡排序function maopao($arr){ $len = count($arr); for ($i=1; $i <$len ; $i++) { # code... for ($k=0; $k <($len-$i) ; $k++) { # code... if ($arr[$k]>$arr[$k+1]) { # code... $v_k = $arr[$k]; $arr[$k]=$arr[$k+1]; $arr[$k+1]=$v_k; } } } return $arr;}//疾速排序function kuaisu($arr){ $len = count($arr); if ($len<=1) { # code... return $arr; } //抉择基准元素 $a = $arr[0]; $left = $right = []; //循环 for ($i=1; $i < $len; $i++) { # code... if ($arr[$i]<$a) { # code... $left[]=$arr[$i]; }else{ $right[]=$arr[$i]; } } $left = kuaisu($left); $right = kuaisu($right); return array_merge($left,[$a],$right);}//插入排序function insertSort($arr){ $len = count($arr); for ($i=1; $i < $len; $i++) { # code... $tmp = $arr[$i]; for ($j=$i-1; $j >=0 ; $j--) { # code... if ($tmp<$arr[$j]) { # code... $arr[$j+1]=$arr[$j]; $arr[$j]=$tmp; }else{ break; } } } return $arr;}//抉择排序function selectSort($arr){ $len = count($arr); for ($i=0; $i < $len; $i++) { # code... $p=$i; for ($j=$i+1; $j < $len; $j++) { # code... if ($arr[$p]>$arr[$j]) { # code... $p=$j; } } $tmp = $arr[$p]; $arr[$p]=$arr[$i]; $arr[$i]=$tmp; } return $arr;}

June 3, 2021 · 1 min · jiezi

关于php:PHP-读取文件内容

$file_path = "a.php";//file$file_arr = file($file_path);if(file_exists($file_path)){ $file_arr = file($file_path); for($i=0;$i<count($file_arr);$i++) {//逐行读取文件内容 echo $file_arr[$i] . "<br />"; fclose($file_arr); }}//freadif(file_exists($file_path)){ $fp = fopen($file_path,"r"); $str = fread($fp,filesize($file_path));//指定读取大小,这里把整个文件内容读取进去 $str = fread($fp,filesize($file_path));//指定读取大小,这里把整个文件内容读取进去 echo $str = str_replace("\r\n","<br />",$str); fclose($fp);}if(file_exists($file_path)){ $fp = fopen($file_path,"r"); $str = ""; $buffer = 1024;//每次读取 1024 字节 while(!feof($fp)){//循环读取,直至读取残缺个文件 $str .= fread($fp,$buffer); } $str = str_replace("\r\n","<br />",$str); echo $str; fclose($fp);}//file_get_contentsif (file_exists($file_path)){ $str = file_get_contents($file_path);}//fgetsif(file_exists($file_path)){ $fp = fopen($file_path,"r"); $str =""; while(!feof($fp)){ $str .= fgets($fp);//逐行读取。如果fgets不写length参数,默认是读取1k。 } $str = str_replace("\r\n","<br />",$str); echo $str; fclose($fp);}

June 3, 2021 · 1 min · jiezi

关于php:php实现无限级分类

//有限级分类$list = array( array('id' => 1, 'pid' => 0, 'name' => '河北省'), array('id' => 2, 'pid' => 0, 'name' => '北京市'), array('id' => 3, 'pid' => 1, 'name' => '邯郸市'), array('id' => 4, 'pid' => 2, 'name' => '朝阳区'), array('id' => 5, 'pid' => 2, 'name' => '通州区'), array('id' => 6, 'pid' => 4, 'name' => '望京'), array('id' => 7, 'pid' => 4, 'name' => '酒仙桥'), array('id' => 8, 'pid' => 3, 'name' => '永年区'), array('id' => 9, 'pid' => 1, 'name' => '武安市'), array('id' => 10, 'pid' => 7, 'name' => '三街坊'),);//传值援用function list_to_tree($list,$id='id',$pid='pid',$child='_child',$root=0){ $tree = []; if (is_array($list)) { //创立基于主键的数组援用 $refer = []; foreach ($list as $k=>$v) { $refer[$v[$id]]=&$list[$k]; } foreach ($list as $k=>$v) { $parent_id = $v[$pid]; if ($root==$parent_id) { $tree[]=&$list[$k]; } else { if (isset($refer[$parent_id])) { $parent = &$refer[$parent_id]; $parent[$child][]=&$list[$k]; } } } } return $tree;}//递归function getTree($data, $pId){ $tree = array(); foreach($data as $k => $v) { if($v['pid'] == $pId) { //父亲找到儿子 $v['_child'] = getTree($data, $v['id']); $tree[] = $v; unset($data[$k]); } } return $tree;}

June 3, 2021 · 1 min · jiezi

关于php:PHP的rar解压读取扩展包学习

作为压缩解压方面的扩大学习,两大王牌压缩格局 rar 和 zip 始终是计算机领域的压缩终结者。rar 格局的压缩包是 Windows 零碎中有靠近统治位置的存在,明天咱们学习的 PHP 扩大就是针对于 rar 的压缩包操作,不过,PHP 的 rar 扩大仅能读取和解压 rar 格局的压缩包,并不能进行压缩操作。 php-rar 扩大在 pecl 的安装包曾经过期了,无奈在 PHP7 中应用,咱们须要应用它在 github 上的源码进行编译装置才可能在 PHP7 的环境下装置胜利。 https://github.com/cataphract/php-rar 间接 git clone 之后就能够按失常的 PHP 扩大的形式进行装置。 获取压缩包句柄 RarArchive$arch = RarArchive::open("test.rar");$archNo = rar_open("test.rar");echo $arch, PHP_EOL; // RAR Archive "/data/www/blog/test.rar"echo $archNo, PHP_EOL; // RAR Archive "/data/www/blog/test.rar"$arch->close();rar_close($archNo);echo $arch, PHP_EOL; // RAR Archive "/data/www/blog/test.rar" (closed)echo $archNo, PHP_EOL; // RAR Archive "/data/www/blog/test.rar" (closed)php-rar 扩大有两种模式的写法,一种是面向对象的,也就是应用 RarArchive 类来操作压缩包。另一种形式就是间接应用一个函数 rar_open 用来获取一个 rar 文件的句柄。它们都重写了 __toString 办法,所以咱们能够间接打印句柄的内容看到以后句柄所操作的具体文件。 ...

June 3, 2021 · 2 min · jiezi

关于php:PHP的OpenSSL加密扩展学习三证书操作

对于对称和非对称的加密操作,咱们曾经学习完两篇文章的内容了,接下来,咱们就持续学习对于证书的生成。 生成 CSR 证书签名申请CSR 是用于生成证书的签名申请,在 CSR 中,咱们须要一些 dn 信息。其实也就是以后这个证书的服务对象,蕴含公司名、邮箱之类的内容。 $privkey = openssl_pkey_new([ "private_key_bits" => 2048, "private_key_type" => OPENSSL_KEYTYPE_RSA,]);$dn = [ "countryName" => "CN", // 国家 "stateOrProvinceName" => "Hunan", // 省 "localityName" => "Changsha", // 市 "organizationName" => "zyblog", // 公司单位名称 "organizationalUnitName" => "zyblog", // 公司单位名称 "commonName" => "zyblog.xxx", // 专用名称,个别能够填域名 "emailAddress" => "zy@zyblog.xxx" // 邮箱地址];$csr = openssl_csr_new($dn, $privkey, ['digest_alg' => 'sha256']);openssl_csr_export($csr, $csr_string);var_dump($csr_string);// string(1102) "-----BEGIN CERTIFICATE REQUEST-----// MIIC9DCCAdwCAQAwga4xCzAJBgNVBAYTAkdCMREwDwYDVQQIDAhTb21lcnNldDEU// MBIGA1UEBwwLR2xhc3RvbmJ1cnkxHzAdBgNVBAoMFlRoZSBCcmFpbiBSb29tIExp// bWl0ZWQxHzAdBgNVBAsMFlBIUCBEb2N1bWVudGF0aW9uIFRlYW0xFDASBgNVBAMM// C1dleiBGdXJsb25nMR4wHAYJKoZIhvcNAQkBFg93ZXpAZXhhbXBsZS5jb20wggEi// MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCh+kxDtR7+YMOCJP+s77YJmbt2// AigtVnoy3iOj+JvP3VXCU9dIehw4deT/TBpmlpxVWPfhZF2VmpoCZNhNWFbv+6sz// tMPhALoconSHABh+5K5UvVRGfm7Zv+0wts/8l/ZXz/pL9wpB0bCpuSXb2CjY+CkN// hM5AYc53PHPOYU5ZC1B+z96a7gsNE+6A9qJSFRPAKWIR8QlX1ewPe23EmY2yscSC// 6bqVkq1BFBuezim+pstWU0AQYASgSzTEtBBD4h4PHo82BmFfhHlWPWU3BZTUL8u1// 4JJ2MBsK1F/G047EckPhrHDO9zwp6mFf5KPNr6oIwAyzvw8K8CdazpFeX863AgMB// AAGgADANBgkqhkiG9w0BAQsFAAOCAQEALFZB3Jcc7dkt5yGPhjsxct/qyGcLJl4V// rS1uDhHSI49FUauJOKoVnuSHblMkrWaWUr5PmETf6kVYZ8uZdiuXcswDF5Ax8CTc// uRy+3kGB3Oswm/35RyiKV2oi1LHLhGXaiKdZvNl41wOqNobFAYPbTXWSkcbpmw+1// KfEsmMwpYGYXX/zC1CzHf2t7OsPhsAyvDW5EqYhaKn+oNXFiL22pQDzM1MM8xwhB// akpqZPHGIpJDUdoI3o8CSIlRI2BxWGcDTUh2OViOroS8O6gAmmD7uvmMOnNwiZIN// 90FkKMpYyEsfo+Bj8DL0RjLpUDhYLJOXf0rs+yMkrU4FW2naiaWnbg==// -----END CERTIFICATE REQUEST-----// "$public_key = openssl_csr_get_public_key($csr);$info = openssl_pkey_get_details($public_key);var_dump($info['key']);// string(451) "-----BEGIN PUBLIC KEY-----// MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvDBrEHxkWucb/YQlzccO// bbgzlTficOAglSEDPBybnWXGfQRiqRij/QGyCPGVH9Ex7UTogsOp67+Jj0h8ikCD// rCeomRfM7U95NBXrJJdELZFf6twXNBBNB4d8PL96LIatSGpjCDbBXemuIVi2T7Rl// i6towHxNjQuSILnUadMceGsehB9Ao699rAqRtmrnyPbcAACbpZq50haYTl62gtuu// hOPHlDpGlWIEaj7hHzBsI3kMky0Fo35TLini2pDPSZhdIyJucDJNw5MMjcky9FWx// cvje1cx+rQtk1ez41nda9YkDlFIEQjS2X3YVTqSrxPZbfYG4Vavp2yZe2Pz6rw5W// mQIDAQAB// -----END PUBLIC KEY-----// "应用 openssl_csr_new() 通过私钥来生成 CSR 句柄,而后通过 openssl_csr_export() 抽取证书申请内容。能够看出,在 CSR 中是蕴含公钥信息的,因为咱们能够通过 openssl_csr_get_public_key() 和 openssl_pkey_get_details() 来抽取公钥。 ...

June 2, 2021 · 2 min · jiezi

关于php:PHP的OpenSSL加密扩展学习二非对称加密

上篇文章,咱们理解了对于对称和非对称加密的一些相干的理论知识,也学习了应用 OpenSSL 来进行对称加密的操作。明天,咱们就更进一步,学习 OpenSSL 中的非对称加密是如何实现的。 生成私钥通过之前的学习,咱们晓得非对称加密是别离须要一个公钥和一个私钥的。咱们就先来生成一个私钥,也就是寄存在咱们这一端一个密钥。请记住,在任何时候,私钥都是不能给他人的哦! $config = array( "private_key_bits" => 4096, // 指定应该应用多少位来生成私钥);$res = openssl_pkey_new($config); // 依据配置信息生成私钥openssl_pkey_export($res, $privateKey); // 将一个密钥的可输入示意转换为字符串var_dump($privateKey); // -----BEGIN PRIVATE KEY-----// MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQDFMLW+9t3fNX4C// YBuV0ILSyPAdSYVXtE4CLv32OvNk9yQZgF2nL/ZuIbBGRcYo2Hf5B31doGrAFDGu// NoTR+WA7CBjKROFr/+yValsMFIeiKNtttWMkmBciysDJoEoyd6wjDD+kcHQdoJVo// ……// -----END PRIVATE KEY-----非常简单的一个函数 openssl_pkey_new() ,它接管一个参数,这个参数是可配置项并且是可选参数。生成的后果是一个私钥句柄,不是咱们能间接读取的内容,所以咱们再应用 openssl_pkey_export() 来提取可输入的字符串。 正文中的内容就是咱们生成的私钥信息了,私钥信息个别会绝对多些,所以省略了前面的内容。 抽取公钥接下来就是生成公钥了,其实,公钥是从私钥中抽取进去的。所以咱们应用进行加解密的时候,都能够应用私钥或者公钥相互操作。 $publicKey = openssl_pkey_get_details($res); // 抽取公钥信息var_dump($publicKey);// array(4) {// ["bits"]=>// int(4096)// ["key"]=>// string(800) "-----BEGIN PUBLIC KEY-----// MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtOIImDdS0W0vAr5Ra1+E// hR2AJwQQwxntYKgTku8EmJRBX2vU+x8th8W8SnoGiVM/sOItG0HIe4Egf1UxoZHt// gI6r+jpAp7JbTN0sD/VTPDE09F21+hFGjIVBqrkcLPjuEbf7+tjmgAx8cG8WLGId// G8Hsub70kRANKJe1bCXIBUggRFk0sQGllxA/hxiG5wANqHTrdpJgJba+ahSi2+4H// UWnyCV1O3AaPyz6a12HNUsG4Eio/tWv/hOB9POt6nAqwPHuIbhp56i5bv1ijMJZM// jwRen5f/kwdZ01Ig2fi0uBoTR2y/EEaus7xBYpF/gGzZ/uM7cNUXcDyG5YluM/4R// MEv4msPMVGB72izItED+C6Cqftxl98iBFRDc+PISFbRSgOU/HsuBhKkM5SYzyi3I// Ypaej25++qLPqcA+EDr3JNDhNZ0GOhofCRtPq4dsr7iLLLRnZ0TnhIYe9wAbmO49// uthABNBkM54bG+omOfY4Bkn5n39CKpELbhIiXgOd+lA684XUS/2Aw3Dvelc9Gbag// oIFvb/wljPYsd0Zmd64CXBpTWbfwXC8K4vCKvFLjytcz2Yp4T6fVjbLT5RA6u8su// E0WwE4QTFNKhnM5OvfiMN+NMc3Y/esVfcin3eyvotdz4N6Tt45dkybkf6aQE3Scg// E/JBLIEEA+gjGTveY4cNUiECAwEAAQ==// -----END PUBLIC KEY-----// "// ["rsa"]=>// ……$publicKey = $publicKey['key'];应用 openssl_pkey_get_details() 抽取进去的内容蕴含很多内容。不过咱们所须要的最次要的内容就是 key 上面的这个公钥。 ...

June 1, 2021 · 1 min · jiezi

关于php:PHP使用Echo打印字符串

echo是什么?上篇曾经用到过了 echo能够打印字符串,留神,这里不能打印数组其余简单的数据结构 echo是个函数,咱们前面讲到函数时就晓得是怎么回事了 咱们用一个在线php工具测试下 关上菜鸟工具在线编辑器 https://c.runoob.com/compile/1 echo 'php客栈网,收费学习php';?>而后运行能够看到后果 如果你试下数组呢,会有报错 如果想要打印数组能够应用 print([1,2,3]);?>当然print也能够打印字符串等文章原地址:https://www.php-inn.com/detai...文章名::PHP应用Echo打印字符串转载本文请附上文章原地址! 微信小程序收费学习 PHP零根底收费学习 欢送关注我的公众号:子枫的微妙世界,取得独家整顿的学习资源和日常干货推送。 如果您对我的其余专题内容感兴趣,中转我的集体博客:www.wangmingchang.com 。

May 31, 2021 · 1 min · jiezi

关于php:Go语言-命令行压力测试工具Wrk

下载 git clone https://github.com/wg/wrk make sudo cp -R wrk /usr/local/bin/wrk 查看版本号 wrk -v应用办法: wrk <选项> <被测HTTP服务的URL> Options: -c, --connections <N> 跟服务器建设并放弃的TCP连贯数量 -d, --duration <T> 压测工夫 -t, --threads <N> 应用多少个线程进行压测 -s, --script <S> 指定Lua脚本门路 -H, --header <H> 为每一个HTTP申请增加HTTP头 --latency 在压测完结后,打印提早统计信息 --timeout <T> 超时工夫 -v, --version 打印正在应用的wrk的具体版本信息 <N>代表数字参数,反对国内单位 (1k, 1M, 1G) <T>代表工夫参数,反对工夫单位 (2s, 2m, 2h)罕用申请形式 wrk -t8 -c200 -d30s --latency "http://www.bing.com"自定义申请 -s wrk = { scheme = "http", host = "localhost", port = nil, method = "GET", path = "/", headers = {}, body = nil, thread = <userdata>}列子 先用postman测试之后 间接从post外面copy进去设置 ...

May 31, 2021 · 1 min · jiezi

关于php:PHP的OpenSSL加密扩展学习一对称加密

咱们曾经学过不少 PHP 中加密扩大相干的内容了。而明天开始,咱们要学习的则是重点中的重点,那就是 OpenSSL 加密扩大的应用。为什么说它是重点中的重点呢?一是 OpenSSL 是目前 PHP 甚至是整个开发圈中的数据加密事实标准,包含 HTTPS/SSL 在内的加密都是它的理论利用,二是 OpenSSL 提供了对称和非对称加密的模式,也就是咱们日常中最广泛的两种加密形式,这都是咱们须要把握的内容。 那么,它和 Hash 类的加密有什么不同吗?Hash 类的加密是单向的不可逆转的加密,加密后的内容是 16进制 的 Hash 串,咱们只能通过彩虹表去反推明文内容,所以只有加上盐值或者多套两层加密,就十分难逆向破解进去了。因而,Hash 加密通常会用于用户的明码保留上,即便数据库泄露了用户明码也仍然是平安的。而 OpenSSL 这种类型的对称/非对称加密则是能够通过某个关键字或者证书来进行正向加密和逆向解密的,原文都是能够失去的。上面咱们就来具体说说对称和非对称加密的问题。 什么是对称和非对称加密对称加密,通常是通过一个 key(密钥) 来对原文进行加密。也就是说,不论是服务端还是客户端或是其它的任何对端,在两端通信时,它们传输的加密内容都必须要应用雷同的 key 来进行加/解密操作。两端都必须同时保留这样一个 key 。预计大家也想到了,当初不论是 web 开发还是 app 开发,代码都是能够反编译查看到源码的。如果应用对称加密的话,key 是很容易被获取到的。不过,对称加密的益处是速度十分快,不耗费资源。 非对称加密则是两端持有不同的 key 。就像咱们平时见到的最多的 https 证书,就是别离有 公钥 和 私钥 这两个概念。个别咱们会应用 公钥 进行加密,而后应用 私钥 进行解密,通常 公钥 都是公开并发送给对方的,而私钥是保留在本人这里的。也就是说,对方向咱们发送数据的时候,应用咱们给它的公钥将数据进行加密,数据在传输过程中就十分平安,因为两头并没有他人有能够解密这段数据的私钥,直到咱们接管到数据后应用本人的私钥进行解密后就失去了原文数据。因为两边的密钥内容并不相同,所以绝对于对称加密来说,非对称加密的安全性要高了很多。尽管说非对称加密的算法和复杂度都比对称加密晋升了好几个品位,但绝对于对称加密的劣势,在非对称加密中,速度和性能也就成了它的瓶颈,特地是数据量大的状况下。另外,非对称加密的数学原理是 大数难合成 问题,也就是越大的数越难进行因子合成,如果某个算法能在短时间内破解这个问题的话,那么祝贺你,古代加密算法的根底天花板就被你捅破了。 对称加密罕用的算法有:AES 、DES 、3DES 、 IDEA 、 RC2 、 RC5 等,比拟罕用的是 AES 和 DES 。 非对称加密罕用的算法有:RSA 、Elgamal 、ECC 等,RSA 十分罕用和广泛,SSL 和一些证书算法都是基于 RSA 。 ...

May 31, 2021 · 2 min · jiezi

关于php:SCP-本地文件-服务器-互相传输

scp应用从近程复制文件到本地目录。 scp root@192.168.120.204:/opt/soft/nginx-0.5.38.tar.gz /opt/soft/从近程复制目录到本地目录。 scp -r root@192.168.120.204:/opt/soft/mongodb /opt/soft/上传本地文件到近程目录。 scp /opt/soft/nginx-0.5.38.tar.gz root@192.168.120.204:/opt/soft/scptest上传本地目录到近程目录。 scp -r /opt/soft/mongodb root@192.168.120.204:/opt/soft/scptest

May 30, 2021 · 1 min · jiezi

关于php:分享一些-PHP-中有用的知识和坑

前言在一次偶尔查看 PHP 文档的时候,发现了一些乏味的内容,随着浏览的减少,越发感觉乏味的内容或者说时坑越来越多,所以我决定记录下来,分享进来,下文中一些内容摘录自一些优良的博客、PHP 文档的用户笔记,或者文档原文。 尤其是文档原文,我发现很多人不会去读,很多货色也不会去留神(是的,我也是这样,所以借着这次机会,一起来学习一下。) 我忘了PHP函数的参数程序,它们是随机的吗?PHP is a glue that brings together hundreds of external libraries, so sometimes this gets messy. However, a simple rule of thumb is as follows: Array functionparameters are ordered as " needle, haystack" whereas String functionsare the opposite, so " haystack, needle". 译:数组相干办法的参数程序为,「needle, haystack」,字符串相干办法则是相同的 「haystack, needle」, 起源: https://www.php.net/manual/zh/faq.using.php#faq.using.parameterorder 我应该如何保留“盐”?当应用 password_hash() 或者 crypt() 函数时, “盐”会被作为生成的散列值的一部分返回。 你能够间接把残缺的返回值存储到数据库中, 因为这个返回值中曾经蕴含了足够的信息, 能够间接用在 password_verify() 或 crypt() 函数来进行明码验证。 下图展现了 crypt() 或 password_hash() 函数返回值的构造。 如你所见,算法的信息以及“盐”都曾经蕴含在返回值中, 在后续的明码验证中将会用到这些信息。 ...

May 29, 2021 · 6 min · jiezi

关于php:SPL-数据结构4SplObjectStorage

Splobjectstorage 是spl规范库中的数据对象容器,用来存储一组对象。特地是当须要惟一标识对象的时候。 class Person{ public $name; public function __construct(string $name) { $this->name = $name; }}//实例化对象$zhangsan = new Person('张三');$lisi = new Person('李四');$wangwu = new Person('王五');$zhaoliu = new Person('赵六');//实例化对象存储$container = new SplObjectStorage();//往存储空间写入对象$container->attach($zhangsan);$container->attach($lisi);$container->attach($wangwu);$container->attach($zhaoliu);//统计存储空间外面的对象的数量echo "存储对象数量" . $container->count() . PHP_EOL;//判断指定的对象是否在存储空间中echo "是否蕴含指定对象:";var_dump($container->contains($lisi)) . PHP_EOL;$lisi2 = new Person("李四");echo "指定新对象:";var_dump($container->contains($lisi2)) . PHP_EOL;echo "删除指定对象";$container->detach($wangwu);echo PHP_EOL;//查看以后指针所在的索引地位echo "指针索引" . $container->key() . PHP_EOL;while ($container->valid()) { //获取以后指针地位的对象 $object = $container->current(); var_dump($object); echo "对象名称:" . $object->name . PHP_EOL; //存储空间指针下移 $container->next();}上一篇:SPL 数据结构3-SplFixedArray

May 27, 2021 · 1 min · jiezi

关于php:一文快速了解iptables-和systemctl-快速了解linux防火墙

docker网络配置以及docker操作 CentOS 7 中默认的防火墙是 FireWall firewall systemctl stop firewalld.service systemctl start firewalld.service systemctl status nfs-server.service systemctl restart nfs-server.service systemctl list -units --type=service systemctl disable firewalld.service systemctl enable nfs-server.service 装置 iptables yum install iptables-services vim /etc/sysconfig/iptables # sample configuration for iptables service# you can edit this manually or use system-config-firewall# please do not ask us to add additional ports/services tothis default configuration*filter:INPUT ACCEPT [0:0]:FORWARD ACCEPT [0:0]:OUTPUT ACCEPT [0:0]-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT-A INPUT -p icmp -j ACCEPT-A INPUT -i lo -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 20 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT-A INPUT -p tcp -m state --state NEW -m tcp --dport 10020:10030 -j ACCEPT-A INPUT -j REJECT --reject-with icmp-host-prohibited-A FORWARD -j REJECT --reject-with icmp-host-prohibitedCOMMIT最初重启防火墙使配置失效 ...

May 26, 2021 · 2 min · jiezi

关于php:快速了解-photoshop-快捷键

抉择性能勾销选区 command+D疾速反选 command+shift+I复制以后图层 command+J新建图层 command+shift+N存储为Web所用格局 Command+Option+Shift+S勾销抉择 Command+D从新抉择 Command+Shift+D羽化抉择 Shift+F6视图操作反向抉择 Command+Shift+I放大视图 Command+【+】放大视图 Command+【-】满画布显示 Command + 0编辑操作标尺 Command + R 显示或暗藏标尺都是一样快捷键显示网格 Command +’ 显示或暗藏网格都是一样快捷键自在变换 Command+T用背景色填充所选区域或整个图层 Command+退格键用前景色填充所选区域或整个图层 Option+退格键图像调整调整色阶 Command+L主动调整色阶 Command + Shift + L关上曲线调整对话框 Command+M色调均衡 Command + B色相/饱和度 Command + U去色 Command + Shift + U反相 Command + I图像大小 Command + Option + I液化 Command + Shift + X画笔大小 用 [ 和 ] 来调整画笔的硬度--画笔的硬度能够从键盘批改应用{和} -这基本上像Shift + >[和Shift +] 图层操作新建图层 Command + Shift + N拷贝图层 ...

May 26, 2021 · 1 min · jiezi

关于php:Swoole-v47-版本新特性预览之-ProcessPooldetach

Process\Pool 是 Swoole 提供的过程池,基于 Server 的 Manager 治理过程模块实现,可治理多个工作过程。 该模块的外围性能为过程治理,相比 Process 实现多过程,Process\Pool 更加简略,封装档次更高,开发者无需编写过多代码即可实现过程治理性能,配合 Coroutine\Server 能够创立纯协程格调的,能利用多核 CPU 的服务端程序。 在 4.7 版本中,对 Process\Pool 减少了一个 detach 办法,这个办法名看起来很眼生吧? 在 Http\Response 中也有一个 detach 办法,它的作用是拆散响应对象。应用此办法后,$response 对象销毁时不会主动 end,与 Http\Response::create 和 Server->send 配合应用。 办法作用那么Process\Pool::detach()的作用也就很显著了: 将过程池内以后 Worker 过程脱离治理,底层会立刻创立新的过程,老的过程不再解决数据,由应用层代码自行治理生命周期。 示例代码上面来看一下示例代码: use Swoole\Process;use Swoole\Coroutine;$pool = new Process\Pool(2);$pool->set(['enable_coroutine' => true]);$pool->on('WorkerStart', function (Process\Pool $pool, $workerId) { static $running = true; Process::signal(SIGTERM, function () use (&$running) { $running = false; echo "TERM\n"; }); echo("[Worker #{$workerId}] WorkerStart, pid: " . posix_getpid() . "\n"); $i = 0; while ($running) { Coroutine::sleep(1); $i++; if ($i == 5) { $pool->detach(); } elseif ($i == 10) { break; } }});$pool->on('WorkerStop', function (Process\Pool $pool, $workerId) { echo("[Worker #{$workerId}] WorkerStop, pid: " . posix_getpid() . "\n");});$pool->start();在 WorkerStart 中通过 Process::signal 设置一个异步信号监听,能够通过发送 SIGTERM 信号来进行该服务。 ...

May 25, 2021 · 1 min · jiezi

关于php:参考这个PHP代码规范后同事都夸你的代码写的棒极了

为什么须要编码标准一个好的编码习惯靠平时的习惯养成,团队里有好的编码标准,并且每个人都依照制订的编码标准来执行,那么我置信代码的品质以及可维护性会回升一个品位。而目前PHP要求都要恪守PSR标准规范,我只列举一部分编码中罕用的写法进行阐明,更多的标准大家能够搜寻PSR规范。 PHP文件开始标签对于纯PHP的代码文件,必须以<?php 或者<?标签开始,并且独占一行,同时不要加?>的完结标签,至于为啥,感兴趣的本人去理解哈。 <?phpclass TestDemo{}Class类的申明类名必须以大写结尾的驼峰式命名(TestDemo),两个花括号换行且独占一行,同时须要用多行正文阐明类的创建人以及作用等。 /** * 这是一个测试Demo类 * Author: gxcuizy * Date: 2021-05-25 13:57:16 * Class TestClass */class TestDemo{}Class类的常量类中的常量命名必须全副字母都要大写(HELLO_WORLD),同时单词间以下划线_分隔,而且最好减少正文阐明,单行正文最好在//后先加一个空格再接正文阐明。 // 申明一个常量const HELLO_WORLD = 'best'; Class类的成员属性类中的成员属性(也叫成员变量),成员属性的命名能够遵循三个规定:大写结尾的驼峰式($UserName)、小写结尾的驼峰式($userName)、下划线分隔式($user_name);这三种命名规定都能够,我集体习惯用下划线分隔式,大家也能够依据本人的习惯抉择,然而最好与团队编码规定保持一致即可,同时三个修饰符(public、protected、private)不能少。 // 申明一个公共变量public $user_name = '';// 申明一个动态变量public static $user_age = 18;Class类的成员办法类中的成员办法的命名必须采纳小写结尾的驼峰式命名(testAction)规定,办法的三个修饰符(public、protected、private)不能少,两个花括号换行且独占一行,参数的等号两边各一个空格,办法的正文不要漏了哈,包含办法的作用、参数阐明以及返回值阐明等。 /** * 这是一个测试方法 * @param string $msg 参数阐明 * @return array */public function testAction($msg = ''){ // 返回数据格式 $return = array('code' => 200, 'msg' => ''); return $return;}/** * 这是公有办法,办法命名以单下划线开始 * @param string $arg 参数阐明 * @return string */private function privateAction($arg = ''){ return $arg;}运算符和表达式绝对于运算符或者不同类型的表达式,不论在任何中央应用,咱们都须要在其符号两边有一个空格,例如$a = 1;、1 + 2以及1 && 0等。 ...

May 25, 2021 · 1 min · jiezi

关于php:减少服务提供者的启动加速你服务的性能-20

性能始终是Laravel的最大话题之一, 但它也的确为很多PHP开发者提供了很多不一样的常识, 这里再次为框架减速一次. 根底 (陈词滥调)缓存,会话,队列都是用Redis驱动框架内置的缓存 路由缓存php artisan route:cache配置缓存php artisan config:cache依据接口幂等性应用缓存降级OPcache 没什么非凡理由间接上这个并把opcache.validate_timestamps设置为0,让你生产环境的PHP代码永远不自动更新, 相似于其它编译型语言,每次部署代码,须要重启php-fpm来加载新代码更多可参考这篇文章https://gywbd.github.io/posts/2016/1/best-config-for-zend-opcache.html缩小不必要的中间件比方Laravel当初曾经内置了跨域中间件, 如果只是为APP提供接口,齐全就没有跨域的问题, 能够间接正文这个中间件比方内置的API限度速率的接口, 可能对很多我的项目场景就不适合缩小服务提供者比方接口就不须要视图服务,Session服务,明码重置服务等等当然要讲的重点还是和API和Admin混合的我的项目, 应用了一个全栈的框架,置信也有很我的项目应用了Laravel-admin或者是Dcat Admin 之前我也写过一篇文章讲过如何缩小你的服务提供者, 因为自从Laravel5.5之后,须要第三方包都能够本人注册,而后Laravel主动发现这些服务提供者能够运行这条命令找出你曾经注册的服务提供者: php artisan package:discoverDiscovered Package: dcat/laravel-adminDiscovered Package: facade/ignitionDiscovered Package: fideloper/proxyDiscovered Package: fruitcake/laravel-corsDiscovered Package: laravel/tinkerDiscovered Package: nesbot/carbonDiscovered Package: nunomaduro/collisionPackage manifest generated successfully.这里能够很显著看到了dcat/laravel-admin, 咱们只须要去我的项目根目录下的composer.json写入以下配置 "extra": { "laravel": { "dont-discover": [ "dcat/laravel-admin" ] } }当你这样子做了之后, 再执行php artisan package:discover就会发现dcat/laravel-admin隐没了不过这也代表咱们无奈应用Admin了, 所以咱们也须要减少一个条件来手动注册服务提供者咱们能够在AppServiceProvider.php减少以下代码<?phpnamespace App\Providers;use Dcat\Admin\Admin;use Dcat\Admin\AdminServiceProvider;use Illuminate\Foundation\AliasLoader;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{ /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { // 这个条件有很多种形式, 你甚至能够通过 url 来判断 if (config('admin.enable')) { AliasLoader::getInstance()->alias('Admin', Admin::class); $this->app->register(AdminServiceProvider::class); } }}批改结束之后, 发现性能有了40%的晋升(因为Admin注册了很多路由, 启动很多货色)机器:2U4G 的机器 CentOS Linux release 8.3.2011环境: (应用Laradock全家桶, 开启 OPcache)PHP_VERSION=7.4PHP_FPM_INSTALL_OPCACHE=true最初找运维要了其中一台API服务器的图能够看到, 优化之后的成果很好.Linkshttps://www.shiguopeng.cn/archives/374https://www.shiguopeng.cn/archives/507 ...

May 25, 2021 · 1 min · jiezi

关于php:SPL-数据结构3SplFixedArray

SplFixedArray是php中提供的固定长度数组。php语言中的数组特地弱小,能够实现栈,队列,列表,字典等数据结构。其底层是基于散列表实现的。而SplFixedArray示意的数组则靠近于C GO等语言中的数组。其长度固定,索引下标为integers。绝对php数组,SplFixedArray 领有更高的执行效率(The advantage is that it uses less memory than a standard array)。 性能测试实测SplFixedArray在工夫和内存应用上相比array都有晋升 for($size = 10000; $size < 50000000; $size *= 4) { echo PHP_EOL . "Testing size: $size" . PHP_EOL; for($s = microtime(true), $container = Array(), $i = 0; $i < $size; $i++) $container[$i] = NULL; echo "Array(): " . (microtime(true) - $s) . PHP_EOL; for($s = microtime(true), $container = new SplFixedArray($size), $i = 0; $i < $size; $i++) $container[$i] = NULL; echo "SplArray(): " . (microtime(true) - $s) . PHP_EOL;}应用//Initialize the array with a fixed length$arr = new SplFixedArray(4);$arr[0] = 'php';$arr[1] = 1;$arr[3] = 'python';// 超过索引下标会报数组越界 RuntimeException://$arr[4] = 'python';$arr->setSize(5);// 这里不再报错$arr[4] = 'python';echo "默认下标" . PHP_EOL;var_dump($arr[2]);echo "下标为0: " . $arr[0] . PHP_EOL;// 这里也能够获取到元素echo "下标为\"0\": " . $arr["0"] . PHP_EOL . PHP_EOL;echo "开始遍历:" . PHP_EOL;foreach ($arr as $v) { echo $v . PHP_EOL;}echo "数组长度:" . count($arr) . PHP_EOL;echo "应用count办法获取数组长度:" . $arr->count() . PHP_EOL;上一篇:SPL数据结构2-Heap,最大堆,最小堆 ...

May 25, 2021 · 1 min · jiezi

关于php:聊一聊限流降级熔断

熔断小时候村里一到夏天,全村都开空调,村里总闸的保险丝就会因为用电量太大,主动熔断了,间接停服。股市也有一些极其状况开启熔断解决,不到万不得已,不会熔断。在 Web 工程中熔断的最小单元,也不肯定是整个利用,可能只是某个服务。这里不深究学术名词定义。 限流限流场景咱们常常遇到,有时候地铁里就被保安人员给我限流了,双十一抢购也被爸爸限流了。坐地铁之所以能限流是因为咱们都要安检,有这个对立的地铁入口;浏览网站被限流是因为拜访有对立的域名入口。 当咱们须要依据路由规定进行限流,只有把握好网关就很不便的实现限流了,以下计划均可行 布点在相似于 WAF(Web 利用防火墙)中,具体见 阿里云WAF手册如果不想花钱,也能够装置 nginx 限流插件来做相似的工作,本人部署,总之是在 web 利用后面布点拦挡操作也能够在 web 利用外面联合路由组件开发一个限流组件,只有代码有对立入口,就能够不便管制降级生存中我也是生产降级的小伙,原来天猫,起初淘宝,当初拼多多和淘宝特价版。生产降级真香,话说回来,重点是又不是不能用。Web 我的项目中降级的案例,比方微博 feed 流中,用户根本信息压力比拟大,而用户的勋章也在该接口中对前端输入,服务降级的重点是又不是不能用。 如果是依照当初微服务的理念,勋章查问可能是一个独立的服务,所以降级对应的颗粒度能够是服务降级。既然是独立的服务单元,申请的拦挡就又回到了和限流一样的场景;如果不是微服务架构,接口依赖的用户的勋章输入只是一个独立的函数或者办法,如何进行拦挡呢? 计划1. 紧急公布如果后端服务是 PHP 的脚本语言,咱们能够疾速的独自公布须要批改的文件,达到疾速降级的目标。如果后端服务是 JAVA 须要编译的,对于这种简略场景的批改,也是反对热部署,独自公布一个 class 文件,也不须要重启也 OK,比方 arthas 就提供相似的性能。 如果公布零碎不反对热部署,也不反对单文件公布,只反对公布软件包的形式,那么疾速降级就须要 15 ~ 30分钟(业务简单一点的 Java 利用)能力部署实现,这是互联网利用不能承受的。 计划2. 限流降级中间件在 Java 生态目前比拟成熟,出名的产品有 hystrix,我用的比拟多的是 sentinel。反对从路由、办法去做单机的 qps 去限流,只须要在sentinel管控台做配置变更,而后公布推送到各个机器,机器则以最初收到的限流规定单机闭环操作,两头不再须要和中间件服务进行交互。 PHP 能不能像 sentinel 一样对用户态的函数和办法进行拦挡管制呢,所以弄了这个 https://github.com/zhoumengka... PHP 7.2.5 线上运行OK 装置应用编译装置 $ phpize$ ./configure --with-php-config=/usr/local/php/bin/php-config# 如果须要调试# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-debug$ make && make install配置php.ini,在其前面追加 [sentinel]extension=sentinel.sosentinel.api_url=https://mengkang.net/sentinel.htmlsentinel.api_cache_ttl=120sentinel.api_cache_file=/tmp/sentinel.rulesentinel.log_enabled=1sentinel.log_file=/tmp/sentinel.logsentinel.api_url 限流查问接口sentinel.api_cache_ttl 接口查问后果缓存 2 分钟sentinel.api_cache_file 接口查问缓存门路sentinel.log_enabled 是否开启用户自定义的办法和函数日志记录,能够用日志解决工具收集比方阿里云 SLSsentinel.log_file 日志记录门路原理PHP_MINIT阶段,通过zend_set_user_opcode_handler注册在opcode运行环节,对用户态的办法和函数(ZEND_DO_UCALL)的运行做解决 ...

May 24, 2021 · 1 min · jiezi

关于php:小程序-form可视化布局之input和picker

实现咱们要实现的目标是 form的数据是后盾加载的,那么咱们就要从onload处获取数据 代码小程序源码: index.js Page({ data: { form:[] }, onLoad:function(option){ console.log(1) var form = [ { 'name':'名字', 'type':'input', 'field':'name', 'val':'' }, { 'name':'类型', 'type':'dx', 'field':'dx', 'val': [0, 0, 0], 'multiArray': [['无脊柱动物', '脊柱动物'], ['扁性动物', '线形动物', '环节动物', '软体动物', '节肢动物'], ['猪肉绦虫', '吸血虫']], }, ] this.setData({ form:form }) }, bindMultiPickerChange: function (e) { console.log('picker发送抉择扭转,携带值为', e.detail.value) var index = 1 let temp = 'form[' + index +'].val' // 获取list[index].date this.setData({ [temp]: e.detail.value }) console.log(this.data.form) }, bindMultiPickerColumnChange: function (e) { console.log('批改的列为', e.detail.column, ',值为', e.detail.value); // 晓得批改的列当前,就能够通过批改multiIndex中对应元素的值,而后再批改multiArray }})index.wxml ...

May 24, 2021 · 1 min · jiezi

关于php:Yii2在多个表之间定义关系的正确方法

在控制器中,我有以下代码: public function actionView($id){ $query = new Query; $query->select('*') ->from('table_1 t1') ->innerJoin('table_2 t2', 't2.t1_id = t1.id') ->innerJoin('table_3 t3', 't2.t3_id = t3.id') ->innerJoin('table_4 t4', 't3.t4_id = t4.id') ->andWhere('t1.id = ' . $id); $rows = $query->all(); return $this->render('view', [ 'model' => $this->findModel($id), 'rows' => $rows, ]);}在视图view.php中显示来自table_2-4的数据,这些数据与table_1相干: foreach($rows as $row) { echo $row['t2_field_1']; echo $row['t2_field_2']; ...}它能够工作,然而我不确定这是否是最正确的Yii2办法. 我试图在模型TableOne中定义关系: public function getTableTwoRecords(){ return $this->hasMany(TableTwo::className(), ['t1_id' => 'id']);}public function getTableThreeRecords(){ return $this->hasMany(TableThree::className(), ['id' => 't3_id']) ->via('tableTwoRecords');}public function getTableFourRecords(){ return $this->hasMany(TableFour::className(), ['id' => 't4_id']) ->via('tableThreeRecords');}而后在控制器TableOneController中退出记录: ...

May 24, 2021 · 2 min · jiezi

关于php:PHP的Mhash扩展函数的学习

这次咱们要学习的又是一个 Hash 加密扩大。不过这个扩大 Mhash 曾经集成在了 Hash 扩大中。同时也须要留神的是,这个扩大曾经不举荐应用了,咱们应该间接应用 Hash 扩大中的函数来进行 Hash 加密操作。所以,咱们明天依然是以学习为目标的进行理解。对于 Hash 扩大的内容,咱们能够查看之前的文章:PHP的Hash信息摘要扩大框架 。 加密散列函数的应用$hash = mhash(MHASH_MD5, "测试Mhash");echo $hash, PHP_EOL;echo bin2hex($hash), PHP_EOL;// /�8�><��P4q�j�// 2fcb38e93e3cc8dba09f503471846a9d$hash = hash('md5', "测试Mhash");echo $hash, PHP_EOL;// 2fcb38e93e3cc8dba09f503471846a9d$hash = mhash(MHASH_MD5, "测试Mhash", 'hmac secret');echo $hash, PHP_EOL;echo bin2hex($hash), PHP_EOL;// �k�<F�m �OM����// b86bb83c46b76d09be4f4daf18ebfe85从代码中能够看出,mhash() 函数和 hash() 的应用十分像,当然,他们的作用也是一样的。不过,mhash() 函数加密进去的间接是二进制的,咱们将这个内容通过 bin2hex() 转成 16 进制之后就能够看到和一般的 hash() 函数加密的构造是完全相同的了。 在进行 hmac 加密的时候间接在第三个参数上增加 key 就能够了。 遍历所有反对的算法类型当然,就像 Hash 加密一样,Mhash 加密也是能够抉择不同的算法的。咱们也是间接应用相干的函数就能够看到以后环境中所反对的加密算法。 echo mhash_count(), PHP_EOL;$nr = mhash_count(); // 33for ($i = 0; $i <= $nr; $i++) { echo sprintf("Hash:%s,块大小为: %d\n", mhash_get_hash_name($i), mhash_get_block_size($i));}// Hash:CRC32,块大小为: 4// Hash:MD5,块大小为: 16// Hash:SHA1,块大小为: 20// Hash:HAVAL256,块大小为: 32// Hash:,块大小为: 0// Hash:RIPEMD160,块大小为: 20// Hash:,块大小为: 0// Hash:TIGER,块大小为: 24// Hash:GOST,块大小为: 32// Hash:CRC32B,块大小为: 4// Hash:HAVAL224,块大小为: 28// Hash:HAVAL192,块大小为: 24// Hash:HAVAL160,块大小为: 20// Hash:HAVAL128,块大小为: 16// Hash:TIGER128,块大小为: 16// Hash:TIGER160,块大小为: 20// Hash:MD4,块大小为: 16// Hash:SHA256,块大小为: 32// Hash:ADLER32,块大小为: 4// Hash:SHA224,块大小为: 28// Hash:SHA512,块大小为: 64// Hash:SHA384,块大小为: 48// Hash:WHIRLPOOL,块大小为: 64// Hash:RIPEMD128,块大小为: 16// Hash:RIPEMD256,块大小为: 32// Hash:RIPEMD320,块大小为: 40// Hash:,块大小为: 0// Hash:SNEFRU256,块大小为: 32// Hash:MD2,块大小为: 16// Hash:FNV132,块大小为: 4// Hash:FNV1A32,块大小为: 4// Hash:FNV164,块大小为: 8// Hash:FNV1A64,块大小为: 8// Hash:JOAAT,块大小为: 4在 PHP 中也提供了十分多的常量来代表这些算法,比方在前一段代码中咱们应用的 MHASH_MD5 。其实就是咱们遍历的这些内容在后面加上 MHASH_ 就能够了。具体反对的常量列表咱们能够在官网手册中找到,在这里就不进行复制粘贴了。 ...

May 24, 2021 · 1 min · jiezi

关于php:构建高性能Web站点学习笔记01

第一章 绪论1.1 期待的假相:在用户期待的工夫里,到底产生了什么? 数据在网络上传输的工夫站点服务器解决申请并生成回应数据的工夫浏览器本地计算和渲染的工夫1.2 瓶颈在哪里影响性能的关键因素,随着零碎的运行会一直的变动和迁徙。如用户多样性和习惯差别,不同时段零碎瓶颈各不相同;如数据存储量增长到不同级别时,瓶颈也会迁徙。长尾效应:对多个子因素的优化后果叠加在一起,带来性能上可观的晋升。1.3 减少带宽什么是带宽?如何计算站点当初和将来应用的带宽?1.4 缩小网页中的HTTP申请缩小图片和脚本图片合并,CSS背景图片偏移合并JS和CSS文件利用浏览器缓存,缩小反复下载1.5 放慢服务器脚本计算速度PHP之APC缓存组件(PHP5.5当前相干性能已内置)PHP的apcu是什么,opcache又是什么?1.6 应用动静内容缓存缓存文件如何存储?缓存的命中率如何?在Web分布式站点上利用动静内容缓存须要思考什么?1.7 应用数据缓存如何协调网页缓存和数据缓存呢?同一主机不同过程,不同主机间如何共享缓存?1.8 将动静内容动态化动态化:间接让浏览器拜访动静内容的缓存1.9 更换Web服务器软件Web服务器在并发策略方面的各种设计和动机实质1.10 页面组件拆散依据不同组件需要,有针对性的采纳不同的并发策略,并提供最佳的物理资源1.11 正当部署服务器如何实现Web站点的用户和服务器位于同一个互联网运营商的网络内呢?1.12 应用负载平衡HTTP重定向,DNS轮询解析,反向代理服务器负载平衡调度,LVS服务器集群1.13 优化数据库如何正当应用各种类型的索引存储引擎的个性数据库横向扩大和负载平衡1.14 思考可扩展性可扩展性是指当零碎负载增大时,通过减少资源来进步性能的能力1.15 缩小视觉期待

May 22, 2021 · 1 min · jiezi

关于php:PHP的Mcrypt加密扩展知识了解

明天咱们来学习的是 PHP 中的一个过期的扩大 Mcrypt 。在 PHP7 之前,这个扩大是随 PHP 安装包一起内置公布的,然而当初新版本的 PHP 中曾经没有了,须要应用这个扩大的话咱们须要独自装置,并且在应用的时候也是会报出过期的正告的。所以,咱们学习应用这些函数的时候,就须要应用 @ 来克制错误信息。当然,之所以会对这套扩大收回过期正告,是因为 PHP 更加举荐应用 OpenSSL 来解决相似的加密能力。 模块和算法Mcrypt 次要是应用的 Mcrypt 工具来进行加密操作的,所以在 CentOS 或者其它操作系统中,咱们须要装置 libmcrypt-devel 来应用这个扩大。如果 yum 中无奈装置的话,间接更新 yum 源即可。 Mcrypt 蕴含很多的模块和算法。算法就不必多解释了,就是用来对数据进行加密的形式。而模块,包含 CBC, OFB,CFB 和 ECB 这几种,是一系列的分组、流式加密的模式,有举荐的模块,也有平安的模块,具体的辨别大家能够自行查阅相干的材料,这里咱们先看一下咱们的环境中所反对的模块和算法。 $algorithms = @mcrypt_list_algorithms();print_r($algorithms);// Array// (// [0] => cast-128// [1] => gost// [2] => rijndael-128// [3] => twofish// [4] => arcfour// [5] => cast-256// [6] => loki97// [7] => rijndael-192// [8] => saferplus// [9] => wake// [10] => blowfish-compat// [11] => des// [12] => rijndael-256// [13] => serpent// [14] => xtea// [15] => blowfish// [16] => enigma// [17] => rc2// [18] => tripledes// )$modes = @mcrypt_list_modes();print_r($modes);// Array// (// [0] => cbc// [1] => cfb// [2] => ctr// [3] => ecb// [4] => ncfb// [5] => nofb// [6] => ofb// [7] => stream// )mcrypt_list_algorithms() 函数能够取得以后环境下所有反对的 Mcrypt 算法。而 mcrypt_list_modes() 则打印出了以后环境下所有可反对的模块。留神在某些版本的 PHP 或者某些零碎中,这些内容会有所不同,在应用 Mcrypt 相干的加密能力的时候,这两项都是相互配合应用的。因而,咱们有必要在须要运行 Mcrypt 的环境中预先确定好以后环境下所反对的模块和算法。 ...

May 22, 2021 · 2 min · jiezi

关于php:Laravel-的登录认证

认证相干路由# AuthRouteMethods.php# 登录退出$this->get('login', 'Auth\LoginController@showLoginForm')->name('login');$this->post('login', 'Auth\LoginController@login');$this->post('logout', 'Auth\LoginController@logout')->name('logout');# 注册$this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');$this->post('register', 'Auth\RegisterController@register');# 重置明码$this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');$this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');$this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');$this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');$this->get('password/confirm', 'Auth\ConfirmPasswordController@showConfirmForm')->name('password.confirm');$this->post('password/confirm', 'Auth\ConfirmPasswordController@confirm');# 邮箱验证$this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');$this->get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');$this->post('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');相干概念认证配置文件:config/auth.php。 守卫 Guard:对用户进行身份验证,默认反对"session" 和 "token",能够在守卫中设置应用的提供者。 提供者 Provider:应用何种形式在数据库中查找用户,默认反对"eloquent" 和 "database",能够在守卫中设置应用的模型类。 模型类:默认为 App\User::class。 配置文件# config/auth.phpreturn [ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], 'password_timeout' => 10800,];注册逻辑use Illuminate\Support\Facades\Auth;$user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), ]);$this->guard()->login($user);登录逻辑$credentials = $request->only('email', 'password');$credentials['active'] = 1;if ($this->guard()->attempt($credentials, $request->filled('remember'))) { $request->session()->regenerate(); return redirect()->intended('dashboard');}退出逻辑$this->guard()->logout();$request->session()->invalidate();$request->session()->regenerateToken();自定义看管器use Illuminate\Support\Facades\Auth;protected function guard(){ // 默认:Auth::guard(); // 看管器名称须要与 auth.php 配置文件中的配置项之一相匹配 return Auth::guard('guard-name');}获取认证用户use Illuminate\Support\Facades\Auth;// 获取以后通过认证的用户...$user = Auth::user();// 获取以后通过认证的用户 ID...$id = Auth::id();// 返回一个认证用户实例...use Illuminate\Http\Request;$request->user();检查用户是否已认证use Illuminate\Support\Facades\Auth;if (Auth::check()) { // 用户曾经登录了...}其余登录办法// 登录Auth::login($user);// 登录并记住给定用户...Auth::login($user, true);// 指定看管器实例登录Auth::guard('admin')->login($user);// 通过 ID 将用户登录到利用Auth::loginUsingId(1);//登录并记住给定用户...Auth::loginUsingId(1, true);// 仅验证一次用户身份,不应用 session 或 cookiesAuth::once($credentials)爱护路由Laravel 自带了一个 auth 中间件,定义在 Illuminate\Auth\Middleware\Authenticate 中。因为这个中间件曾经在 HTTP 内核中注册,只需把这个中间件附加到路由定义中即可: ...

May 21, 2021 · 1 min · jiezi

关于php:SPL-数据结构双向链表堆栈队列

在php中,spl扩大提供了一些罕用的数据结构供咱们应用。只是因为php中存在万能的数组,所以对于数据结构的意识以及相干数据结构的应用会比拟少。以下整顿梳理了spl中提供的一些数据结构以及应用阐明,使咱们对于相干数据结构以及根本应用有肯定认知。这一篇中将介绍 双向链表,堆栈 和 队列。 双向链表以下为百度百科中对于双向链表的解释 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,别离指向间接后继和间接前驱。所以,从双向链表中的任意一个结点开始,都能够很不便地拜访它的前驱结点和后继结点。个别咱们都结构双向循环链表。php spl中,提供了SplDoublyLinkedList用于实现双向列表,上面代码列出一些罕用的性能 $list = new SplDoublyLinkedList();$list->push('a');$list->push('b');$list->push('c');$list->push('d');echo "链表长度:" . count($list) . PHP_EOL;$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);echo "FIFO :\n";for ($list->rewind(); $list->valid(); $list->next()) { echo $list->current() . "\n";}$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_LIFO);echo "FILO :\n";for ($list->rewind(); $list->valid(); $list->next()) { echo $list->current() . "\n";}// 双向链表罕用办法echo "链表头部元素:" . $list->bottom() . PHP_EOL;echo "链表尾部元素:" . $list->pop() . PHP_EOL;$list->push("在链表尾部push一个元素");// 从链表尾部pop出一个元素echo "pop链表中的元素:" . $list->pop() . PHP_EOL;// 在链表头部插入元素$list->unshift("first");// 在链表头部删除元素$list->shift();// 以后节点元素为nullecho "以后节点元素:" . $list->current() . PHP_EOL;$list->rewind(); // 重置以后指针 重置到链表尾部echo "重置后节点元素: " . $list->current() . PHP_EOL;// 留神 pre next获取到的值 和 以后的linkList mode关联$list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);$list->prev();echo "以后节点元素:" . $list->current() . PHP_EOL;$list->next();echo "以后节点元素:" . $list->current() . PHP_EOL;Stack (堆栈)Stack 是一种常见的数据结构。特点是只能在一端(称为栈顶top)对数据进行插入和删除。也就是咱们常见的LIFO(Last In First Out)。spl中提供SplStack类实现堆栈。SplStack基于双向列表实现,继承自SplDoublyLinkedList类 ...

May 21, 2021 · 1 min · jiezi

关于php:电商管理系统登录注册界面

1、路由登录拦挡 首先在路由index.js文件中须要挂载路由导航守卫,其中to为将要拜访的门路,from为代表从哪个门路跳转,next是一个函数,示意放行,即进行跳转。 当跳转门路为登录界面时,则进行跳转,若sessionStorage中含有token,则间接登录,若不含有token,则跳转到登录界面。 复制代码router.beforeEach((to,from,next)=>{ if(to.path==='/login') return next() //获取token const tokenStr = window.sessionStorage.getItem('token') if(!tokenStr) return next('/login') next()})复制代码当登陆胜利后,将服务器返回的token保留到sessionStorage,因为token在localStorage中是短暂放弃的,而sessionStorage是仅在会话期间保留,所以抉择将token保留在sessionStorage中。 复制代码login() { this.$refs.loginFormRef.validate(async valid => { if (!valid) return; //验证胜利则发送登录申请({data:res}解构赋值出data,) const { data: res } = await this.$http.post('login', this.loginForm); if (res.meta.status !== 200) return this.$message.error('登录失败!'); this.$message.success('登录胜利'); //弹框成果 window.sessionStorage.setItem('token', res.data.token); //通过编程式导航跳转到后盾主页,路由地址是/home this.$router.push('home')})}复制代码为了使得我的项目中除了登录之外的其余API接口,都必须在登陆后能力拜访到,所以须要用到拦截器。在axios的interceptors中进行配置。为每一个申请header带上token。 axios.interceptors.request.use(config=>{ //申请拦挡 //为申请头对象增加token验证的Authorization字段 config.headers.Authorization = window.sessionStorage.getItem('token') return config})当退出登录时,只须要将sessionStorage中的token革除,而后跳转到登录界面即可。 logout() { window.sessionStorage.clear() //删除token this.$router.push('/login') //回到登录页},2、表单的验证规定 采纳Element-UI组件,首先进行引入各组件,通过Vue.use()全局注册组件,以下为表单内的各个组件和对应的验证规定, 复制代码<el-form label-width="0px" ref="loginFormRef" class="login_form" :model="loginForm" :rules="loginFormRules"> <!-- 用户名 --> <el-form-item prop="username"> <el-input prefix-icon="iconfont icon-user" v-model="loginForm.username"></el-input></el-form-item><!-- 明码 --><el-form-item> <el-input prefix-icon="iconfont icon-3702mima" v-model="loginForm.password" type="password"></el-input></el-form-item><el-form-item class='btns'><!-- 按钮 --> <el-button type="primary" @click="login">登录</el-button> <el-button type="info" @click="resetLoginForm">重置</el-button></el-form-item></el-form>复制代码复制代码//表单的验证规定 loginForm: { ...

May 21, 2021 · 1 min · jiezi

关于php:php简单实现分词搜索模糊搜索多关键词搜索模糊查询

<?phpheader("Content-type:text/html;charset=utf-8"); $keywords = "什么是高兴星球?"; for ($i=0; $i <= mb_strlen($keywords); $i++) { // 将关键词的第一个字宰割掉 $a = mb_substr($keywords,$i,mb_strlen($keywords),'utf-8'); // 提取每一段关键词的前2个字作为新的关键词,每个关键词进行一次查问,将查问后果退出数组 // 最初返回数组就是最终的查问后果 $b = mb_substr($a,0,2,'utf-8'); echo $b."<br/>";}?>预处理关键词从0开始关键词的第一个字截掉,作为新的预处理关键词。 分词而后,将每一个截掉第一个字的关键词进行截取后面2个字作为独立的关键词,即分词。 最初对每个关键词进行查询数据库,如果查问到后果就退出到一个数组中,没有后果就不退出数组,始终将所有关键词都查完,将后果输入即可。 Web:www.likeyuns.comAuthor:TANKINGWeChat:sansure2016

May 21, 2021 · 1 min · jiezi

关于php:PHP的Hash信息摘要扩展框架

明天咱们次要学习的是 PHP 中一些 Hash 散列加密相干的扩大函数的应用,而不是 Hash 算法,这种加密其实也只是一种更简单一些的密钥算法,与 Hash 算法相似的是,咱们输出的一串字符串,就像一个 Hash 表一样有其对应的 Hash 散列值,实质上和一般的数据结构中的 Hash 键值映射是一个情理,只是其算法更简单一些。其实只有做过一段时间的 PHP 开发,肯定会对两个函数很相熟,它们就是 md5() 和 sha1() 。这两个函数就是别离生成 md5 和 sha1 算法的 Hash 加密。不过,明天咱们学习的相比这两个函数更加的简单一些,算法模式也更丰盛一些。 什么是 Hash 信息摘要算法通常,咱们将一段内容输出一个 Hash 函数后,返回的一串散列字符串就是这个输出值的 Hash 信息摘要。在 PHP 中,不论是 md5 还是 sha1 ,同样的输出会产生同样的后果。由此,如果在保留用户明码类的信息时,咱们尽量不要只应用一层 Hash ,因为这种模式的加密是能够通过彩虹表暴力破解进去的。咱们能够对明码进行多层 Hash 并加盐来实现散列值的复杂化。 当然,Hash 算法并不止咱们罕用的 md5 和 sha1 ,还有很多其它类型的算法,只是咱们并不罕用。然而,明天介绍的函数正是能够进行多种不同类型的 Hash 加密的一组函数,它们曾经在 PHP 中集成到了默认环境中,咱们并不需要独自的扩大就能够应用,这样,就为咱们的加密数据多样化带来了更多的不便。 PHP 反对的 Hash 算法print_r(hash_algos());// Array// (// [0] => md2// [1] => md4// [2] => md5// [3] => sha1// [4] => sha224// [5] => sha256// [6] => sha384// [7] => sha512/224// [8] => sha512/256// [9] => sha512// [10] => sha3-224// [11] => sha3-256// [12] => sha3-384// [13] => sha3-512// [14] => ripemd128// [15] => ripemd160// [16] => ripemd256// [17] => ripemd320// [18] => whirlpool// [19] => tiger128,3// [20] => tiger160,3// [21] => tiger192,3// [22] => tiger128,4// [23] => tiger160,4// [24] => tiger192,4// [25] => snefru// [26] => snefru256// [27] => gost// [28] => gost-crypto// [29] => adler32// [30] => crc32// [31] => crc32b// [32] => fnv132// [33] => fnv1a32// [34] => fnv164// [35] => fnv1a64// [36] => joaat// [37] => haval128,3// [38] => haval160,3// [39] => haval192,3// [40] => haval224,3// [41] => haval256,3// [42] => haval128,4// [43] => haval160,4// [44] => haval192,4// [45] => haval224,4// [46] => haval256,4// [47] => haval128,5// [48] => haval160,5// [49] => haval192,5// [50] => haval224,5// [51] => haval256,5// )$data = "咱们来测试一下Hash算法!"; foreach (hash_algos() as $v) { $r = hash($v, $data); echo $v, ':', strlen($r), '::', $r, PHP_EOL; }// md2:32::3d63d5f6ce9f03379fb3ae5e1436bf08// md4:32::e9dc8afa241bae1bccb7c58d4de8b14d// md5:32::2801b208ec396a2fc80225466e17acac// sha1:40::0f029efe9f1115e401b781de77bf1d469ecee6a9// sha224:56::3faf937348ec54936be13b63feee846d741f8391be0a62b4d5bbb2c8// sha256:64::8f0bbe9288f6dfd2c6d526a08b1fed61352c894ce0337c4e432d97570ae521e3// sha384:96::3d7d51e05076b20f07dad295b161854d769808b54b784909901784f2e76db212612ebe6fe56c6d014b20bd97e5434658// ……foreach (hash_hmac_algos() as $v) { $r = hash_hmac($v, $data, 'secret'); echo $v, ':', strlen($r), '::', $r, PHP_EOL; }// md2:32::70933e963edd0dcd4666ab9253a55a12// md4:32::d2eda43ee4fab5afc067fd63ae6390f1// md5:32::68bf5963e1426a1feff8149da0d0b88d// sha1:40::504bc44704b48ac75435cdccf81e0f056bac98ba// sha224:56::8beaf35baedc2cd5725c760ec77d119e3373f14953c74818f1243f69// sha256:64::23f2e6685fe368dd3ebe36e1d3d672ce8306500366ba0e8a19467c94e13ddace// sha384:96::740ce7488856737ed57d7b0d1224d053905661ffca083c02c6a9a9230499a4a3d96ff0a951b8d03dbafeeeb5c84a65a6// ……通过 hash_algos() 和 hash_hmac_algos() 函数,咱们就能够获取到以后 PHP 环境中所反对的所有 Hash 算法,咱们能够见到相熟的 md5 和 sha1 ,也能见到 md2 、 sha224 、 ripemd320 、fnv1a64 等这些很少见到的算法。而后咱们通过遍历这两个函数返回的内容,并应用 hash() 和 hash_hmac() 函数来对数据进行 Hash 加密并查看它们的内容就能够发现每种算法都可能胜利返回不同的加密信息摘要,而且有不同的位数。 ...

May 21, 2021 · 3 min · jiezi

关于php:Laravel-Collection-实际使用

这篇笔记用来整顿Collection 在Laravel 的理论利用场景。 求和需要:遍历$orders 数组,求price 的和。<?php// 引入packagerequire __DIR__ . '/vendor/autoload.php';$orders = [[ 'id' => 1, 'user_id' => 1, 'number' => '13908080808', 'status' => 0, 'fee' => 10, 'discount' => 44, 'order_products'=> [ ['order_id'=>1,'product_id'=>1,'param'=>'6寸','price'=>555.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]], ['order_id'=>1,'product_id'=>1,'param'=>'7寸','price'=>333.00,'product'=>['id'=>1,'name'=>'蛋糕名称','images'=>[]]], ],]];应用传统的foreach 形式进行遍历:$sum = 0;foreach ($orders as $order) { foreach ($order['order_products'] as $item) { $sum += $item['price']; }}echo $sum;应用汇合的map、flatten、sum:$sum = collect($orders)->map(function($order){ return $order['order_products'];})->flatten(1)->map(function($order){ return $order['price'];})->sum();echo $sum;map:遍历汇合,返回一个新的汇合。flatten:将多维数组转换为一维。sum:返回数组的和。 应用汇合的flatMap、pluck、sum:$sum = collect($orders)->flatMap(function($order){ return $order['order_products'];})->pluck('price')->sum();echo $sum;flatMap:和map 相似,不过区别在于flatMap 能够间接应用返回的新汇合。 应用汇合的flatMap、sum:$sum = collect($orders)->flatMap(function($order){ return $order['order_products'];})->sum('price');sum:能够接管一个列名作为参数进行求和。 ...

May 20, 2021 · 3 min · jiezi

关于php:只需要研究学习一个小时就可以学会微擎模块应用开发

第一步: 在你的微擎零碎addons文件夹上面,新建一个目录,命名为:zhiwu55_cn,这个就是微擎模块利用的标识,类拟人的身份证号一样,如下图所示。 第二步: 方才新建的zhiwu55_cn目录上面,创立template、manifest.xml、site.php这三个文件,其中icon.jpg图标可选,不要也能够,如下图所示。 第三步: 编写微擎利用模块的配置文件manifest.xml,内容如下: <?xml version="1.0" encoding="utf-8"?><manifest xmlns="https://www.w7.cc/" versionCode=""> <application setting='false'> <name><![CDATA[收费下载微擎利用]]></name> <identifie><![CDATA[zhiwu55_cn]]></identifie> <version><![CDATA[1.0.0]]></version> <ability><![CDATA[收费下载微擎利用]]></ability> <type><![CDATA[activity]]></type> <description><![CDATA[收费下载微擎利用]]></description> <author><![CDATA[w7]]></author> <url><![CDATA[]]></url> <setting><![CDATA[]]></setting> </application> <platform> <subscribes> </subscribes> <handles> <message type="text" /> </handles> <rule embed="false" /> <card embed="false" /> <supports> <item type="app" /> <item type="wxapp" /> <item type="webapp" /> </supports> </platform> <bindings> <menu> <entry title="微擎模块" do="Zhiwu55comAll" icon="fa fa-hand-o-right animated flash infinite" state="" direct="1" displayorder="1" /> </menu> <shortcut> </shortcut> </bindings> <install> <![CDATA[]]> </install> <uninstall> <![CDATA[]]> </uninstall> <upgrade> <![CDATA[]]> </upgrade></manifest>第四步: 编写微擎的后盾管理文件site.php文件,内容如下: <?phpdefined('IN_IA') or exit('Access Denied');class zhiwu55_cnModuleSite extends WeModuleSite { public function doWebZhiwu55comAll() { global $_W, $_GPC; $uniaccount = array(); $uniaccount = pdo_get('uni_account', array('uniacid' => $_W['uniacid'])); if(empty($uniaccount['name'])) { $myname='微擎模块'; } else { $myname=$uniaccount['name']; } $siteUrl=base64_decode("aHR0cDovL3c3LmRlbW8uemhpd3U1NS5jb20="); if(empty($uniaccount['logo'])) { $logoUrl=$siteUrl.'/attachment/headimg_2.jpg'; } else { $logoUrl=tomedia($uniaccount['logo']); } load()->func('communication'); $dataArr=ihttp_get($siteUrl.'/data.php'); $dataStr=$dataArr['content']; $dataStr=base64_decode($dataStr); $dataArr=iunserializer($dataStr); include $this->template("Zhiwu55comAll"); }}第五步: 编写site.php文件中,有一个doWebZhiwu55comAll()函数,蕴含了Zhiwu55comAll模板文件,位于template文件夹上面,创立一个Zhiwu55comAll.html模板文件,如下图所示。 ...

May 20, 2021 · 1 min · jiezi

关于php:书籍赠送丨Flink-jmtm启动过程和资源分配直播预告

5月20日晚19点,袋鼠云数栈技术研发团队开发工程师——吹雪,将会为大家直播分享《Flink jm、tm启动过程和资源分配》。 课程内容次要包含以下三点: 1、flink jm启动过程2、flink jm资源分配3、flink tm启动过程 通过对课程的学习,大家能理解jm和tm各自职责,并理解jm和tm之间有何分割,有助于进一步了解和应用FlinkX工具。 本次流动将会在钉钉群、微信视频号和B站同步直播,欢送大家准时加入! 以下这两个开源我的项目地址任选其一 Github开源我的项目地址: https://github.com/DTStack/fl... 点【Star】截图示例: Gitee开源我的项目地址: https://gitee.com/dtstack_dev... 点【Star】截图示例: 【流动阐明】 本次流动开奖工夫为5月25日18点,请中奖的同学将收货地址发送到数栈研习社公众号后盾,奖品将在三个工作日内寄出,本次流动最终解释权归数栈研习社所有。

May 20, 2021 · 1 min · jiezi

关于php:PHP的加密伪随机数生成器的使用

明天咱们来介绍的是 PHP 中的加密伪随机数生成器(CSPRNG 扩大)。随机数的生成其实非常简单,应用 rand() 或者 mt_rand() 函数就能够了,然而咱们明天说的这个则是应用了更简单算法的一套随机数生成器。rand() 曾经不是很举荐应用了,mt_rand() 的生成速度更快一些,也是当初的支流函数,而加密的伪随机数生成函数则是明码平安的,速度会比 mt_rand() 略慢一点。它须要依赖操作系统的一些函数,这个咱们前面再说。 这个加密扩大曾经集成在 PHP7 中,不须要特地的装置,如果是 PHP7 以下的版本须要独立装置扩大。如果在测试时找不到上面介绍的函数,请查看以后 PHP 的版本。 伪随机字符生成var_dump(bin2hex(random_bytes(5)));// string(10) "f28dc2bdd5"var_dump(random_bytes(5));// string(5) "�"��"random_bytes() 每次调用都会生成不同内容的二进制字符串,而参数则是二进制的字节长度。间接获取到的二进制数据是乱码格局的,所以个别咱们会须要应用 bin2hex() 来将二进制转换成咱们能够看懂的十六进制格局字符串。不过由此带来的后果就是咱们转换之后的十六进制的字符长度是咱们设定的字符长度的 2 倍。这个函数的作用,能够为咱们生成平安的用户明码 salt 、 密钥关键字 或者 初始化向量。 random_bytes() 每次调用都会生成不同内容的字符串,而参数则是字符长度的随机字符,在这里咱们传递的是 5 ,返回了 10 个字符,能够看出这个参数是字符数量,而返回的其实是字节数量,对应一个字符占用两个字节的返回模式。或者咱们就间接记住它返回的就是参数的两倍即可。至于这个函数的作用嘛,能够为咱们生成平安的用户明码 salt 、 密钥关键字 或者 初始化向量。 伪随机整数生成var_dump(random_int(100, 999));var_dump(random_int(-1000, 0));// int(900)// int(-791)对于整数数字的生成就更简略了,为 random_int() 函数提供两个参数,也就是随机整数的范畴就能够了。其实和 mt_rand() 的用法一样。 生成起源上述两种加密伪随机函数的生成起源都是依赖于操作系统的,具体如下: 在 Windows 零碎,会应用 CryptGenRandom() 函数。从7.2.0开始应用CNG-API在 Linux 零碎,会应用 Linux getrandom(2) 零碎调用在其余零碎,会应用 /dev/urandom否则将抛出异样异常情况这两个函数也有相应的异常情况会呈现,比方下面找不到生成起源的话就会抛出异样,当然,除了这个之外还会有其它的因素也会导致异样的产生。 如果找不到适当的随机性起源,将抛出异样如果给定的参数有效,将引发 TypeError如果给定的字节长度有效,将引发谬误总结明天的内容非常简单,而且还发现了 random_bytes() 这个函数的秒用,当前不必再本人去写随机生成 salt 的函数了,就像咱们之间介绍明码加盐文章中 什么叫给明码“加盐”?如何平安的为你的用户明码“加盐”? 的那个随机字符生成函数(generateSalt)根本就能够用这个来代替了。是不是感觉播种满满呢,学习的脚步从未停下,让咱们持续一起摸索更好玩的内容吧!! ...

May 20, 2021 · 1 min · jiezi

关于php:yiilogtarget-监控系统异常且多渠道发送异常信息通知

yii-log-target - 监控零碎异样且多渠道发送异样信息告诉(Bark、Chanify、钉钉群机器人、飞书群机器人、Server 酱、企业微信群机器人、息知)。环境要求PHP >= 7.2yiisoft/yii2 > 2.0装置$ composer require guanguans/yii-log-target --prefer-dist -vvv配置Yii2 配置文件 config/main.php 的日志组件中配置: 'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'levels' => ['error', 'warning'], ], // // Bark // [ // 'class' => \Guanguans\YiiLogTarget\BarkTarget::class, // 'levels' => ['error'], // // 'debug' => true, // 'token' => 'PXb8KDj9dHStfQ5cGJ5', // ], // // // Chanify // [ // 'class' => \Guanguans\YiiLogTarget\ChanifyTarget::class, // 'levels' => ['error'], // // 'debug' => true, // 'token' => 'P3IgGEiJBQVdIWlVKS1JORVY0UlVETFZYVVpRTlNLTlVZVlZPT1JFGhR7vAyf8Uj5UQhhK4n6QfVzih96QyIECAEQAQ.G4z2i0VZP7lOiCKYif4LOXu3cBdizl-PLWYn_7zrGXQ', // ], // // 钉钉群机器人 [ 'class' => \Guanguans\YiiLogTarget\DingTalkTarget::class, 'levels' => ['error'], // 'debug' => true, 'keyword' => 'keyword', 'token' => 'fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73eeb', // 'secret' => 'SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730', ], // // // 飞书群机器人 // [ // 'class' => \Guanguans\YiiLogTarget\FeiShuTarget::class, // 'levels' => ['error'], // // 'debug' => true, // 'keyword' => 'keyword', // 'token' => 'b70d9-6e19-4f87-af48-348b0281866c', // // 'secret' => 'iigDOvnsIn6aFS1pYHHEHh', // ], // // // Server 酱 // [ // 'class' => \Guanguans\YiiLogTarget\ServerChanTarget::class, // 'levels' => ['error'], // // 'debug' => true, // 'token' => '35149Thtf1g2Bc14QJuQ6HFpW5YGXm', // ], // // // 企业微信群机器人 // [ // 'class' => \Guanguans\YiiLogTarget\WeWorkTarget::class, // 'levels' => ['error'], // // 'debug' => true, // 'token' => '3d5a3-ceff-4da8-bcf3-ff5891778fb7', // ], // // // 息知 // [ // 'class' => \Guanguans\YiiLogTarget\XiZhiTarget::class, // 'levels' => ['error'], // // 'debug' => true, // 'token' => '60aea56567ae39a1b1920cbc42bb5bd', // ], ],],测试示例Yii::error('测试');源码链接https://github.com/guanguans/yii-log-target相干我的项目https://github.com/guanguans/notify

May 19, 2021 · 2 min · jiezi

关于php:python能开发游戏吗

python能够写游戏,但不适宜。上面咱们来剖析一下具体起因。 用锤子能造汽车吗? 谁也没法说不能吧?历史上也的确已经有些汽车,是用锤子造出来的。但一般来说,还是用工业机器人更适合对吗? 比拟大型的,应用Python的游戏有两个,一个是《EVE》,还有一个是《文化》。但这仅仅是个例,没有宽泛意义。 一般来说,用来做游戏的语言,有两种。一是C++。。一是C#。。 Python实践上,不仅不适宜做游戏,而是只有大型的程序,都不适宜。只适宜写比拟小型的货色,比方一个计算器,一个爬虫等。 次要有2个方面,一是速度慢,二是语法缺点。 兴许你肯定感觉,Python的语法又洁净,又优雅,怎么还有缺点?但认真想想,为什么别的语言没有这么洁净?没有这么优雅?明明能够间接a=123 干嘛非要写成 int a=123;呢?难道是其余语言的设计者,都有强迫症吗?情理很简略,有得必有失。 如果数据类型,只有字符串和数字,省略掉申明变量的过程,当然不是问题。但只有逻辑一简单,状况就齐全不同了。。。游戏中,你用C#或C++写起来,大略会是这样。 技能 a=xxxx;武器 b=xxxx;角色 c=xxxx;药水 d=xxxx;音乐 e=xxxx; 而Python呢?大略是这个样子 a=xxxxb=xxxxc=xxxxd=xxxx 如果你的代码很少,显然是Python比拟不便。但如果你创立几百个对象,代码超过1万行。。。写到几千行的时候,遇到一个叫x的对象,你还晓得它到底是个啥吗?是一把武器?还是一瓶药水?还是一张图片?一段音频?一盏灯光?一座房子? 不要认为1万行代码很多。。。。1万行连个《斗地主》都写不完。。 用Python写大程序的感觉就是,当你第一天,只写了50行代码,创立了3个类,5个对象。你会感觉太爽了,这相对是世界上最好的语言。。。第二天,你又创立了2个类,5个对象的时候,就感觉有点晕晕的了。第三天,又创立了2个类之后,你会发现自己必须十分认真的看一遍正文,否则就不会写了。第四天,你一整天都在看正文。。。。 这就是动静语言的劣根性。一开始代码量少,看不出任何毛病,各种省事,各种爽。代码量越多,脑子越乱。个别500行以上,效率就会被JAVA,C#之类的语言反超。。1000行,就必须要各种加正文才能看懂了。。2000行,正文就比代码多了。。5000行,正文曾经齐全不论用了,本人基本看不懂本人的代码,须要筹备弃坑了。 总结一下,python不是不能开发游戏,只是并不适合。每种语言都有各自的优缺点,开发游戏这一块或者就是python的毛病吧。 python游戏实例补充: 发牌游戏 游戏介绍四名牌手打牌,电脑随机將52张牌(不合大、小王)发给四名牌手,并在屏幕上显示每位牌手的牌。 面向对象程序设计程序设计步骤设计类,发牌程序设计出三个类: Card类、Hand类和Poke类。 Card类:Card类代表一张牌,其中,FaceNum字段指的是牌面数字1~13,Suit字段指的是花色,”梅”为梅花,”方”为方块,”红”为红桃,”黑”为黑桃。 Hand类:Hand类代表手牌(一个玩家手里拿的牌),能够认为是一位牌手手里的牌,其中,cards列表变量存储牌手手中的牌。能够减少牌、清空手里的牌、把一张牌给别的牌手等操作。 Poke类:Poke类代表一副牌,咱们能够将一副牌看作是有52张牌的牌手,所以继承Hand类。因为其中cards列表变量要存储52张牌,而且要进行发牌、洗牌操作,所以减少如下的办法。 主程序:主程序比较简单,因为有四个牌手,所以生成players列表存储初始化的四位牌手。生成一副牌的对象实例poke1,调用populate()办法生成有52张牌的一副牌,调用huffle()办法洗牌打乱程序,调用deal(players,13)办法别离给每位玩家发13张牌,最初示四位牌手所有的牌。 class Card(): """ A playing card. """ RANKS=["A","2","3","4","5","6","7","8","9","10","J","Q","K"] #牌面数字1-13 SUITS=["梅","方","红","黑"] 梅为梅花,方为方钻,红为红心,黑为黑桃def __init__(self,rank,suit,face_up=True): self.rank=rank #指的是牌面数字1-13 self.suit=suit #suit指的是花色 self.is_face_up=face_up #是否显示牌侧面,True为侧面,False为牌反面 def __str__(self): #print() if self.is_face_up: rep=self.suit+self.rank #+" "+str(self.pic_order()) else: rep="XX" return rep def flip(self): #翻牌办法 self.is_face_up=not self.is_face_up def pic_order(self): #牌的顺序号 if self.rank=="A": FaceNum=1 elif self.rank=="J": FaceNum=11 elif self.rank=="Q": FaceNum=12 elif self.rank=="K": FaceNum=13 else: FaceNum=int(self.rank) if self.suit=="梅": Suit=1 elif self.suit=="方": Suit=2 elif self.suit=="红": Suit=3 else: Suit=4 return (Suit-1)*13+FaceNumclass Hand( ): """ A hand of playing cards. """ def __init__(self): self.cards=[] def __str__(self): if self.cards: rep="" for card in self.cards: ...

May 19, 2021 · 1 min · jiezi

关于php:简单了解Phar代码打包工具的使用

简略理解Phar代码打包工具的应用Phar 是在 PHP5 之后提供的一种相似于将代码打包的工具。实质上是想按照 Java 的 Jar 文件那种模式的代码包,不过自身因为 PHP 是不编译的,所以这个 Phar 实际上就是将代码原样的进行打包,不会进行编译。然而咱们能够对打包的 Phar 包进行压缩操作。 另外,实际上应用过 Phar 包的人非常少,特地是在 Composer 曾经成为事实代码库规范的明天,Phar 就更加难觅踪影了。不过,Composer 的安装包自身也是一个 .phar 的打包文件。最次要的起因,一个是 Phar 这种模式的代码包装置并不像 Composer 一样的简略不便,另一方面,晚期的程序员,特地是 LAMP/LAMP 的程序员,都喜爱去将开源的代码复制过去,而不喜爱间接应用一个工具包。毕竟,源代码在手上让咱们更加虚浮一些。其实,就算是 Composer 这样间接下载的就是源码,咱们也素来没什么人真正的去翻过。而 Composer 相比 Phar 的最大劣势,一个是代码的主动加载,另一个就是规范的 PSR 命令空间和目录标准。这两个在 Phar 中是没有的,所以咱们要应用 Phar 包都必须要 require 一下。 虽说曾经过期了,但咱们还是简略的来学习理解一下。说不定在什么时候咱们就能用上,特地是封装一些外部的专用库函数时,Phar 打包代码的这种形式还是十分有用的。 代码打包咱们先按规范格局建设一个目录树。 在这个目录树中,src 目录寄存源码,build 目录用来寄存生成后的 .phar 代码包。 // index.php<?phprequire_once "phar://myphar.phar/common.php";index.php 文件中,咱们就是简略的援用 common.php 。留神这里应用的是 phar 伪协定来加载的 common.php 文件。对于伪协定的内容咱们之前有过一篇文章进行过解说。 <?php// common.phpclass Manager{ public static function run($config){ echo "AAA", PHP_EOL; var_dump($config); } public static function ChineseMobile($mobile){ if(preg_match("/^1[34578]\d{9}$/", $mobile)){ return true; } return false; }}common.php 文件中只是提供了一个类和两个简略的办法用来测试。run() 办法就是简略的输入打印的内容和传递过去的参数。ChineseMobile() 办法则是咱们提供的一个判断咱们国内手机号的函数。 ...

May 19, 2021 · 2 min · jiezi

关于php:如何在WooCommerce中设置运费免费功能

这篇WooCommerce教程,咱们应用WooCommerce自带的收费的运费配置性能来解说如何设置运费。基本思路是:1.设置配送区域,2.向这些配送区域增加配送办法,3.在配送办法中增加运费费率。你能够按需创立多个配送区域,并为每个配送区域增加多种配送办法和运费费率。 收费的运费配置性能是无限的,如果本文无奈满足的你的运费配置需要,能够查看付费运费插件的配置教程:如何配置WooCommerce运费费率表Table Rate Shipping。 什么是配送区域?配送区域是你想将商品配送/卖到的天文区域。你不仅能够将配送的天文区域细化到具体的城市,譬如:纽约;也能够粗暴的设置为地球大洲,譬如:欧洲。 客户只能看到实用于他的地址和相应区域的配送办法。每个客户只会匹配一个区域。 例如,您能够在WooCommerce中创立以下区域: 你能够按需增加多个区域,每个区域能够蕴含多种配送办法。 如何增加和治理配送区域要设置配送区域,请进入:WooCommerce>Settings>Shipping。如果您没有看到配送选项,请返回WooCommerce>General并查看配送地位(Shipping Location(s) )的设置,不要设置为禁用配送,须要在这里启用运输设置。 第一次拜访WooCommerce>Settings>Shipping时,会提醒增加新区域和默认区域。 依然在这个页面,如下图所示,底部地位有一条配送区域:“Locations not covered by your other zones”,如果你的客户不在你自定义增加的配送区域内,但你又可能反对发货时,你能够向这条配送区域增加配送办法。当然,你也能够不配置。 如果客户购物时输出的送货地址没有匹配的配送区域,零碎将被提醒他:没有可用的配送办法。 因为配送区域是从上到下进行匹配的,因而如果你想不配送某个区域,你能够增加这个区域但不给它增加配送办法。 如何增加一个配送区域进入:WooCommerce > Settings > Shipping > Shipping Zones.点击页面上方的Add shipping zone按钮输出区域名称、区域地位(能够按大洲、国家、城市抉择)、配送办法,其中,在区域地位下方有个Limit to specific zip/postcodes,点击它之后,你能够输出区域的邮编来设置配送区域。最初,点击保留按钮。如何给配送区域排序在配送区域列表中,零碎从上到下匹配客户的收货地址,并且应用第一个匹配到的。如果没有匹配到,那么会应用上文提到的Locations not covered by your other zones。 如何对配送区域排序呢? 进入:WooCommerce > Settings > Shipping > Shipping Zones.鼠标左键按住每行后方的三横杠进行高低拖拽调序 如何编辑、删除配送区域进入:WooCommerce > Settings > Shipping > Shipping Zones。将鼠标悬停在区域名称上,将显示编辑(Edit)和删除(Delete)按钮。抉择“编辑”(Edit),将呈现一个页面,您能够在其中更改名称、地区或配送办法。点击Delete能够删除以后配送区域。 留神:The Locations not covered by your other zones是不能更改名称、删除的,因为当你没有设置其余区域时,它将作为默认。 如何将配送办法增加到配送区域中在增加或编辑配送区域的页面中,咱们能看到shipping methods,这便是配送办法,如下图所示,你能够进行相应的增加、编辑、删除、启用/停用配送办法的操作。 ...

May 19, 2021 · 2 min · jiezi

关于php:notify-多平台通知sdk钉钉飞书企业微信群机器人Server-酱息知BarkChanify

guanguans/notify - 多平台告诉sdk(Bark、Chanify、钉钉群机器人、飞书群机器人、Server 酱、企业微信群机器人、息知)。源码https://github.com/guanguans/notify平台反对BarkChanify钉钉群机器人飞书群机器人Server 酱企业微信群机器人息知环境要求PHP >= 7.2装置$ composer require guanguans/notify -vvv应用Barkuse Guanguans\Notify\Factory;$barkMessage = new \Guanguans\Notify\Messages\BarkMessage([ 'title' => 'This is title.', 'text' => 'This is text.', 'copy' => 'This is copy.', 'url' => 'https://github.com/guanguans/notify', // 'sound' => 'bell', // 'isArchive' => 1, // 'automaticallyCopy' => 1,]);Factory::bark() // ->setBaseUri('The server address of your own deployment.') ->setToken('ihnPXb8KDj9dHStfQ5c') ->setMessage($barkMessage) ->send();Chanify// Text MessageFactory::chanify() // ->setBaseUri('The server address of your own deployment.') ->setToken('fh4gGEiJBQVdIWlVKS1JORVY0UlVETFZYVVpRTlNLTlVZVlZPT1JFGhR7vAyf8Uj5UQhhK4n6QfVzih96QyIECAEQAQ.E0eBnLbfNwWrWZ1YSAZfkCQWZAPdBl6pVr26lRf6Srs') ->setMessage((new \Guanguans\Notify\Messages\Chanify\TextMessage([ 'title' => 'This is title.', 'text' => 'This is text.', // 'copy' => 'This is copy.', // 'actions' => [ // "ActionName1|http://<action host>/<action1>", // "ActionName2|http://<action host>/<action2>", // ], // 'autocopy' => 0, // 'sound' => 0, // 'priority' => 10, ]))) ->send();// Link MessageFactory::chanify() // ->setBaseUri('The server address of your own deployment.') ->setToken('fh4gGEiJBQVdIWlVKS1JORVY0UlVETFZYVVpRTlNLTlVZVlZPT1JFGhR7vAyf8Uj5UQhhK4n6QfVzih96QyIECAEQAQ.E0eBnLbfNwWrWZ1YSAZfkCQWZAPdBl6pVr26lRf6Srs') ->setMessage((new \Guanguans\Notify\Messages\Chanify\LinkMessage([ 'link' => 'https://github.com/guanguans/notify', // 'sound' => 0, // 'priority' => 10, ]))) ->send();钉钉群机器人// Text MessageFactory::dingTalk() ->setToken('c44fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73e') ->setSecret('SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730') ->setMessage((new \Guanguans\Notify\Messages\DingTalk\TextMessage([ 'content' => 'This is content(keyword).', // 'atMobiles' => [13948484984], // 'atUserIds' => [123456], // 'isAtAll' => false, ]))) ->send();// Link MessageFactory::dingTalk() ->setToken('c44fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73e') ->setSecret('SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730') ->setMessage((new \Guanguans\Notify\Messages\DingTalk\LinkMessage([ 'title' => 'This is content.', 'text' => 'This is text(keyword).', 'messageUrl' => 'https://github.com/guanguans/notify', 'picUrl' => 'https://avatars.githubusercontent.com/u/22309277?v=4', ]))) ->send();// Markdown MessageFactory::dingTalk() ->setToken('c44fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73e') ->setSecret('SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730') ->setMessage((new \Guanguans\Notify\Messages\DingTalk\MarkdownMessage([ 'title' => 'This is title.', 'text' => '> This is text(keyword).', // 'atMobiles' => [13948484984], // 'atUserIds' => [123456], // 'isAtAll' => false, ]))) ->send();// Feed Card Message$message = new \Guanguans\Notify\Messages\DingTalk\FeedCardMessage([ 'title' => 'This is title(keyword) 0.', 'messageURL' => 'https://github.com/guanguans/notify', 'picURL' => 'https://avatars.githubusercontent.com/u/22309277?v=4']);Factory::dingTalk() ->setToken('c44fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73e') ->setSecret('SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730') ->setMessage($message) ->send();// Single Action Card MessageFactory::dingTalk() ->setToken('c44fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73e') ->setSecret('SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730') ->setMessage(new \Guanguans\Notify\Messages\DingTalk\SingleActionCardMessage([ 'title' => 'This is title(keyword).', 'text' => 'This is text.', 'singleTitle' => 'This is singleTitle.', 'singleURL' => 'https://avatars.githubusercontent.com/u/22309277?v=4', // 'btnOrientation' => 1 ])) ->send();// Btns Action Card Message$message = new \Guanguans\Notify\Messages\DingTalk\BtnsActionCardMessage([ 'title' => 'This is title(keyword).', 'text' => 'This is text.', // 'hideAvatar' => 1, // 'btnOrientation' => 1,]);$message->addBtn([ 'title' => 'This is title 1', 'actionURL' => 'https://github.com/guanguans/notify',]);$message->addBtn([ 'title' => 'This is title 2', 'actionURL' => 'https://github.com/guanguans/notify',]);Factory::dingTalk() ->setToken('c44fec1ddaa8a833156efb77b7865d62ae13775418030d94d05da08bfca73e') ->setSecret('SECc32bb7345c0f73da2b9786f0f7dd5083bd768a29b82e6d460149d730eee51730') ->setMessage($message) ->send();飞书群机器人// Text MessageFactory::feiShu() ->setToken('b6eb70d9-6e19-4f87-af48-348b028186') ->setSecret('iigDOvnsIn6aFS1pYHHEHh') ->setMessage(new \Guanguans\Notify\Messages\FeiShu\TextMessage('This is title(keyword).')) ->send();// Post Message$post = [ 'zh_cn' => [ 'title' => '我的项目更新告诉', 'content' => [ [ [ "tag" => "text", "text" => "我的项目有更新(keyword)" ] ] ] ]];Factory::feiShu() ->setToken('b6eb70d9-6e19-4f87-af48-348b028186') ->setSecret('iigDOvnsIn6aFS1pYHHEHh') ->setMessage(new \Guanguans\Notify\Messages\FeiShu\PostMessage($post)) ->send();// Image MessageFactory::feiShu() ->setToken('b6eb70d9-6e19-4f87-af48-348b028186') ->setSecret('iigDOvnsIn6aFS1pYHHEHh') ->setMessage(new \Guanguans\Notify\Messages\FeiShu\ImageMessage('img_ecffc3b9-8f14-400f-a014-05eca1a4xxxx')) ->send();// ShareChat MessageFactory::feiShu() ->setToken('b6eb70d9-6e19-4f87-af48-348b028186') ->setSecret('iigDOvnsIn6aFS1pYHHEHh') ->setMessage(new \Guanguans\Notify\Messages\FeiShu\ShareChatMessage('oc_f5b1a7eb27ae2c7b6adc2a74fafxxxxx')) ->send();// Card Message$card = [ 'elements' => [ [ 'tag' => 'div', 'text' => [ 'content' => '**西湖(keyword)**,位于浙江省杭州市西湖区龙井路1号,杭州市区西部,景区总面积49平方千米,汇水面积为21.22平方千米,湖面面积为6.38平方千米。', 'tag' => 'lark_md', ], ], ],];Factory::feiShu() ->setToken('b6eb70d9-6e19-4f87-af48-348b0281866c') ->setSecret('iigDOvnsIn6aFS1pYHHEHh') ->setMessage(new \Guanguans\Notify\Messages\FeiShu\CardMessage($card)) ->send();Server 酱Factory::serverChan() ->setToken('SCT35149Thtf1g2Bc14QJuQ6HFpW5YG') ->setMessage(new \Guanguans\Notify\Messages\ServerChanMessage('This is title.', 'This is desp.')) ->send();// CheckFactory::serverChan()->check(3334849, 'SCTJlJV1J87hS');企业微信群机器人// Text MessageFactory::weWork() ->setToken('73a3d5a3-ceff-4da8-bcf3-ff5891778f') ->setMessage((new \Guanguans\Notify\Messages\WeWork\TextMessage([ 'content' => 'This is content.', // 'mentioned_list' => ["wangqing", "@all"], // 'mentioned_mobile_list' => ["13800001111", "@all"], ]))) ->send();// Markdown MessageFactory::weWork() ->setToken('73a3d5a3-ceff-4da8-bcf3-ff5891778f') ->setMessage(new \Guanguans\Notify\Messages\WeWork\MarkdownMessage("# This is title.\n This is content.")) ->send();// Image MessageFactory::weWork() ->setToken('73a3d5a3-ceff-4da8-bcf3-ff5891778f') ->setMessage(new \Guanguans\Notify\Messages\WeWork\ImageMessage('https://avatars.githubusercontent.com/u/22309277?v=4')) ->send();// News Message$message = new \Guanguans\Notify\Messages\WeWork\NewsMessage([ 'title' => 'This is title1.', 'description' => 'This is description.', 'url' => 'https://github.com/guanguans/notify', 'picurl' => 'https://avatars.githubusercontent.com/u/22309277?v=4',]);$message->addArticle([ 'title' => 'This is title2.', 'description' => 'This is description.', 'url' => 'https://github.com/guanguans/notify', 'picurl' => 'https://avatars.githubusercontent.com/u/22309277?v=4',]);Factory::weWork() ->setToken('73a3d5a3-ceff-4da8-bcf3-ff5891778f') ->setMessage($message) ->send();息知// SingleFactory::xiZhi() // ->setType('single') ->setToken('XZd60aea56567ae39a1b1920cbc42bb5') ->setMessage(new \Guanguans\Notify\Messages\XiZhiMessage('This is title.', 'This is content.')) ->send();// ChannelFactory::xiZhi() ->setType('channel') ->setToken('XZ8da15b55a6725497232d87298bcd34') ->setMessage(new \Guanguans\Notify\Messages\XiZhiMessage('This is title.', 'This is content.')) ->send();

May 18, 2021 · 3 min · jiezi

关于php:PHP-CallbackCallable-类型使用

测试代码<?php/** * Class ParentCallback */class ParentCallback{ /** * @param int $a * @param int $b * @param int $c * * @return int */ public static function parentSum(int $a, int $b, int $c) { return $a + $b + $c; } /** * @param int $a * @param int $b * @param int $c * * @return float|int */ public function parentMultiply(int $a, int $b, int $c) { return $a * $b * $c; }}/** * Class Callback */class Callback extends ParentCallback{ /** * @param int $a * @param int $b * * @return int */ public static function sum(int $a, int $b) { return $a + $b; } /** * @param int $a * @param int $b * * @return float|int */ public function multiply(int $a, int $b) { return $a * $b; }}/** * Class Invoke */class Invoke{ /** * @param int $a * @param int $b * * @return float|int */ public function __invoke(int $a, int $b) { return $a / $b; }}/** * @param int $a * @param int $b * * @return int */function sum(int $a, int $b){ return $a + $b;}/** * @param $callback * @param mixed ...$parameter * * @return mixed */function do_something(callable $callback, ...$parameter){ return call_user_func($callback, ...$parameter);}测试示例// 闭包$ret = do_something(function ($a, $b){ return $a - $b;}, 5, 6);printf("闭包测试示例: %s\n", $ret);// 函数$ret = do_something('sum', 5, 6);printf("函数测试示例: %s\n", $ret);// 静态方法$ret = do_something([Callback::class, 'sum'], 5, 6);printf("静态方法示例: %s\n", $ret);$ret = do_something('\Callback::sum', 5, 6);printf("静态方法示例: %s\n", $ret);$ret = do_something([Callback::class, 'self::parentSum'], 5, 6, 7);printf("静态方法示例: %s\n", $ret);$ret = do_something([Callback::class, 'parentSum'], 5, 6, 7);printf("静态方法示例: %s\n", $ret);$ret = do_something([Callback::class, 'parent::parentSum'], 5, 6, 7);printf("静态方法示例: %s\n", $ret);// 办法$callback = new Callback;$ret = do_something([$callback, 'multiply'], 5, 6);printf("一般办法示例: %s\n", $ret);// invoke$invoke = new Invoke;$ret = do_something($invoke, 5, 6);printf("对象 invoke 示例: %s\n", $ret);测试后果闭包测试示例: -1函数测试示例: 11静态方法示例: 11静态方法示例: 11静态方法示例: 18静态方法示例: 18静态方法示例: 18一般办法示例: 30对象 invoke 示例: 0.83333333333333参考链接https://www.php.net/manual/zh/language.types.callable.php原文链接https://github.com/guanguans/guanguans.github.io

May 18, 2021 · 2 min · jiezi

关于php:PHPDebug互动扩展phpdbg功能浅析

对于 PHP 开发者来说,单步的断点 Debug 调试并不是咱们的必修课,而 Java 、 C# 、 C++ 这些动态语言则会经常性地进行这种调试。其实,咱们 PHP 也是反对这类调试形式的,特地是对于理解一些开源框架,或者有十分深层次的 Bug 跟踪时,断点调试会十分有用。 不少接触过 PHP 断点调试的肯定都用过鼎鼎大名的 XDebug 。不过咱们明天讲的并不是这款扩大,而是另一个曾经集成到 PHP 官网源码中的调试工具,并且,最重要的是,它调试时看到的内容是更为底层的 opcode 执行过程。话不多说,咱们间接进入到 phpdbg 这款工具的学习中吧!! phpdbg 命令行性能在咱们装置好 PHP 后,默认就有了 phpdbg 这个工具。间接在命令行运行就会进入这个工具。 % phpdbg[Welcome to phpdbg, the interactive PHP debugger, v0.5.0]To get help using phpdbg type "help" and press enter[Please report bugs to <http://bugs.php.net/report.php>]没错,它就是随 PHP 装置的时候默认自带的,如果你的环境变量中没有这个工具命令的话,能够在 PHP 装置目录的 bin/ 目录上面找到。 在进入 phpdbg 环境后,咱们应用 help 就能够查看它的操作阐明。 prompt> helpphpdbg is a lightweight, powerful and easy to use debugging platform for PHP5.4+It supports the following commands:Information list list PHP source info displays information on the debug session print show opcodes frame select a stack frame and print a stack frame summary generator show active generators or select a generator frame back shows the current backtrace help provide help on a topic……帮忙文档十分长,大家能够本人查看具体的内容,其中有一个 help 命令能够让咱们看到许多简写的命令,咱们次要应用这些简写的命令别名就能够。 ...

May 18, 2021 · 3 min · jiezi

关于php:php相关

整顿点须要整明确的。 1.nginx和apache有什么区别?2.nginx的异步非阻塞是怎么实现的?或者说I/O多路复用理解吗?3.nginx的内存调配理解吗?(有点懵,不晓得什么状况)4.或者说过程的内存划分理解吗?5.说一下动态变量在内存什么中央?我说了全局区,面试官问我有全局区这个货色吗?我有点蒙6.过程和线程理解吗?7.你刚刚说线程切换代价更小,那是为什么呢?线程切换会执行什么操作?8.互斥和同步你晓得吗?9.过程和线程哪些资源共享哪些独占呢?

May 17, 2021 · 1 min · jiezi

关于php:laravel中job使用

一、应用目标:异步执行耗时操作二、操作1、生成jobphp artisan make:job UserLoginSendEmail namespace App\Jobs;use Illuminate\Bus\Queueable;use Illuminate\Contracts\Queue\ShouldQueue;use Illuminate\Foundation\Bus\Dispatchable;use Illuminate\Queue\InteractsWithQueue;use Illuminate\Queue\SerializesModels;class UserLoginSendEmail implements ShouldQueue{ use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; public $data; /** * Create a new job instance. * * @return void */ public function __construct($data) { $this->data = $data; } /** * Execute the job. * * @return void */ public function handle() { info('UserLoginSendEmail'.date('Y-m-d H:i:s').json_encode($this->data,JSON_UNESCAPED_UNICODE)); }}2、控制器中增加job散发 public function register(Request $request){ $data = [ 'id' => '1', 'username' => 'testname', 'email' => '1078962834@qq.com' ]; //发送邮件job UserLoginSendEmail::dispatch($data); }3、运行队列执行散发的job ...

May 17, 2021 · 1 min · jiezi

关于php:laravel事件系统操作

一、应用目标:简化代码,使需要逻辑异步执行二、同步事件操作步骤1、新建事件php artisan make:event UserLogin namespace App\Events;use Illuminate\Broadcasting\Channel;use Illuminate\Broadcasting\InteractsWithSockets;use Illuminate\Broadcasting\PresenceChannel;use Illuminate\Broadcasting\PrivateChannel;use Illuminate\Contracts\Broadcasting\ShouldBroadcast;use Illuminate\Foundation\Events\Dispatchable;use Illuminate\Queue\SerializesModels;class UserLogin{ use Dispatchable, InteractsWithSockets, SerializesModels; //定义public listener 会应用到 public $data; /** * Create a new event instance. * * @return void */ public function __construct($data) { $this->data = $data; } /** * Get the channels the event should broadcast on. * * @return \Illuminate\Broadcasting\Channel|array */ public function broadcastOn() { return new PrivateChannel('userLogin'); }}2、事件监听app/Providers/EventServiceProvider.php namespace App\Providers;use App\Events\UserLogin;use Illuminate\Auth\Events\Registered;use Illuminate\Auth\Listeners\SendEmailVerificationNotification;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;use Illuminate\Support\Facades\Event;class EventServiceProvider extends ServiceProvider{ /** * The event listener mappings for the application. * * @var array */ protected $listen = [ Registered::class => [ SendEmailVerificationNotification::class, ], //用户登录胜利后事件处理 UserLogin::class => [ 'App\Listeners\UserLogin\WriteLog',//记录日志操作 'App\Listeners\UserLogin\ActiveOperate',//沉闷操作 ] ]; /** * Register any events for your application. * * @return void */ public function boot() { parent::boot(); // }}3、生成监听者php artisan event:generate ...

May 17, 2021 · 2 min · jiezi

关于php:PHP中环境变量的操作

在 PHP 中,咱们能够通过 phpinfo() 查看到以后零碎中的环境变量信息(Environment)。在代码中,咱们也能够通过两个函数,查看和批改相应的环境变量信息。 getenv() 获取环境变量信息在不传参数的状况下,咱们能够通过 getenv() 这个函数取得所有的环境变量信息。不过须要留神的是,在 CLI 环境和 SAPI 环境下它所返回的信息是不一样的。 print_r(getenv());// CLI// Array// (// [USER] => zhangyue// [PATH] => /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Applications/VMware Fusion.app/Contents/Public:/Applications/Wireshark.app/Contents/MacOS// [LOGNAME] => zhangyue// [SSH_AUTH_SOCK] => /private/tmp/com.apple.launchd.h3szqpYfSH/Listeners// [HOME] => /Users/zhangyue// [SHELL] => /bin/zsh// [__CF_USER_TEXT_ENCODING] => 0x1F5:0x19:0x34// [TMPDIR] => /var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/// [XPC_SERVICE_NAME] => 0// [XPC_FLAGS] => 0x0// [OLDPWD] => /Users/zhangyue/MyDoc/博客文章// [PWD] => /Users/zhangyue/MyDoc/博客文章/dev-blog/php/202006/source// [SHLVL] => 1// [TERM_PROGRAM] => vscode// [TERM_PROGRAM_VERSION] => 1.45.1// [LANG] => en_US.UTF-8// [COLORTERM] => truecolor// [VSCODE_GIT_IPC_HANDLE] => /var/folders/wj/t2z1cfhs0m9gq48krm8nc0vm0000gn/T/vscode-git-a282fa5813.sock// [GIT_ASKPASS] => /Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh// [VSCODE_GIT_ASKPASS_NODE] => /Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Renderer).app/Contents/MacOS/Code Helper (Renderer)// [VSCODE_GIT_ASKPASS_MAIN] => /Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js// [TERM] => xterm-256color// [_] => /usr/local/bin/php// [__KMP_REGISTERED_LIB_9282] => 0x1138dc0f8-cafece1d-libomp.dylib// )// SAPI Nginx// Array// (// [USER] => zhangyue// [HOME] => /Users/zhangyue// )如果 PHP 在诸如 Fast CGI 之类的 SAPI 中运行,则此函数将始终返回由 SAPI 设置的环境变量的值,即便已应用 putenv() 来设置同名的本地环境变量。这个函数是有两个参数的,不过它们都是选填的(PHP7以前必须填变量名)。第一个参数是变量名,也就是能够返回具体的某一个环境变量信息。而第二个参数如果设置为 true 的话,仅返回本地环境变量(由操作系统或 putenv() 设置)。 ...

May 17, 2021 · 1 min · jiezi

关于php:PHP的LZF压缩扩展工具

这次为大家带来的是另外一个 PHP 的压缩扩大,当然也是十分冷门的一种压缩格局,所以应用的人会比拟少,而且在 PHP 中提供的相干的函数也只是对字符串的编码与解码,并没有针对文件的操作。因而,就像 Bzip2 一样,咱们也能够用它来进行一些加密传输的操作。 LZF 扩大间接在 phar.php.net 下载安装即可,也是走得失常的 PHP 的扩大装置的步骤。LZF 压缩算法基于 Lempel-Ziv ,并应用了无限状态熵编码。LZF采纳相似 lz77 和 lzss 的混合编码。应用3种 “起始标记” 来代表每段输入的数据串。对于 LZF 压缩的信息非常少,仅有的查问结果显示是它是 Apple 开源的一种非常简单的字符压缩算法。 根本函数应用$str = "The 2014 World Cup will be hold in .It is a grand occasion for all the football fans all over the world.My favorite team is the Spainish Team.And my favorite football star is Didier Yves Drogba Tébily.I hope the Chinese Teeam can do well in the World Cup.Because China has never won a World Cup before.This year I hope the situation will change.When the match begins, I hope I can watch it.But if I am busy studying thenn I will not watch it.Because study is always the first priority.I wish one day China can hold a World Cup, then our Chinese can watch the matches withouut going abroad.Maybe one day my dream can come true.";$c = lzf_compress($str);echo $c, PHP_EOL;// The 2014 World Cup will be ho in .It is a grand occasion for a *t Bfootb@// fan * over`w@X.My// vorite team@Q@8 Spainish T .A _m�)�Vstar@2Didi WYves Drogba Tébily.I �p \ �Chchange. can do we � �@��.Becau )@1a has ne@�w �a�'! �e.Thye ��msituatAa9// When`omatch Cgins,�;I`�w`it.Bu!ff !busy �udying@Bn `]not�2��s@)Aalways@0 first priAsAwAeone day��Aa��� �!"n our`%AG@'�� ��!witho �go@�abroad@�May"=�i!�dr!�`Dcom!�rue.$v = lzf_decompress($c);echo $v, PHP_EOL;// The 2014 World Cup will be hold in .It is a grand occasion for all the football fans all over the world.My favorite team is the Spainish Team.And my favorite football star is Didier Yves Drogba Tébily.I hope the Chinese Team can do well in the World Cup.Because China has never won a World Cup before.This year I hope the situation will change.// When the match begins,I hope I can watch it.But if I am busy studying then I will not watch it.Because study is always the first priority.I wish one day China can hold a World Cup,then our Chinese can watch the matches without going abroad.echo lzf_optimized_for(), PHP_EOL;// 1// 如果LZF针对速度进行了优化,则返回1;对于压缩,则返回0。LZF 全副就只提供了这三个非常简单的函数。lzf_compress() 用于对字符串进行压缩编码,能够看出咱们输入的压缩之后的内容曾经变成了乱码的模式。然而绝对于 Bzip2 齐全看不懂的编码内容来说,LZF 是能够看到原文的一部分内容的。lzf_decompress() 用于解码曾经编码的字符串内容。lzf_optimized_for() 输入的是 LZF 扩大的编译后运行状态,如果返回的是 1 ,则表明针对以后零碎的速度进行了优化,如果返回的是 0 ,示意的是仅仅是进行了压缩编码。 ...

May 15, 2021 · 2 min · jiezi

关于php:laraveladmin-列表左上角增加返回后退按钮

$grid->tools(function (Grid\Tools $tools) { $tools->append('<a class="btn btn-sm btn-default" onClick="javascript :history.back(-1);">返回</a>');});成果:

May 14, 2021 · 1 min · jiezi

关于php:Swoole-v467-版本发布Bug修复版本

v4.6.7 版本次要是一个 Bug 修复版本,没有向下不兼容改变。 此版本中修复了Http\Response::end()办法总是返回 true 的问题,同时批改了 output_buffer_size 的默认值 在之前的版本中 output_buffer_size 的默认值为2M,因为受到 output_buffer_size 的限度,如果在调用end时,须要发送的内容大于这个限度则会响应失败,并抛出如下谬误: use Swoole\Http\Server;use Swoole\Http\Request;use Swoole\Http\Response;$http = new Server('127.0.0.1', 9501);$http->set([ 'http_compression' => false, 'buffer_output_size' => 128 * 1024,]);$http->on('request', function (Request $request, Response $response) { assert($response->end(str_repeat('A', 256 * 1024)) === false); assert(swoole_last_error() === SWOOLE_ERROR_DATA_LENGTH_TOO_LARGE);});$http->start();应用以上代码即可复现该谬误WARNING finish (ERRNO 1203): The length of data [262144] exceeds the output buffer size[131072], please use the sendfile, chunked transfer mode or adjust the output_buffer_size以前的解决办法为:应用 sendfile、write 或调整 output_buffer_size,而此版本中将output_buffer_size的默认值进步到了无符号 INT 最大值(UINT_MAX) ...

May 14, 2021 · 1 min · jiezi

关于php:酷瓜云课堂-v134-发布知识付费开源方案

v1.3.4(2021-05-13)更新内容减少问答性能减少标签关注性能优化标签性能优化文章性能以及全文搜寻优化课程评估,征询,文章等相干统计后盾减少发问和答复审核性能后盾减少查看用户在线记录修改后盾编辑角色权限谬误优化前台界面降级要点按文档执行降级须要减少全文搜寻配置文件cp config/xs.question.default.ini config/xs.question.ini我的项目介绍酷瓜云课堂,依靠腾讯云根底服务架构,采纳C扩大框架Phalcon开发,GPL-2.0开源协定,致力开源网课零碎,开源网校零碎,开源在线教育零碎。 零碎性能实现了点播、直播、专栏、面授、会员、群组、积分、秒杀等,100%真开源在线教育解决方案,能够收费商用。 托管仓库gitee仓库github仓库意见反馈在线反馈(举荐)官方论坛(举荐)开源助力毫无保留的真开源不容易,如果对你有帮忙,请给咱们 STAR !!!

May 14, 2021 · 1 min · jiezi

关于php:PHP的bz2压缩扩展工具

在日常的开发和电脑应用中,咱们常常会接触到压缩和解压的一些工具,PHP 也为咱们筹备了很多相干的操作扩大包,都有间接可用的函数可能不便的操作一些压缩解压性能。明天,咱们先学习一个比较简单但不太罕用的压缩格局:Bzip2。 装置扩大这个扩大的装置须要零碎有 bzip2-devel 。所以咱们须要先给零碎装上这个软件包的反对,而后这个扩大是随 PHP 安装包一起公布的,所以只须要编译一下 PHP ,并在 ./configure 中增加对应的编译命令即可。 # yum install bzip2-devel# ./configure xxxx --with-bz2# make && make install基本操作Bzip2 提供的函数不多,而且非常简单,咱们首先来看的是将字符串保留到一个文件中。 $bz = bzopen('/tmp/test.bz', 'w');// -rw-r--r-- 1 root root 14 Jun 28 09:51 test.bz$text = "This is Bz Compress";bzwrite($bz, $text);// -rw-r--r-- 1 root root 59 Jun 28 09:53 test.bzbzclose($bz);$bz = bzopen('/tmp/test.bz', 'r');$v = bzread($bz);echo $v, PHP_EOL;// This is Bz Compressbzclose($bz);就和文件操作函数一样,咱们须要先通过 bzopen() 关上文件取得句柄。而后应用 bzwrite() 来写入文件,并应用 bzread() 来读取文件。最初应用 bzclose() 来敞开文件。 ...

May 14, 2021 · 1 min · jiezi

关于php:PHP的命令行扩展Readline相关函数学习

PHP 作为一个 Web 开发语言,相对来说,命令行程序并不是它的主战场。所以很多年老的 PHP 开发者可能连命令行脚本都没有写过,更别提交互式的命令操作了。而明天,咱们带来的这个扩大就是针对 PHP 的交互式命令行操作的。 readline 扩大函数实现了拜访 GNU Readline 库的接口。这些函数提供了可编辑的命令行。一个例子是在 Bash 中容许你应用箭头按键来插入字符或者翻看历史命令。因为这个库的交互个性,这个性能在你写的 Web 程序中没多大用处,然而当你写的脚本被用在命令行中时十分有用。 Readline 扩大的装置Readline 扩大曾经退出了 PHP 的官网安装包中,如果是新的 PHP 环境,那么在编译的时候加上 --with-readline 即可。另外,咱们还须要装置操作系统的 Readline 库。当然,如果曾经是失常运行的 PHP ,也能够从新编译一下。 # yum install -y readline-devel# ./congiure xxxx --with-readline默认状况下,如果没有在编译时减少 --whit-readline ,Readline 的一些函数也是能够应用的,不过它们调用的是零碎的 libedit 库。有一些函数,比方 readline_list_history() 这种函数是无奈应用的。要想残缺的应用 Readline 扩大的能力,那么还是须要装置操作系统的 libreadline 库(下面 yum 装置的那个 readline-devel )并在 PHP 中进行相应参数的编译装置。 根本函数操作Readline 扩大提供的函数不多,也十分的简略易用。 读取一行$line = readline("请输出命令:"); // 读取命令行交互信息echo $line, PHP_EOL; // aaa运行 PHP 代码后,咱们就进入了命令提示符期待状态,并且会提醒“请输出命令:”,当咱们输出了 aaa 并回车之后,输出的内容就保留到了 $line 变量中。 ...

May 13, 2021 · 3 min · jiezi

关于php:phpspreadsheet-内存溢出处理内存优化

phpspreadsheet 内存溢出解决|内存优化设置缓存节俭内存: https://phpspreadsheet.readth... 这里咱们应用 use Symfony\Component\Cache\Adapter\FilesystemAdapter;use Symfony\Component\Cache\Psr16Cache;... $adapter = new FilesystemAdapter('excel', 60*60*10, storage_path('framework/cache/data'));$cache = new Psr16Cache($adapter);\PhpOffice\PhpSpreadsheet\Settings::setCache($cache);指定读取工作表因为默认的状况下咱们只须要读取某个工作表,如果您有多个工作表,但不须要全副加载,则能够应用setLoadSheetsOnly()办法来限度Reader将加载的工作表。加载单个命名工作表 $inputFileType = 'Excel5'; $inputFileName = './sampleData/example1.xls';$sheetname = 'Data Sheet #2'; /** Create a new Reader of the type defined in $inputFileType **/$objReader = PHPExcel_IOFactory::createReader($inputFileType);/** Advise the Reader of which WorkSheets we want to load **/ $objReader->setLoadSheetsOnly($sheetname); /** Load $inputFileName to a PHPExcel Object **/$objPHPExcel = $objReader->load($inputFileName);或者能够通过传递名称数组来一次调用setLoadSheetsOnly()来指定多个工作表 $inputFileType = 'Excel5'; $inputFileName = './sampleData/example1.xls';$sheetnames = array('Data Sheet #1','Data Sheet #3'); /** Create a new Reader of the type defined in $inputFileType **/ $objReader = PHPExcel_IOFactory::createReader($inputFileType);/** Advise the Reader of which WorkSheets we want to load **/ $objReader->setLoadSheetsOnly($sheetnames); /** Load $inputFileName to a PHPExcel Object **/$objPHPExcel = $objReader->load($inputFileName);循环读取excel的时候,断开sheet的链接$m = memory_get_usage();dump("初始化内存: " . $m);$f = '/www/wwwroot/trmk_service/storage/app/excel/app_75535bab9a72a/2021-04-07-feedback.xls';$f2 = '/www/wwwroot/trmk_service/storage/app/excel/app_75535bab9a72a/2021-04-08-feedback.xls';$f3 = '/www/wwwroot/trmk_service/storage/app/excel/app_75535bab9a72a/2021-04-09-feedback.xls';$s = \PhpOffice\PhpSpreadsheet\IOFactory::load($f);$s1 = memory_get_usage();$s->disconnectWorksheets();unset($s);dump("内存使用率 s1: " . $s1);$s = \PhpOffice\PhpSpreadsheet\IOFactory::load($f2);$s2 = memory_get_usage();$s->disconnectWorksheets();unset($s);dump("内存使用率 s2: " . $s2);$s = \PhpOffice\PhpSpreadsheet\IOFactory::load($f);$s3 = memory_get_usage();$s->disconnectWorksheets();unset($s);dump("内存使用率 s3: " . $s3);$s = \PhpOffice\PhpSpreadsheet\IOFactory::load($f3);$s4 = memory_get_usage();$s->disconnectWorksheets();unset($s);dump("内存使用率 s4: " . $s4);# 输入> "初始化内存: 20429136"> "内存使用率 s1: 25156120"> "内存使用率 s2: 25264104"> "内存使用率 s3: 25213496"> "内存使用率 s4: 25234112"> "exit"参考https://stackoverflow.com/que... ...

May 13, 2021 · 1 min · jiezi

关于php:Yii2-Resultful-Api-认证

Yii2 Resultful Api 认证 应用access token 作为用户登录认证信息 1. 批改认证main.php /*** 认证类 ***/'user' => [ 'identityClass' => 'common\models\backend\Admin', 'enableAutoLogin' => true, 'enableSession' => FALSE, // 敞开session // 'identityCookie' => ['name' => '_identity-api', 'httpOnly' => true],],// 'session' => [// 'name' => 'advanced-api',// ],2. 获取access token认证类Admin namespace common\models\backend;use Yii;use yii\web\IdentityInterface;/** * This is the model class for table "admin". * * @property int $id ID * @property string $username 用户名 * @property string $realname 姓名 * @property string $email 电子邮箱 * @property int $status 状态 * @property string $password_hash 明码 * @property string $auth_key 受权key * @property string $password_reset_token 明码重置token * @property string $access_token 拜访token * @property int $expire_at 过期工夫 * @property int $logged_at 登入工夫 * @property int $created_at 创立工夫 * @property int $updated_at 最初批改工夫 */class Admin extends \yii\db\ActiveRecord implements IdentityInterface{ /** * {@inheritdoc} */ public static function tableName() { return 'admin'; } /** * {@inheritdoc} */ public function rules() { return [ [['id', 'email', 'password_hash', 'auth_key'], 'required'], [['id', 'status', 'expire_at', 'logged_at', 'created_at', 'updated_at'], 'integer'], [['username'], 'string', 'max' => 32], [['realname', 'email', 'password_hash', 'auth_key', 'password_reset_token', 'access_token'], 'string', 'max' => 255], ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'username' => '用户名', 'realname' => '姓名', 'email' => '电子邮箱', 'status' => '状态', 'password_hash' => '明码', 'auth_key' => '受权key', 'password_reset_token' => '明码重置token', 'access_token' => '拜访token', 'expire_at' => '过期工夫', 'logged_at' => '登入工夫', 'created_at' => '创立工夫', 'updated_at' => '最初批改工夫', ]; } public static function findIdentity($id) { // TODO: Implement findIdentity() method. } public static function findIdentityByAccessToken($token, $type = NULL) { // TODO: Implement findIdentityByAccessToken() method. } public function getId() { // TODO: Implement getId() method. } public function getAuthKey() { // TODO: Implement getAuthKey() method. } public function validateAuthKey($authKey) { // TODO: Implement validateAuthKey() method. } /** * 应用用户名查找用户 * * @param $username * @return \common\models\backend\Admin|null */ public static function findByUsername($username) { return static::findOne(['username' => $username]); } /** * 验证明码 * * @param string $password password to validate * @return bool if password provided is valid for current user */ public function validatePassword($password) { return Yii::$app->security->validatePassword($password, $this->password_hash); } /** * 生成access token * * @return string * @throws \yii\base\Exception */ public function generateAccessToken() { $this->access_token = Yii::$app->security->generateRandomString(); return $this->access_token; }}控制器文件 ...

May 12, 2021 · 3 min · jiezi

关于php:PHP的另一个高效缓存扩展Yac

之前的文章中咱们曾经学习过一个 PHP 自带的扩大缓存 Apc ,明天咱们来学习另一个缓存扩大:Yac 。 什么是 Yac从名字其实就能看出,这又是鸟哥大神的作品。毕竟是 PHP 的外围开发人员,他的作品每次都不会让咱们悲观。鸟哥能够说是咱们中国程序员的自豪,他在 PHP 界有无足轻重的位置,大家能够本人搜寻一下他的博客,虽说更新频率不高,但每篇文章都值得咱们学习。 Yac 是一个无锁共享缓存零碎,因为无锁,所以它的效率十分高。据说 Apc 的效率是 Memcached 的一倍以上,而 Yac 比 Apc 更快。这就是它最大的特点。 绝对于 Memcached 或者 Redis 来说,Yac 更加轻量级,咱们也不须要在服务器中再装置别的什么软件,只须要装置这个扩大就能够应用。对于小型零碎特地是就是简略的进行数据缓存的零碎来说,咱们不须要简单的数据类型,只用这种程序语言的扩大就能让咱们的开发更为方便快捷。 装置的形式也非常简单,一样的在 PECL 下载安装包后进行扩大装置即可。 基本操作对于缓存相干的操作,无外乎就是增加、批改、删除缓存。不像内部缓存零碎,在保留数组或对象时,PHP 扩大类的缓存都能间接保留这些数据类型,而不必序列化为字符串或者转化为 JSON 字符串,这是 Apc 和 Yac 的劣势之一。 增加、获取缓存$yac = new Yac();$yac->add('a', 'value a');$yac->add('b', [1,2,3,4]);$obj = new stdClass;$obj->v = 'obj v';$yac->add('obj', $obj);echo $yac->get('a'), PHP_EOL; // value aecho $yac->a, PHP_EOL; // value aprint_r($yac->get('b'));// Array// (// [0] => 1// [1] => 2// [2] => 3// [3] => 4// )var_dump($yac->get('obj'));// object(stdClass)#3 (1) {// ["v"]=>// string(5) "obj v"// }非常简单的操作,咱们只须要实例化一个 Yac 类,就能够通过 add() 办法及 get() 办法增加和获取缓存内容。 ...

May 12, 2021 · 2 min · jiezi

关于php:php获取具体日期的方法

本周星期一// 本周一,w为星期几的数字模式,这里0为周日。$dt = date('Y-m-d', (time() - ((date('w') == 0 ? 7 : date('w')) - 1) * 24 * 3600));本周星期天// 本周日,同样应用w,以当初与周日相干天数算。$dt = date('Y-m-d', (time() + (7 - (date('w') == 0 ? 7 : date('w'))) * 24 * 3600));上周星期一// 上周一,无论明天几号,-1 monday为上一个无效周未。$dt = date('Y-m-d', strtotime('-1 monday', time()));上周星期天// 上周日,上一个无效周日,同样实用于其它星期。$dt = date('Y-m-d', strtotime('-1 sunday', time()));本月第一天// 本月1日,间接以strtotime生成$dt = date('Y-m-d', strtotime(date('Y-m', time()) . '-01 00:00:00'));本月最初一天// 本月最初一天,t为当月天数,28至31天。$dt = date('Y-m-d', strtotime(date('Y-m', time()) . '-' . date('t', time()) . ' 00:00:00'));上月第一天// 上月1日,本月1日上减一个月。$dt = date('Y-m-d', strtotime('-1 month', strtotime(date('Y-m', time()) . '-01 00:00:00')));上月最初一天// 上月最初一天,本月第一天减一天即是上月最初一天。$dt = date('Y-m-d', strtotime(date('Y-m', time()) . '-01 00:00:00') - 86400);

May 11, 2021 · 1 min · jiezi

关于php:在PHP中操作临时文件

对于文件相干的操作,想必大家曾经十分理解了,在未来咱们刷到手册中相干的文件操作函数时也会进行具体的解说。明天,咱们先来理解一下在 PHP 中对于临时文件相干的一些内容。 获取 PHP 的默认长期创立文件目录学习过 Linux 操作系统的都会晓得有一个目录是 /tmp 目录( Windows 中个别是:C:\Windows\Temp\ ),它是用来寄存零碎的一些临时文件的,所以,这个目录也叫做长期文件目录。很多软件都会将一些长期保留的文件放在这个目录外面,包含一些缓存、一些长期生成的脚本之类的。PHP 在默认状况下也会将长期文件目录指向这个目录,包含 SESSION 文件之类的临时文件都会保留在这里。它能够在 php.ini 文件中通过 sys_tmp_dir 进行设置。 当然,在动静运行的 PHP 程序中,咱们也能够通过一个函数来取得以后的长期文件目录。 print_r(sys_get_temp_dir());// /tmp创立一个临时文件既然有了长期文件目录,PHP 当然也贴心的为咱们筹备好了间接去创立一个临时文件的函数。 $tmpFile = tmpfile();fwrite($tmpFile, "I'm tmp file.");// ll /tmp// vim phpbnAjbEsleep(10);fclose($tmpFile);// ll /tmptmpfile() 函数就是用来创立这个临时文件的,咱们不须要为它指定文件名,也不须要为它指定门路,同时,它创立的文件是 w+ 类型的,也就是间接就是可读写的文件。当调用 fclose() 的时候,这个临时文件将主动删除掉。手册中说应用这个函数创立的文件在脚本运行完结后也会主动删除,然而在测试后发现脚本完结时文件并不会删除。 在调用函数并写入内容后,咱们暂停了十秒。其实就是为了去 /tmp 目录里看一下这个文件是否生成胜利。依据文件创建的工夫,咱们找到了生成的这个对应的文件。而后在十秒后执行了 fclose() 之后,再次到目录查看,就会发现文件曾经被主动删除了。 依据目录状态创立一个惟一名称的临时文件最初,PHP 还为咱们提供了一个十分人性化的创立临时文件的函数。 $tmpFile = tempnam('/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202006/source', 'testtmp');$f = fopen($tmpFile, "w");fwrite($f, "I'm tmp file.");// ll /tmp// vim testtmpH7bptZ// etc目录没有写权限$tmpFile = tempnam('/etc', 'testtmp');$f = fopen($tmpFile, "w");fwrite($f, "I'm tmp file.");// ll /etc// ll /tmp// vim testtmpTUNucMtempnam() 函数,它会依据目录的状态去生成一个惟一名称的临时文件。什么叫依据目录状态呢?从下面的代码正文中能够看出,第二段的 /etc 目录个别是 root 权限的目录,没有 root 帐户权限的话咱们是无奈创立批改文件的。如果是这种没有权限的目录,或者是压根就不存在的目录,tempnam() 函数就会将文件生成到长期文件目录中去。如果目录是失常存在并且能够写的,就像第一段代码一样,文件就会失常在这个目录进行创立。 ...

May 11, 2021 · 1 min · jiezi

关于php:一起学习PHP的runkit扩展如何使用

这次又为大家带来一个好玩的扩大。咱们晓得,在 PHP 运行的时候,也就是部署实现后,咱们是不能批改常量的值,也不能批改办法体外部的实现的。也就是说,咱们编码实现后,将代码上传到服务器,这时候,咱们想在不批改代码的状况去批改一个常量的值是不行的。常量自身就是不容许批改的。然而,runkit 扩大却能够帮忙咱们实现这个性能。 动静批改常量define('A', 'TestA');runkit_constant_redefine('A', 'NewTestA');echo A; // NewTestA是不是很神奇。这个 runkit 扩大就是在运行时能够让咱们来动静的批改一些常量、办法体及类的性能扩大。当然,从系统安全的角度来来,这个扩大并不是很举荐。因为自身常量的含意就是不变的量,自身就不应该批改的。同理,在运行时动静的扭转函数体或者类定义的内容都是会有可能影响到其它调用到这些函数或类的代码,所以,这个扩大是一个危险的扩大。 除了动静地批改常量外,咱们还能够应用 runkit_constant_add() 、 runkit_constant_remove() 函数来动静地减少或者删除常量。 装置runkit 扩大的装置是须要在 github 下载而后进行失常的扩大编译即可,pecl 下载的曾经过期了。 PHP5: http://github.com/zenovich/runkit PHP7:https://github.com/runkit7/runkit7.git clone 胜利后进行失常的扩大编译装置步骤即可。 phpize./configuremakemake install不同的 PHP 版本须要装置不同版本的扩大,同时,runkit7 还在开发中,有一些函数还没有反对,比方: runkit_class_adoptrunkit_class_emancipaterunkit_importrunkit_lint_filerunkit_lintrunkit_sandbox_output_handlerrunkit_return_value_usedRunkit_SandboxRunkit_Sandbox_Parent在写这篇文章的测试代码时,上述函数或者类都是不反对的。大家能够用 PHP5 的环境测试下原版的扩大是否都能失常应用。 查看超全局变量键print_r(runkit_superglobals());//Array//(// [0] => GLOBALS// [1] => _GET// [2] => _POST// [3] => _COOKIE// [4] => _SERVER// [5] => _ENV// [6] => _REQUEST// [7] => _FILES// [8] => _SESSION//)这个函数其实就是查看下以后运行环境中的所有超全局变量键名。这些都是咱们罕用的一些超全局变量,就不一一解释了。 办法相干操作办法操作就和常量操作一样,咱们能够动静地增加、批改、删除以及重命名各种办法。首先还是来看一下咱们最关怀的在动静运行时来批改办法体外面的逻辑代码。 function testme() { echo "Original Testme Implementation\n";}testme(); // Original Testme Implementationrunkit_function_redefine('testme','','echo "New Testme Implementation\n";');testme(); // New Testme Implementation定义了一个 testme() 办法,而后通过 runkit_function_redefine() 来批改它的实现,最初再次调用 testme() 时输入的就是新批改后的实现了。那么,咱们能不能批改 PHP 自带的那些办法呢? ...

May 10, 2021 · 2 min · jiezi

关于php:2021年php常见面试题

2021年php常见面试题 pdf 次要是2021年4-5月自己面试筹备和面试中不断完善的知识点,更多是八股文,能应答基础知识类的考查,深刻的钻研须要日常的积攒了,算法类的没有体现在文档中,根本算法类的能在LeetCode上看到,我遇到的除了一线大厂,其余不是很在乎算法的考核,能有思路或者学习过,就能够带过这个问题了。 感觉面试考索引,联结索引,隔离级别,redis数据结构和底层实现,长久化还有他们两个的主从同步是最多的。 © 原创文章,集体整顿的知识点

May 8, 2021 · 1 min · jiezi

关于php:学习PHP弱引用的知识

之前的文章中,咱们曾经学习过援用和援用传值相干的常识。咱们晓得,PHP 中没有纯援用(指针),不论是对象,还是用援用符号 & 赋值的变量,都是对一个符号表的援用。而明天,咱们要学习的是另一种援用模式:弱援用。 什么是弱援用弱援用容许程序员保留对对象的援用,而该对象不会阻止对象被销毁;它们对于实现相似缓存的构造十分有用。 这是比拟官网的解释。从这个阐明中,咱们能够看出,弱援用也是一种援用模式,然而,如果咱们销毁了原来的对象,那么弱援用对象也会被销毁,就像一般的值对象赋值一样。如果没有看过之前的文章,或者对 PHP 中的援用不太熟悉的敌人可能须要再理解一下 PHP 中援用相干的常识。上面,咱们间接通过示例来看一下。 WeakReference$obj = new stdClass;$weakref = $obj;var_dump($weakref);// object(stdClass)#1 (0) {// }unset($obj);var_dump($weakref);// object(stdClass)#1 (0) {// }$obj1 = new stdClass;$weakref = WeakReference::create($obj1);var_dump($weakref->get());// object(stdClass)#2 (0) {// }unset($obj1);var_dump($weakref->get());// NULL$weakref = WeakReference::create(new stdClass);var_dump($weakref->get());// NULL第一个对象 \$obj 咱们进行间接的赋值援用,也就是 PHP 默认的对象赋值。这时候,$weakref 保留的是对象符号表的援用。当咱们 unset() 掉 $obj 时,$weakref 仍然可能失常应用。也就是说,$weakref 对 $obj 原始对象的内存援用仍然放弃着。不论咱们怎么 unset() 原始的 $obj ,都只是切断了 $obj 的援用符号表,对真正的对象没有影响,垃圾回收器也不会彻底的回收最最原始的 $obj 对象内容。 第二个对象咱们应用的是 WeakReference 的 create() 办法来创立的弱援用,当咱们销毁 $obj1 后,$weakref 也会变成 NULL 。这就是弱援用的作用! ...

May 8, 2021 · 1 min · jiezi

关于php:看了这篇还不会Linux性能分析和优化你来打我

前言个别互联网的我的项目都是部署在linux服务器上的,如果linux服务器出了问题,那么咱们平时学习的高并发,稳定性之类的是没有任何意义的,所以对linux性能的把握就显得十分重要,当然很多同学可能感觉这些是运维同学的事件,然而我不这么认为,不论你是架构师,还是crud boy,对我的项目有个全局的掌控是一项十分重要的基本素质,所以总结了这篇文章,心愿对您有用,如果您感觉我写的还不错,看完记得点个赞,点个再看哦。咱们废话不必多说,间接进入正题。 影响linux服务器性能的因素cpuCPU是操作系统稳固运行的基本,CPU的速度与性能在很大水平上决定了零碎整体的性能,因而,CPU数量越多、主频越高,服务器性能也就绝对越好。 内存内存的大小也是影响Linux性能的一个重要的因素,内存太小,零碎过程将被阻塞,利用也将变得迟缓,甚至失去响应;内存太大,导致资源节约。 磁盘IO磁盘的I/O性能间接影响应用程序的性能,在一个有频繁读写的利用中,如果磁盘I/O性能得不到满足,就会导致利用停滞。好在现今的磁盘都采纳了很多办法来进步I/O性能,比方常见的磁盘RAID技术。 网络Linux下的各种利用,个别都是基于网络的,因而网络带宽也是影响性能的一个重要因素,低速的、不稳固的网络将导致网络应用程序的拜访阻塞,而稳固、高速的网络带宽,能够保障应用程序在网络上畅通无阻地运行。侥幸的是,当初的网络个别都是千兆带宽或光纤网络,带宽问题对应用程序性能造成的影响也在逐渐升高。 罕用的linux零碎性能监控的命令uptime(零碎整体性能评估) 这里须要留神的是:load average这个输入值,这三个值的大小个别不能大于零碎CPU的个数 那么如何查看cpu的个数呢?查看零碎cpu的信息 cat /proc/cpuinfo中的信息 其中cpu cores即为cpu的核数 也能够用cat /proc/cpuinfo |grep "cores"|uniq间接查看 [root@test ~]# cat /proc/cpuinfo |grep "cores"|uniqcpu cores : 2cpu的性能评估利用vmstat命令监控cpuvmstat 2 10 (每2秒监控一次 监控10次) procsr示意运行和期待cpu工夫片的过程数,这个值如果长期大于cpu的个数,则须要减少零碎cpu b示意期待资源的过程数 CPUus列显示了用户过程耗费CPU工夫百分比,us比拟高的时候,阐明用户过程耗费cpu的工夫多,如果长期大于50%,就须要优化程序和算法 sy列显示了内核过程耗费的cpu工夫百分比,sy值较高的时候,阐明内核耗费的cpu资源很多 依据教训,us+sy的参考值为80%,如果us+sy大于 80%阐明可能存在CPU资源有余。 利用sar命令监控零碎cpusar命令会减少零碎开销 然而影响不大 yum install sysstat装置sar命令 sar -u 3 5(u显示零碎所有cpu在采样工夫内的负载状态)%user:用户过程耗费cpu的工夫百分比 %nice:运行失常过程所耗费cpu的百分比 %system:零碎耗费cpu工夫百分比 %iowait:IO期待所占用cpu工夫百分比 %steal:内存在绝对缓和的环境下pagein强制对不同页面进行的steal操作 %idle:cpu处在闲暇工夫的百分比 内存性能评估利用free指令监控内存free -m #查看以M为单位的内存应用状况个别有这样一个教训公式: 应用程序可用内存/零碎物理内存>70%时,示意零碎内存资源十分短缺,不影响零碎性能。 应用程序可用内存/零碎物理内存<20%时,示意零碎内存资源紧缺,须要减少零碎内存。 20%<应用程序可用内存/零碎物理内存<70%时,示意零碎内存资源根本能满足利用需要,临时不影响零碎性能。 利用vmstat监控内存 swpd示意切换到内存替换去的内存数量(k),如果swpd的值不为0,或者比拟大,然而si,so的值长期为0,这种状况不必放心,不会影响性能 free示意闲暇的物理内存数量 buffer示意buffers cache的内存数量,个别对设施的读写才须要缓冲 cache示意page cached的内存数量。个别作为文件系统cached,频繁拜访的文件都会被cached,如果cache值较大,阐明cached的文件较多,如果此时IO中的bi比拟小,阐明文件系统效率比拟好 si示意由磁盘调入内存,也就是内存进入内存替换区的数量 so示意由内存调入磁盘,也就是内存替换区进入内存的数量个别状况下,so si的值都为0。如果si so的值长期不为0,则示意零碎内存不足,须要减少内存 ...

May 6, 2021 · 1 min · jiezi

关于php:如何获取PHP命令行参数

应用 PHP 开发的同学多少都会接触过 CLI 命令行。常常会有一些定时工作或者一些脚本间接应用命令行解决会更加的不便,有些时候咱们会须要像网页的 GET 、 POST 一样为这些命令行脚本提供参数。比方在针对某些日期做统计的脚本,就须要传递一个日期给它,这样咱们就统计指定日期的一些数据。这类需要应该十分常见,那么,咱们都是如何来接管这些命令行的参数的呢?明天,就来介绍一下这方面的内容。 $argv 取得所有空格分隔的参数列表这个变量预计是大家用得比拟多的一个接参变量了。它是 PHP 为咱们筹备好的一个固定变量,目标就是获取传递给脚本的参数数组。 print_r($argv);// php 如何获取PHP命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd // Array// (// [0] => 如何获取PHP命令行参数.php// [1] => --a=1// [2] => -b=2// [3] => -c=3// [4] => -d=4// [5] => --e=5// [6] => ccc// [7] => ddd// )这个数组是以参数距离的空格进行分隔的。第1个元素是以后运行的脚本文件名,也就是说,不论有没有参数,这个变量肯定会有一个 $argv[0] 示意的是以后的脚本文件名。 在日常的开发需要中,其实应用这个变量就曾经够用了。然而这显著不会是咱们明天的主题,大家留神到下面的代码中咱们有很多参数是 -x=xxx 的模式,这种模式的参数是不是和 Linux 的命令选项十分像,没错,这就是咱们明天要重点介绍的:从命令行参数列表中获取选项。 getopt() 从命令行参数列表中获取选项其实就是这样一个简略的函数,咱们就能够像 Linux 的命令选项一样获取指定的命令值。而且不是像 $argv 按空格进行分隔,命令选项函数会将这些命令选项封装成数组,组成以选项名为键,以等号前面的内容为值的数组,更加不便咱们的应用。 // php 如何获取PHP命令行参数.php --a=1 -b=2 -c=3 -d=4 --e=5 ccc ddd print_r(getopt('a:b:c:d:e:f:'));// Array// (// [b] => 2// [c] => 3// [d] => 4// )是不是很神奇,而且十分直观吧,咱们间接就拿到了 b 、 c 、d 的内容并且是格局十分清晰的键值数组模式。有同学要问了,a 和 e 呢?还有前面的 ccc 、 ddd 呢? ...

May 6, 2021 · 2 min · jiezi

关于php:简单学习PHP中的层次性能分析器

在 PHP 中,咱们须要进行调试的时候,个别都会应用 memory_get_usage() 看下内存的应用状况。但如果想看以后的脚本 CPU 的占用状况就没有什么现成的函数了。不过,PHP 也为咱们提供了一个扩大:XHProf ,这是由 FaceBook 开源的一个扩大,它能够帮咱们看到以后脚本运行时的一些性能状况。 什么是 XHProfXHProf 是一个轻量级的分层性能测量分析器。 在数据收集阶段,它跟踪调用次数与测量数据,展现程序动静调用的弧线图。 它在报告、前期解决阶段计算了独占的性能度量,例如运行通过的工夫、CPU 计算工夫和内存开销。 函数性能报告能够由调用者和被调用者终止。 在数据收集阶段 XHProf 通过调用图的循环来检测递归函数,通过赋予惟一的深度名称来防止递归调用的循环。 简略来说,XHProf 就是能为咱们收集很多程序去得时的零碎状态,并且它自带一套在线图表工具,可能为咱们提供详尽的图表信息。 装置间接在 PECL 下载安装扩大包即可。和其它的扩大装置并没有什么两样,这个扩大始终在更新保护状态中,所以对于 PHP7 版本都是完满反对的。 命令行应用xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);//xhprof_enable( XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);//xhprof_enable( XHPROF_FLAGS_MEMORY);//xhprof_enable();for ($i = 0; $i <= 1000; $i++) { $a = $i * $i;}function test_application(){ for ($i = 0; $i <= 1000; $i++) { $a = $i * $i; }}test_application();$xhprof_data = xhprof_disable();print_r($xhprof_data);// Array// (// [main()==>test_application] => Array// (// [ct] => 1// [wt] => 16// [cpu] => 21// [mu] => 848// [pmu] => 0// )// [main()] => Array// (// [ct] => 1// [wt] => 115// [cpu] => 115// [mu] => 1416// [pmu] => 0// )// )应用 xhprof_enable() 启用分析器,它的参数是几个常量,大略的意思就是显示 CPU 信息、内存信息等,如果没有参数的话则只会返回 ct 、 wt 这两个参数。 ...

May 5, 2021 · 1 min · jiezi

关于php:看完这篇你的PHP代码优雅一个档次

引言明天老王同学跟我说,他的代码好蹩脚,像一坨xiang。问我要怎么 进步本人的代码品质,让本人代码看得悦目一点,难受一点, 就像 看到大长腿MM,两眼放光那种。 于是我: 你先这样,而后这样,而后再那样。。。。。。<!--more--> 老王同学: 别闹, 到底是哪样? 好的, 我要开始装13了。。。 根本标准先说一下最根本的货色: 变量名应用驼峰命名。不懂的单词不要用拼音,而是要查词典找到对应的单词。常量命名应用大写下划线形式命名。如:SYSTEM_EROOR = 50000。缩进应用Tab键,不要打一堆空格做缩进。类名首字母大写驼峰命名,须要见名知其意,正文阐明这个类的性能。例如: 办法名驼峰命名,办法行数尽量管制在80行左右,正文阐明函数干嘛用的。 花括号独占一行,例如: foreach慎用援用,例如以下代码会有问题: 预期后果是输入: 2 4 6,理论后果是2 4 4, 至于为什么可以看我之前的文章: PHP中&符号你真的理解吗?`。能够应用array_walk办法防止这个问题, 示例: 防止if, elese嵌套过深,很多嵌套能够通过提前终止来打消, 举个简略的例子: 倡议应用第二种形式,不符合条件的间接返回,剩下的就是符号条件的,那么防止了在if外面写很多代码。 多个if/else应用switch来代替,PHP8.0版本能够应用match更为简洁。phpstorm中装置SonarLint插件。如果你写的代码呈现虚线,阐明不太现实,那么能够依据提醒批改,置信有强迫症的同学肯定会改,长此以往代码就很标准了。例如: 办法未应用,办法名不标准曾经通知你了,能够快捷批改,也能够本人批改。框架标准后面说得都是比拟根底的货色,接下来才是次要的内容。置信很多同学都用过罕用的thinkphp丶laravel丶yii等风行框架之一。这些框架都是MVC架构的,看过很多人的代码,要么把业务逻辑写在控制器外面,要么写在Model外面, 写在Model外面相比写控制器外面的还绝对好一点。其实对于大型项目都不太敌对。下文以Laravel框架为例。参数验证API须要进行参数验证,然而参数验证写在哪里比拟优雅呢?可能很多人在controller定义规定,而后在调用验证办法,那么验证那段代码将在每个API外面呈现,例如我共事写的。 这段代码在每个API外面均会呈现一次,岂不是很啰嗦,那么如何解决呢? 在Laravel的http目录下建设一个Requsts目录,用于寄存申请的参数验证类。建设一个BaseRequest类: 比方登录须要参数验证再建设一个LoginRequest类继承这个BaseRequest。 应用的时候只有在Controller的办法中注入这个申请类即可。 这里获取申请参数的时候会对表单进行验证,否则参数验证失败会调用刚刚Request积攒定义的办法抛Json异样,返回信息给客户端。 控制器控制器的次要工作负载获取申请数据和返回内容,不应做更多的事件,那么能够定义一个Service层来解决业务逻辑。所以我的控制器的代码只有一行。 在Laravel的app目录下建设一个Services文件夹用于寄存Service类,建设一个BaseService类: 而后建设一个UserService来解决用户相干的业务逻辑。 在UserController中注入这个UserService应用: ModelModel不倡议写业务逻辑。Model次要是用来定义一些内容,不应该操纵数据。 Model的数据操纵应该放在Repository中,在Laravel的app目录下建设一个文件夹Repositories。 定义BaseRepository: 定义UserRepository,用于用户数据相干的操作, 在构造方法中注入UserModel: 常量我的项目中很多常量该怎么定义? 在app目录创立一个Constant目录, 再建设一个Contstant类来保留这些自定义常量。 这样的益处是: 自定义常量能够集中的治理。批改常量值的时候,只须要在这个类中找批改一次即可,代码更新维护性好。 附录

May 1, 2021 · 1 min · jiezi

关于php:YII2-Codeception-Xdebug-进行接口API测试及单元测试的实践

以前用测试接口就是用PostMan + PHPStorm + Xdebug 进行调试,具体就是配置好PHPStorm+ Xdebug后,用PostMan发送申请时,减少参数:XDEBUG_SESSION_START=PHPSTORM。如下图: PostMan+Xdebug的形式测试根本也能够了,然而测试粒度还是有点大,每次测试都要正儿八经用postman发一次申请来验证后果,稍显麻烦。当初新公司用的框架是Yii2.0框架,看文档时发现Yii2.0框架集成了Codeception单元测试,最早的时候网上查PHP单元测试,很多大神说PHP开发根本没人用单元测试,于是也就没去理解,所以始终就是用Postman测试,本人也在网上出于好奇心也看看PHP单元测试的教程,大都是简略的Assert.equel或者是Assert.isEmpty这种判断是否等于后果值或者是否等于空的举例而已,感觉没什么意意,也就放弃了,直到前天正儿八经的去想着单元测试是否把后果打印进去,而不是简略断言,于是就去钻研Yii2集成的Codeception单元测试框架,然而无论是官网上文档还是网上网友的帖子都是简略介绍,没有我冀望的内容,没方法只能埋头苦干,于是得货了,分享进去,心愿跟我一样菜的须要“工欲善必先利其器”的菜鸟们能失去帮忙。先用Composer装置Codeception,Yii2官网有介绍,装置后如下图: 装置好之后,当然配置Codeception形式执行测试了,如下图: 为PHPStorm配置Codeception,如下图: 这我写的一个接口须要调用的办法,外面是用Yii2框架的HttpClient发送http申请获取携程的Token,当初我想对我这个办法进行测试,而不是把调用这个办法的接口写好再用PostMan来测试。先在要测试的办法所在类的类名处右键,new一个单元测试类,选Codeception,抉择测试的办法,如下图: 会在Tests 目录下的unit目录生成对象的测试类,类名以要测试的类加后缀“Test”结尾。如下图 我在测试方法里打个断点,如图 在测试类的测试方法左上角有个绿色三角形按钮,点击,抉择用Codeception测试。如图: 点击测试后,会运行到刚刚打断点的中央,接下去就能够从容的单步单元测试调试了。 我最后原本尝试测试的时候用Yii2日志性能写日志,前面发现始终没有去写日志,也是偶尔发现能够用Xdebug单步调试,通过单步调试,Codecetion调用的Logger类是它本人的,尽管我配置了Yii2框架的Log组件,如图: 通过Xdebug的单步调试,通过Codeception单元测试,发现调用Yii2的Log最终调用的是Codeception包里的一个Debug类,如下图,留神看类的正文阐明,写明了此类会在--debug模式下起作用(红框里英文正文)。 用命令行的形式执行单元测试,加上--debug选项,会间接打印出想要用Yii2写日志文件的内容。如下图: 原本边钻研的时候就应该记录,无奈明天和老婆吵架心烦意乱忽然想起要开始尝试着去分享货色了,这才想起把前两天本人的成绩分享进去,图片和素材都是长期操作截图补的,还有这个是联合Yii2的单元测试而已,其余框架的应该也相似,感觉写货色还蛮有意思的,尽管要花不少工夫,第一次写货色。

April 30, 2021 · 1 min · jiezi

关于php:PHP中的垃圾回收相关函数

之前咱们曾经学习过 PHP 中的援用计数以及垃圾回收机制的概念。这些内容十分偏实践,也是十分常见的面试内容。而明天介绍的则是具体的对于垃圾回收的一些性能函数。对于之前的两篇介绍文章,大家能够到文章底部查看。 再谈循环援用以及强制清理循环援用咱们为什么要强调 “循环援用” 呢?其实,在默认状况下,咱们间接 unset() 掉一个没有被其余变量援用的变量时,就会让这个变量的援用计数变为0。这时,PHP 默认的垃圾回收机制就会间接革除掉这个变量。比方: $a = new stdClass;$b = new stdClass;$c = new stdClass;echo memory_get_usage(), PHP_EOL; // 706528unset($a);echo memory_get_usage(), PHP_EOL; // 706488gc_collect_cycles();echo memory_get_usage(), PHP_EOL; // 706488从下面的代码中能够看出,咱们 unset() 掉 $a 之后,内存间接就缩小了。然而,如果是产生了循环援用的状况,那么简略的进行 unset() 就没有成果了。 class D{ public $d;}$d = new D;$d->d = $d;echo memory_get_usage(), PHP_EOL; // 706544unset($d);echo memory_get_usage(), PHP_EOL; // 706544gc_collect_cycles();echo memory_get_usage(), PHP_EOL; // 706488在这段代码中,咱们对 \$d 进行了一个简略的循环援用赋值。应用 unset() 后,内存没有发生变化,这时,只能应用 gc_collect_cycles() 函数来进行强制的循环援用清理,能力将 $d 外面的有效循环援用革除掉。 没错,这一段的重点正是 gc_collect_cycles() 这个函数。它在失常状况下对一般的变量援用是不会产生什么清理成果的,当然,对于一般的变量咱们间接 unset() 掉就能够了。它最次要的作用就是针对循环援用的清理。之前咱们学习过,循环援用计数会存在一个 根缓冲区 ,个别默认状况下它能包容 10000 个待清理的 可能根 。而 gc_collect_cycles() 的作用就是不必等这个 根缓冲区 满就间接进行清理(集体了解)。对于这个垃圾回收算法的内容请移步:PHP垃圾回收机制的一些肤浅了解 ...

April 30, 2021 · 1 min · jiezi

关于php:PHP脚本设置及获取进程名

明天来学习的是两个非常简单的函数,一个能够用来设置咱们执行脚本时运行的过程名。而另一个就是简略的获取以后运行的过程名。这两个函数对于大量的脚本运行代码有很大的作用,比方咱们须要 kill 掉某个过程时,能够间接应用咱们本人定义的过程名来进行操作。 设置过程名cli_set_process_title("test");非常简单吧,只有一个参数,那就是要定义的变量名称。在运行起来后,咱们应用 sleep() 让程序挂载一段时间,而后再开一个终端来查看以后的过程信息。 ps -ef | grep test# root 32172 31511 0 09:03 pts/0 00:00:00 testtop -p 32172 -c# 32198 root 20 0 113100 18052 13088 S 0.0 0.2 0:00.00 test能够看到,不论是应用 ps 还是应用 top ,都能够看到相应的过程名称为 test 的过程。这样,就实现了过程名称的自定义。 获取过程名echo "Process title: " . cli_get_process_title() . "\n";// Process title: test同样的,获取以后过程名的函数也十分地简略,间接调用即可。它就会失常输入以后执行脚本的过程名称。 如果咱们没有自定义过程名称呢?这里就不会有任何的输入,大家能够本人尝试一下。 注意事项最初来说说这两个函数的注意事项。 一是如果应用的是 Mac OS 零碎,会提醒: // Warning: cli_set_process_title(): cli_set_process_title had an error: Not initialized correctly 也就是说这两个函数在 Mac 上面是无奈失常应用的,我的测试环境是 CentOS ,是能够失常应用的。Windows 环境没有进行测试,失常状况下也很少会有人在 Windows 环境下挂后盾执行脚本,所以有趣味的同学能够本人测试下。 ...

April 29, 2021 · 1 min · jiezi

关于php:使用-simpsmqtt-调用阿里云的微消息队列-MQTT-版

微音讯队列 MQTT 版 是专为挪动互联网(MI)、物联网(IoT)畛域设计的音讯产品,笼罩互动直播、金融领取、智能餐饮、即时聊天、挪动 Apps、智能设施、车联网等多种利用场景;通过对 MQTT、WebSocket 等协定的全面反对,连接端和云之间的双向通信,实现 C2C、C2B、B2C 等业务场景之间的音讯通信,可撑持千万级设施与音讯并发。 在阿里云的文档中 PHP 举荐的 SDK 是 Mosquitto-PHP ,这是一个基于回调和异步操作的 PHP MQTT 扩大,同时还依赖 libmosquitto。 而 simps/mqtt 是纯 PHP 代码实现的协定解析,客户端实现基于 Swoole 的同步阻塞客户端和协程客户端,能够用于 PHP-FPM 和 CLI 两种模式。 并且 simps/mqtt 反对 MQTT 5.0 协定,是 PHP 首个反对 MQTT 5.0 协定的类库,前期如果阿里云的微音讯队列 MQTT 版反对了 MQTT 5.0 协定,能够无缝降级。 以下为应用 simps/mqtt 来实现之前所提供的 Mosquitto-PHP 的示例代码 git clone https://github.com/simps-cloud/aliyun-mqtt.gitcd aliyun-mqttcomposer install示例代码仅实现了测试逻辑,具体业务应用还须要进一步欠缺。配置文件config.php return [ 'access_key' => '', // 阿里云帐号 AccessKey 'secret_key' => '', // 阿里云帐号 SecretKey 'end_point' => '', // 接入点地址,购买实例后从控制台获取 'instance_id' => '', // 实例 ID,购买后从控制台获取 'topic' => '', // MQTT Topic,其中第一级 Topic 须要在 MQTT 控制台提前申请 'group_id' => '', // MQTT 客户端ID 前缀, GroupID,须要在 MQTT 控制台申请];独自应用 MQTT 音讯收发示例sendMessageToMQTT.php ...

April 28, 2021 · 2 min · jiezi

关于php:一些PHP选项参数相关的函数

对于 PHP 的配置,咱们大多数状况下都是去查看 php.ini 文件或者通过命令行来查问某些信息,其实,PHP 的一些内置函数也能够帮忙咱们去查看或操作这些配置参数。比方之前咱们学习过的 对于php的ini文件相干操作函数浅析 。批改方面的函数就只有 ini_set() ,其余大部分的函数其实都是帮忙咱们进行查问的,明天,咱们就来一一解说这些函数。 get_defined_constants()返回所有常量的关联数组,键是常量名,值是常量值。 define("MY_CONSTANT", 1);print_r(get_defined_constants(true));// array(// ……// [user] => array(// [MY_CONSTANT] => 1// )// )这个函数会输入所有的常量,因为返回的内容很多,所以用 ...... 示意有很多零碎或扩大的定义常量,而咱们在代码中本人定义的常量则会全副进入到 [user] 这个键名下。 这个函数有一个参数,当它为 true 时,让此函数返回一个多维数组,分类为第一维的键名,常量和它们的值位于第二维。而默认状况下是 false ,返回的是一个一维数组,就是常量名作为键名,它们的值作为键值。 get_extension_funcs()这个函数返回的是扩大模块所蕴含的所有办法名称。 print_r(get_extension_funcs("swoole"));// Array// (// [0] => swoole_version// [1] => swoole_cpu_num// [2] => swoole_last_error// [3] => swoole_async_dns_lookup_coro// [4] => swoole_async_set// [5] => swoole_coroutine_create// ……// [35] => swoole_timer_clear// [36] => swoole_timer_clear_all// )它的参数就是要查问的扩大名称,这里咱们间接查看本机装置的 Swoole 外面都蕴含那些办法。能够看到,Swoole4.4 中一共蕴含有37个办法函数。 get_loaded_extensions()这个函数是返回所有已加载的扩大模块列表。 print_r(get_loaded_extensions()); // php -m// Array// (// [0] => Core// [1] => phpdbg_webhelper// [2] => date// [3] => libxml// [4] => openssl// [5] => pcre// [6] => sqlite3// ……// [65] => imagick// [66] => swoole// [67] => vld// [68] => Zend OPcache// )这个函数的作用是不是和咱们在命令行应用 -m 来查看以后零碎已装置的扩大一样。没错,它们就是雷同的性能,都是返回的这样一个扩大装置状况的列表。在一些开源 cms 零碎中,须要查看以后的装置环境是否符合要求时,就能够用这个函数进行检测。 ...

April 28, 2021 · 2 min · jiezi

关于php:php基础知识6流程控制

php是一门计算机编程语言,次要利用于开发web利用(网站建设等),本系列博客从php根底语法登程,介绍php基础知识。使读者深入浅出的学习到编程的乐趣。 本系列博客将解说以下9个知识点,变量、常量、数据类型、运算符、数组、流程管制(程序、抉择、循环)、函数、文件解决、面向对象 每篇文章都会在文末留下一个课后作业,答案获取请私聊我,大家能够在评论区踊跃探讨,共同进步 概念流程其实就是管制决定代码的执行程序,在理论编程中,莫过于程序、抉择、循环这三种场景,咱们将这三种场景学会后,就能够读懂大多数的代码。 对于初学者而言,流程管制是一大难点。然而却是不可短少的一部分。咱们要认真的学习它。 程序构造程序构造顾名思义是程序执行的,换句话来说代码从上往下顺次执行,不会跳过两头的某一行代码。平时编程大多数代码都是程序构造。 抉择构造抉择构造有点像高中数学里学习的程序框图外面的分支构造,也就是说满足条件则这段代码,不满足条件则执行另一段代码。同时也能够嵌套其余的语句。php 外面次要是以if...else...、switch...case...等为主。 if...else...如果if前面的表达式成立则执行第一个大括号的语句,否则执行第二个大括号的语句。 <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */if (2>1) { echo "2大于1";} else { echo "2不大于1";}执行后果: if...elseif...else如果if前面的表达式成立则执行第一个大括号的语句,而后判断elseif的语句是否成立,若成立则执行第二个大括号的语句,否则执行第三个大括号的语句。并且能够持续嵌套。 <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */if (2 > 1) { echo "2大于1";} elseif (1 > 0) { echo "1大于0";} else { echo "1不大于0";}执行后果: switch...case...依据switch前面的大括号的值进行 每一个case块的匹配,匹配胜利则执行相应的大括号的语句。 注:每一个case块最初必须加上break; 否则一旦匹配胜利,将会将前面的所有代码执行,包含其余case块的代码。 <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */$month = 4;switch ($month){ case 1: echo "1月"; break; case 2: echo "2月"; break; case 3: echo "3月"; break; case 4: echo "4月"; break; case 5: echo "5月"; break; case 6: echo "6月"; break; case 7: echo "7月"; break; case 8: echo "8月"; break; case 9: echo "9月"; break; case 10: echo "10月"; break; case 11: echo "11月"; break; case 12: echo "12月"; break;}执行后果: ...

April 27, 2021 · 2 min · jiezi

关于php:一起学习PHP中断言函数的使用

原来始终认为断言相干的函数是 PHPUnit 这些单元测试组件提供的,在浏览手册后才发现,这个 assert() 断言函数是 PHP 自身就自带的一个函数。也就是说,咱们在代码中进行简略的测试的时候是不须要齐全引入整个单元测试组件的。 assert() 断言函数assert(1==1);assert(1==2);// assert.exception = 0 时,Warning: assert(): assert(1 == 2)// assert.exception = 1 时,Fatal error: Uncaught AssertionError: 验证不通过很显著,第二段代码无奈通过断言验证。这时,PHP 就会返回一个正告或者异样谬误。为什么有可能是两种谬误模式呢?当咱们设置 php.ini 中的 assert.exception 为 off 或者 0 时,也就是敞开这个参数的能力时,程序就会以 PHP5 的模式仍然返回一个正告,就像下面代码中的正文一样。同时,通过 try...catch 也无奈进行异样的捕捉了。这个参数其实就是管制是否以正宗的异样对象进行抛出。如果放弃这个参数为默认状况也就是设置为 on 或者 1 的话,就会间接抛出异样,程序停止。 从上述代码能够看出,断言的第一个参数是一个表达式,而且是须要一个返回 bool 类型对象的表达式。如果咱们传递的是一个字符串或者一个数字呢? // 设置 assert.exception = 0 进行多条测试assert(" ");// Deprecated: assert(): Calling assert() with a string argument is deprecated// Warning: assert(): Assertion " " failedassert("1");// Deprecated: assert(): Calling assert() with a string argument is deprecatedassert(0);// Warning: assert(): assert(0) failedassert(1);assert("1==2");// Deprecated: assert(): Calling assert() with a string argument is deprecated// Warning: assert(): Assertion "1==2" failed 很显著第一个参数的表达式会进行类型强制转换,然而字符串类型会多出一个过期揭示,表明给 assert() 函数传递字符串类型的表达式类型曾经过期了。以后的测试版本是 7.3 ,在未来可能就会间接报停止运行的谬误或异样了。次要问题在于,如果传递的字符串自身也是一个表达式的话,会以这个表达式的内容为根底进行判断,这样很容易产生歧义,就像最初一段代码一样。当然,曾经过期的应用形式还是不举荐的,这里仅是做一个理解即可。 ...

April 27, 2021 · 1 min · jiezi

关于php:Laravel-中的-Collection-基本使用

汇合是Laravel 中提供的最弱小的性能之一,汇合实质上是由功能强大的数组组成。 把相似数组的对象利用到办法中是很有用的,通过链式编程,用极短的代码,就能够达到预期的成果。 须要留神的是汇合并不是Laravel 中独有的,许多语言都能够在数组中应用汇合式编程,但十分遗憾,原生的PHP 是不反对汇合式编程的,不过侥幸的是,一些勤奋的人曾经为咱们实现了艰辛的工作,并编写了一个十分不便的包——illuminate/support、Tightenco/Collect 。 一般来说,汇合是不可扭转的,这意味着大部分 Collection 办法都会返回一个全新的 Collection 实例。 创立汇合为了创立一个汇合,能够将一个数组传入汇合的结构器中,也能够创立一个空的汇合,而后把元素写到汇合中。Laravel 有collect()助手,这是最简略的,新建汇合的办法。 $collection = collect([1, 2, 3]);默认状况下, Eloquent 查问的后果返回的内容都是 Illuminate\Support\Collection 实例,如果心愿对后果进行序列化,能够应用toArray()、toJson() 办法。在非Laravel 我的项目中应用汇合: 装置: composer require illuminate/support应用: <?php// 引入packagerequire __DIR__ . '/vendor/autoload.php';$collection = collect([1, 2, 3]);var_dump($collection);记住,所有办法都能够应用链式编程的形式优雅的操纵数组。而且简直所有的办法都会返回新的 Collection 实例, all返回该汇合示意的底层数组。 collect(["boo", "yumi", "mac"])->all();// [“boo”, "yumi", "mac"]avg获取数组的平均值: collect([1, 1, 2, 4])->avg(); // 2获取二维数组的平均值: collect([['foo' => 10], ['foo' => 10], ['foo' => 20], ['foo' => 40]])->avg('foo'); // 20avg()是average() 的别名,两者的成果是一样的。 chunk将大汇合按指定大小拆分成小汇合。 $collection = collect([1, 2, 3, 4, 5, 6, 7]);$chunks = $collection->chunk(4);$chunks->toArray();// [[1, 2, 3, 4], [5, 6, 7]]chunkWhile依据指定的回调值把汇合分解成多个更小的汇合: ...

April 26, 2021 · 8 min · jiezi

关于php:php基础知识5数组

php是一门计算机编程语言,次要利用于开发web利用(网站建设等),本系列博客从php根底语法登程,介绍php基础知识。使读者深入浅出的学习到编程的乐趣。 本系列博客将解说以下9个知识点,变量、常量、数据类型、运算符、数组、流程管制(程序、抉择、循环)、函数、文件解决、面向对象 每篇文章都会在文末留下一个课后作业,答案获取请私聊我,大家能够在评论区踊跃探讨,共同进步 概念在学习了变量和常量之后,咱们发现不论是变量和常量都只能存储一个数据。 那么咱们设想一个业务场景,如果一个学习小组有5位同学,咱们要存储这5位同学的名字等信息。那么不论是变量还是常量都无奈实现这个操作。这时候咱们就引入了数组的概念。 数组是一个能在单个变量中存储多个值的非凡变量。个别将一组相关联的数据存储在一个数组中。 数组示例: <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */$arr = [1,2,3,4,5]; //数组$arr存储了1,2,3,4,5数组定义形式 应用[]的形式$arr = [1,2,3,4,5]; 应用array()函数$arr = array(1,2,3,4,5); 分类索引数组定义数组时间接输出值,按,宰割,主动生成索引(从0开始)。 <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */$arr = ["xiaoming","xiaobai","lengyue"]; //定义数组$arrvar_dump($arr); //输入$arr 关联数组定义时须要指定的键,每个键关联一个值。语法格局如下所示: <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */$arr = [ "name" => "lengyue", "age" => 22, "country" => "China"];var_dump($arr); 二维数组一维数组只能定义了一个人的某些属性(姓名,年龄,国家)。那么如果咱们有多集体怎么办呢?二维数组也就派上了用场。二维数组就相当于是一个表格。 <?php/** * Created by 冷月小白. * 微信公众号: 学长冷月 */$arr = [ [ "name" => "lengyue", "age" => 22, "country" => "China" ], [ "name" => "xiaohong", "age" => 20, "country" => "USA" ], [ "name" => "tony", "age" => 35, "country" => "China" ],];var_dump($arr); ...

April 26, 2021 · 1 min · jiezi

关于php:Laravel-运行队列处理器

运行队列# 运行队列处理程序php artisan queue:work# 运行队列处理程序php artisan queue:listen# 指定工作处理器应用哪个连贯,连贯名在 config/queue.php 中定义php artisan queue:work redis# 指定工作处理器应用的连贯和解决的队列名称php artisan queue:work redis --queue=emails# 只解决队列中的下一个工作php artisan queue:work --once# 指定工作处理器解决了多少个工作后敞开php artisan queue:work --max-jobs=1000# 指定工作处理器解决所有工作后敞开php artisan queue:work --stop-when-empty# 指定工作处理器解决了多少秒后敞开php artisan queue:work --max-time=3600# 指定队列解决的优先级php artisan queue:work --queue=high,low# 优雅地重新启动所有的 worker,需配合Supervisor来主动重启php artisan queue:restart# 指定队列执行的超时工夫php artisan queue:work --timeout=60# 设置队列为空时的休眠工夫php artisan queue:work --sleep=3queue:work 与 queue:listen 区别queue:listen 一旦命令启动,将始终放弃运行,直到它被手动进行或敞开终端。当新的申请到来时,会从新加载整个框架,所以更新代码后无需手动重新启动队列处理器即可失效。但性能不如 queue:work 好。queue:work 一旦命令启动,将始终放弃运行,直到它被手动进行或敞开终端。当新的申请到来时,不从新加载整个框架,而是间接执行程序。更新代码后,须要重新启动队列处理器,代码才失效。queue:work 所有参数阐明protected $signature = 'queue:work {connection? : The name of the queue connection to work} {--queue= : The names of the queues to work} {--daemon : Run the worker in daemon mode (不举荐应用)} {--once : Only process the next job on the queue} {--stop-when-empty : Stop when the queue is empty} {--delay=0 : The number of seconds to delay failed jobs} {--force : Force the worker to run even in maintenance mode} {--memory=128 : The memory limit in megabytes} {--sleep=3 : Number of seconds to sleep when no job is available} {--timeout=60 : The number of seconds a child process can run} {--tries=1 : Number of times to attempt a job before logging it failed}';

April 26, 2021 · 1 min · jiezi

关于php:使用OPCache提升PHP的性能

对于 PHP 这样的解释型语言来说,每次的运行都会将所有的代码进行一次加载解析,这样一方面的益处是代码随时都能够进行热更新批改,因为咱们不须要编译。然而这也会带来一个问题,那就是无奈承载过大的访问量。毕竟每次加载解析再开释,都会减少 CPU 的累赘,通常一台 8核16G 的服务器在2、3000并发左右 CPU 就能达到60%以上的使用率。而且如果你应用的是相似于 Laravel 这种大型的框架,效率将更加低下。这个时候,咱们通常会通过减少服务器数量来做负载平衡,从而达到加重服务器压力的成果。不过,这样做的老本又会减少许多。那么,有没有什么优化的计划呢? 鸟哥在他的博客中针对 PHP7 的优化的一篇文章中,第一条倡议就是开启 OPcache 。当然,另外一个计划就是应用 Swoole 。对于 Swoole 的内容咱们未来再说,明天,咱们先学习学习 OPcache 。 什么是 OPcacheOPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来晋升 PHP 的性能, 存储预编译字节码的益处就是 省去了每次加载和解析 PHP 脚本的开销。 这是 PHP 文档中对于 OPcache 的简介,也就是说,OPcache 节约了每次加载和解析的步骤,将第一次解析编译后的脚本字节码缓存到零碎的共享内存中。其实,这就相似于一个不齐全的编译。 相似于 Java 之类的语言,都是要打包编译之后能力上线运行的,比方打包成一个 jar包 。C++ 或 C# 能够打包成一个 .dll 或 .exe 。这些打包之后的文件就是编译实现的文件,将它们运行起来后个别会始终放弃运行状态,也就是会成为一个常驻过程,它们的代码就进入内存中了。在程序运行的时候,不须要再进行解释或编译,天然速度就要快很多。而 OPcache 也是起到相似的作用。只不过它并不是齐全的一套编译流程,咱们还是依赖的 PHP-FPM 来运行脚本,只不过在开启 OPcache 后,PHP-FPM 会先从内存中查找是否曾经有相干的曾经缓存的字节码在内存中了,如果有的话就间接取用,如果没有的话,会再次进行解释编译后缓存下来。另外,OPcache 是针对文件的,也就是说,一个文件如果是新减少进来的,只有运行过它才会缓存,如果没有运行过,它并不在以后的共享内存中。 装置 OpcacheOPcache 曾经是 PHP 的官网扩大并随安装包一起公布了,所以,咱们能够在编译装置 PHP 时应用 --enable-opcache 来开启扩大,它曾经是默认扩大。也能够在未装置 OPcache 的零碎中应用安装包中的文件来进行装置。 ...

April 26, 2021 · 1 min · jiezi

关于php:php生成配置文件configphp-生成数组配置文件

在很多我的项目中,配置文件是不可短少的,个别配置文件会用变量或者数组进行设置,例如数据库、或者一些公共参数。 创立<?php// 配置文件数组$config = array( 'DB_URL' => 'localhost', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_NAME' => 'test_db');// 代码格局$str = '<?php'.PHP_EOL.'/**'.PHP_EOL.'* 配置文件'.PHP_EOL.'* TANKING'.PHP_EOL.'* '.date('Y-m-d').''.PHP_EOL.'*/'.PHP_EOL.'$db_config = '.var_export($config,true) .PHP_EOL.'?>';// 创立文件$file = fopen("array.php","w");echo fwrite($file,$str);fclose($file);?>配置文件<?php/*** 配置文件* TANKING* 2021-04-25*/$db_config = array ( 'DB_URL' => 'localhost', 'DB_USER' => 'root', 'DB_PWD' => 'root', 'DB_NAME' => 'test_db',)?>作者Author:TANKINGDateL2021-04-25WeChat:sansure2016Web:http://www.likeyun.cn

April 25, 2021 · 1 min · jiezi

关于php:PHP中的符号你真的了解吗

PHP中的&符号你真的理解吗?引言最近接手了五六年前的老我的项目,用的是CI2.0框架,在看框架源码的时候有个中央让我楞了一下,于是有了这篇文章。 字符&的最早历史能够追溯到公元1世纪,最早是拉丁语et (意为and)的连写。 &是指逻辑上示意两者属于缺一不可的关系,还示意意思是一个人和另外一个人之意,与and同义。 <!--more--> &在PHP我的项目中是常常应用的一个操作符, 例如按位与丶逻辑操作丶援用变量丶援用传递丶援用返回。 按位与$a & $b 将把 $a 和 $b 中都为1的位设为1. 奇偶数判断整数与1进行按位与运算,运算后果为1示意为奇数, 运算后果为0示意为偶数。例如:5和1进行按位与&, 失去后果为1。十进制二进制510110016和1进行按位与&, 失去后果为0。十进制二进制61101001然而我的项目中咱们都不会这么写, 都是应用n % 2 == 0, 因为奇偶性判断应用%的效率比拟高,也比拟容易了解。用户权限判断假如有个零碎中有用户权限调配模块, 其权限设置如下: 权限名称权限值查看1新增2批改4删除8那么存储该用户的权限不须要存储逗号宰割的字符串1,2,4,8, 只须要存储一个整形:15即可。 如果用户1领有新增丶查看丶批改权限, 那么须要存储的权限值为: 1+2+4=7。 如果用户2领有所有权限, 那么须要存储的权限值为:1+2+4+8=15。 检查用户1是否有批改权限:7 & 4后果为4, 示意领有批改权限。 检查用户2是否有删除权限:15 & 8后果为8, 示意领有删除权限。 条件操作符$a && $b只有$a和$b均为真,后果才为真。 援用变量PHP的援用容许你用两个变量来指向同一个内容。无论对哪个变量名的值进行了批改,其余变量名拜访的内容也会随之扭转。 与C语言中的指针是有差异的。C语言中的指针外面存储的是变量的内容,在内存中寄存的地址。 <?php$a = 10;$b = &$a; $a = 11;var_dump($a, $b); // 输入11, 11$b = 12;var_dump($a, $b); // 输入12, 12foreach循环时加&符号会有什么问题? 例如以下代码能失常输入期望值吗? <?php$values = ['Python', 'Php', 'Go'];foreach ($values as &$value){ $value = strtoupper($value);}foreach ($values as $value){ echo $value . PHP_EOL;}预期后果是: ['PYTHON', 'PHP', 'GO'] 理论后果是['PYTHON', 'PHP', 'PHP']。 ...

April 25, 2021 · 1 min · jiezi