关于php:Swoole-v46-版本新特性之-HttpRequest-增强

在 4.6 版本中,对 Swoole\Http\Request 进行了一些加强: 新增 create/parse/isCompleted 办法 (#3938) (@matyhtf)新增 getMethod 办法 (#3987) (@luolaifa000)那么这些加强性能有什么用呢?这里举一个例子: 应用 TCP Server,提供 HTTP Server 的拜访 在没有这些办法之前,须要手动将 onReceive 事件中收到的 $data 数据解析为 HTTP 协定 $server->on('Receive', function ($server, $fd, $reactor_id, $data) { $server->send($fd, "Server: {$data}");});当初就不须要手动进行解析 HTTP 协定了,能够间接应用 Swoole 提供的办法进行解析,返回的数据格式和 Http\Server 中的 Http\Request 完全一致 上面来试一下: 本文应用 Swoole v4.6.2 版本进行演示。create/parseuse Swoole\Server;use Swoole\Http\Request;$server = new Server('127.0.0.1', 9501);$server->on('Receive', function (Server $server, $fd, $reactor_id, $data) { /** @var Request $request */ $request = Request::create(); $request->parse($data); var_dump($request); $body = 'Hello, Swoole'; $body_len = strlen($body); $send_data = "HTTP/1.1 200 OK\r\nServer: swoole-server\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: {$body_len}\r\nConnection: keep-alive\r\n\r\n{$body}"; $server->send($fd, $send_data);});$server->start();在 Swoole\Server TCP 服务器的 onReceive 事件中,调用Request::create()办法来创立一个 Http\Request 对象,接着将$data数据传递给Request->parse办法进行解析,打印$request ...

February 4, 2021 · 2 min · jiezi

关于php:python与PHP的区别

python是动静解释的语言。他能够实现零碎级的开发。python是跨平台的,你能够使用python在mac,在linux,在win下,甚至是s60手机中开发软件;PHP没有这些能力。从语法上说python的语法蜜糖更多些,语言构造简练,最简略的,PHP的$烦死你。web开发上,PHP利用较广,有很多现成的代码和模版,python这方面欠缺,尽管他有很多很好的框架。比方django。python因其利用范畴,学习工夫更长,当然如果你只玩网站建设,像下面有人说的webpy学习周期很短,基本上在浏览器中就能实现根本的建站工作。如果要学习编程技术,倡议python。如果像尽快出网站倡议PHP。(PHP的现成整站程序多,改改就能用,然而倒退方向没有Python宽泛)

February 4, 2021 · 1 min · jiezi

关于php:PHP中类的自动加载

在之前,咱们曾经学习过Composer主动加载的原理,其实就是利用了PHP中的类主动加载的个性。在文末有该系列文章的链接。 PHP中类的主动加载次要依附的是__autoload()和spl_autoload_register()这两个办法。明天咱们就来简略的看一下这两个办法的应用。 __autoload()做为一个曾经快要被淘汰的魔术办法,咱们只须要理解即可。如果在PHP7中应用这个办法的话,会报出过期的正告,零碎会倡议咱们应用spl_autoload_register()办法。 function __autoload($name){ include __DIR__ . '/autoload/' . $name . '.class.php';}$autoA = new AutoA();var_dump($autoA);当咱们实例化AutoA类时,以后的文件并没有这个类,也没有从其余文件中include或者require,这时,就会主动进入魔术办法__autoload()中。咱们在__autoload()办法中只须要去include这个类所在的文件即可。 spl_autoload_register()这个办法目前曾经代替了上述魔术办法主动加载类的性能。它是spl扩大库中的一个办法,spl扩大库当初曾经默认集成在了PHP中,大家能够释怀地间接应用。 spl_autoload_register()绝对于__autoload()的益处是它能够去注册一个__autoload(),并且实现并保护了一个__autoload()队列。原来在一个文件中只能有一个__autoload()办法,但当初,你领有的是一个队列。 这样,你就不须要将所有加载代码都写在一个__autoload()办法中,而是能够应用多个spl_autoload_register()去独自进行每个类的加载解决。 spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php';});$autoA = new AutoA();var_dump($autoA);参考:深刻学习Composer原理(二) 应用include还是include_once在主动加载中,咱们只须要应用include就能够了,类并不会反复加载。 spl_autoload_register(function($name){ include __DIR__ . '/autoload/' . $name . '.class.php'; echo $name, PHP_EOL;});$autoA = new AutoA();var_dump($autoA);$autoA = new AutoA();var_dump($autoA);$autoA = new AutoA();var_dump($autoA);$autoB = new AutoB();var_dump($autoB);从代码中,咱们能够看出$name在屡次实例化类的状况下只被输入了一次。所以并不需要关怀会有类文件反复加载的问题。而且在大型框架中应用composer的时候会加载十分多的类,_once办法也会带来效率的问题。 总结这次的文章只是对类主动加载进行了简略的介绍,想深刻理解这方面常识的能够移步之前写过的Composer系列文章: 深刻学习Composer原理(一)深刻学习Composer原理(二)深刻学习Composer原理(三)深刻学习Composer原理(四)测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/PHP%E4%B8%AD%E7%B1%BB%E7%9A%84%E8%87%AA%E5%8A%A8%E5%8A%A0%E8%BD%BD.php 参考文档: https://www.php.net/manual/zh/language.oop5.autoload.php各自媒体平台均可搜寻【硬核项目经理】

February 4, 2021 · 1 min · jiezi

关于php:在非Laravel项目中使用Validator验证器

装置composer require illuminate/validation引入提醒音讯我的项目根目录创立 lang/zh_cn/validation.php 文件 <?phpreturn [/*|--------------------------------------------------------------------------| Validation Language Lines|--------------------------------------------------------------------------|| The following language lines contain the default error messages used by| the validator class. Some of these rules have multiple versions such| as the size rules. Feel free to tweak each of these messages here.|*/'accepted' => ':attribute必须承受','active_url' => ':attribute必须是一个非法的 URL','after' => ':attribute 必须是 :date 之后的一个日期','after_or_equal' => ':attribute 必须是 :date 之后或雷同的一个日期','alpha' => ':attribute只能蕴含字母','alpha_dash' => ':attribute只能蕴含字母、数字、中划线或下划线','alpha_num' => ':attribute只能蕴含字母和数字','array' => ':attribute必须是一个数组','before' => ':attribute 必须是 :date 之前的一个日期','before_or_equal' => ':attribute 必须是 :date 之前或雷同的一个日期','between' => [ 'numeric' => ':attribute 必须在 :min 到 :max 之间', 'file' => ':attribute 必须在 :min 到 :max KB 之间', 'string' => ':attribute 必须在 :min 到 :max 个字符之间', 'array' => ':attribute 必须在 :min 到 :max 项之间',],'boolean' =>':attribute字符必须是 true 或false, 1 或 0 ','confirmed' => ':attribute 二次确认不匹配','date' => ':attribute 必须是一个非法的日期','date_format' => ':attribute 与给定的格局 :format 不合乎','different' => ':attribute 必须不同于 :other','digits' => ':attribute必须是 :digits 位.','digits_between' => ':attribute 必须在 :min 和 :max 位之间','dimensions' => ':attribute具备有效的图片尺寸','distinct' => ':attribute字段具备反复值','email' => ':attribute必须是一个非法的电子邮件地址','exists' => '选定的 :attribute 是有效的.','file' => ':attribute必须是一个文件','filled' => ':attribute的字段是必填的','image' => ':attribute必须是 jpeg, png, bmp 或者 gif 格局的图片','in' => '选定的 :attribute 是有效的','in_array' => ':attribute 字段不存在于 :other','integer' => ':attribute 必须是个整数','ip' => ':attribute必须是一个非法的 IP 地址。','json' => ':attribute必须是一个非法的 JSON 字符串','max' => [ 'numeric' => ':attribute 的最大长度为 :max 位', 'file' => ':attribute 的最大为 :max', 'string' => ':attribute 的最大长度为 :max 字符', 'array' => ':attribute 的最大个数为 :max 个.',],'mimes' => ':attribute 的文件类型必须是 :values','min' => [ 'numeric' => ':attribute 的最小长度为 :min 位', 'file' => ':attribute 大小至多为 :min KB', 'string' => ':attribute 的最小长度为 :min 字符', 'array' => ':attribute 至多有 :min 项',],'not_in' => '选定的 :attribute 是有效的','numeric' => ':attribute 必须是数字','present' => ':attribute 字段必须存在','regex' => ':attribute 格局是有效的','required' => ':attribute 字段是必须的','required_if' => ':attribute 字段是必须的当 :other 是 :value','required_unless' => ':attribute 字段是必须的,除非 :other 是在 :values 中','required_with' => ':attribute 字段是必须的当 :values 是存在的','required_with_all' => ':attribute 字段是必须的当 :values 是存在的','required_without' => ':attribute 字段是必须的当 :values 是不存在的','required_without_all' => ':attribute 字段是必须的当 没有一个 :values 是存在的','same' => ':attribute和:other必须匹配','size' => [ 'numeric' => ':attribute 必须是 :size 位', 'file' => ':attribute 必须是 :size KB', 'string' => ':attribute 必须是 :size 个字符', 'array' => ':attribute 必须包含 :size 项',],'string' => ':attribute 必须是一个字符串','timezone' => ':attribute 必须是个无效的时区.','unique' => ':attribute 已存在','url' => ':attribute 有效的格局',/*|--------------------------------------------------------------------------| Custom Validation Language Lines|--------------------------------------------------------------------------|| Here you may specify custom validation messages for attributes using the| convention "attribute.rule" to name the lines. This makes it quick to| specify a specific custom language line for a given attribute rule.|*/'custom' => [ 'attribute-name' => [ 'rule-name' => 'custom-message', ],],/*|--------------------------------------------------------------------------| Custom Validation Attributes|--------------------------------------------------------------------------|| The following language lines are used to swap attribute place-holders| with something more reader friendly such as E-Mail Address instead| of "email". This simply helps us make messages a little cleaner.|*/'attributes' => [ // 'name' => '名字', // 'age' => '年龄',],];来自:https://learnku.com/articles/... ...

February 3, 2021 · 3 min · jiezi

关于php:PHP中的重载是个啥

很多面试官在面试的时候都会问一些面向对象的问题,面向对象的三大个性中,多态最次要的实现形式就是办法的重载和重写。然而在PHP中,只有重写,并没有齐全的重载能力的实现。 重写,子类重写父类办法。 // 重写class A{ public function test($a) { echo 'This is A:' . $a, PHP_EOL; }}class childA extends A{ public function test($a) { echo 'This is A child:' . $a, PHP_EOL; }}$ca = new childA();$ca->test(1);这个在PHP中是没有任何问题的,子类能够重写父类的办法。当实例化子类的时候,调用的就是子类实现的重写的办法。 重载,雷同办法名但参数数量或者类型不同。 class A{ function foo($a){ echo $a; } // Fatal error: Cannot redeclare A::foo() function foo($a, $b){ echo $a+$b; }}道歉,这样写的后果将会是间接的报错。PHP并不反对这样的重载能力。而在PHP的官网手册上,重载的定义是应用__set()、__get()、__call()、__callStatic()等魔术办法来对无法访问的变量或办法进行重载。这与咱们所学习的面向对象中的重载齐全不同,在手册中的note里也有很多人对此提出了疑难。当然,咱们明天并不会再去讲这些魔术办法的应用。对于它们的应用能够参考咱们之前写过的文章:PHP中的那些魔术办法(一)、PHP的那些魔术办法(二) 那么,在PHP中能够实现重载吗?当然能够,只不过会麻烦一些: // 重载class B{ public function foo(...$args) { if (count($args) == 2) { $this->fooAdd(...$args); } else if (count($args) == 1) { echo $args[0], PHP_EOL; } else { echo 'other'; } } private function fooAdd($a, $b) { echo $a + $b, PHP_EOL; }}$b = new B();$b->foo(1);$b->foo(1, 2);应用一个办法来调用其余办法,依据参数数量来进行判断,就能够实现参数数量不同的办法重载。 ...

February 3, 2021 · 2 min · jiezi

关于php:明明有写权限为什么还是不能修改文件

一、文件不可批改属性1. 什么是不可批改属性咱们晓得,Linux零碎中的文件都能够设置读、写、执行权限。然而在实际操作中批改某些文件时,常常会呈现明明以后用户领有对该文件的写权限,却还是无奈对文件进行批改。这种状况通常是因为文件被设置了不可批改属性。 不可批改属性是通过 chattr 命令将文件设置为不可批改,而且一旦设置,包含root在内的任何用户都无奈删除该文件,除非撤销其不可批改的属性。 应用 chattr 设置不可批改属性后,能够应用 lsattr 命令来查看该属性。 其中,最罕用的就是 +i 与 +a 这个两个属性。+i 属性能够让一个文件无奈被增加和批改文件内容,也不能对文件进行删除和改名。+a 属性能够让一个文件不能被删除和批改数据,只能以 echo '字符串' > file 的模式向文件中追加数据。 不可批改属性对系统很重要,尤其是在零碎的数据安全下面,能够防止重要文件被篡改。 不过 chattr 指令只能在 Ext2/Ext3/Ext4 的 Linux 传统文件系统下面残缺失效, 其余的文件系统可能就无奈残缺的反对这个指令了,例如 xfs 仅反对局部参数。 2. 查看文件系统办法一: df -T filename 命令[root~]# df -T .bash_historyFilesystem Type 1K-blocks Used Available Use% Mounted on/dev/vda1 ext4 51473868 20461060 28689688 42% /能够通过第二列的 Type 得悉 文件系统类型是 ext4。 办法二:查看 /etc/mtab 文件通过查看 /etc/mtab 文件来确定文件系统的类型。 [root~]# cat /etc/mtabrootfs / rootfs rw 0 0sysfs /sys sysfs rw,relatime 0 0proc /proc proc rw,relatime 0 0devtmpfs /dev devtmpfs rw,nosuid,size=930832k,nr_inodes=232708,mode=755 0 0securityfs /sys/kernel/security securityfs rw,nosuid,nodev,noexec,relatime 0 0tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0devpts /dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0tmpfs /run tmpfs rw,nosuid,nodev,mode=755 0 0.../dev/vda1 / ext4 rw,noatime,data=ordered 0 0.../etc/mtab 文件的第一列指定了分区设施门路(例如 /dev/vda1 ),第三列指定了文件系统类型(例如ext4)。 ...

February 3, 2021 · 2 min · jiezi

关于php:PHP内核探索PHP中的哈希表

在PHP内核中,其中一个很重要的数据结构就是HashTable。咱们罕用的数组,在内核中就是用HashTable来实现。那么,PHP的HashTable是怎么实现的呢?最近在看HashTable的数据结构,然而算法书籍外面没有具体的实现算法,刚好最近也在浏览PHP的源码,于是参考PHP的HashTable的实现,本人实现了一个简易版的HashTable,总结了一些心得,上面给大家分享一下。 HashTable的介绍哈希表是实现字典操作的一种无效数据结构。 定义简略地说,HashTable(哈希表)就是一种键值对的数据结构。反对插入,查找,删除等操作。在一些正当的假如下,在哈希表中的所有操作的工夫复杂度是O(1)(对相干证实感兴趣的能够自行查阅)。 实现哈希表的要害在哈希表中,不是应用关键字做下标,而是通过哈希函数计算出key的哈希值作为下标,而后查找/删除时再计算出key的哈希值,从而疾速定位元素保留的地位。 在一个哈希表中,不同的关键字可能会计算失去雷同的哈希值,这叫做“哈希抵触”,就是解决两个或多个键的哈希值雷同的状况。解决哈希抵触的办法有很多,凋谢寻址法,拉链法等等。 因而,实现一个好的哈希表的要害就是一个好的哈希函数和解决哈希抵触的办法。 Hash函数判断一个哈希算法的好坏有以下四个定义: · 一致性,等价的键必然产生相等的哈希值; · 高效性,计算简便; · 平均性,平均地对所有的键进行哈希。 哈希函数建设了要害值与哈希值的对应关系,即:h = hash_func(key)。 设计一个完满的哈希函数就交由专家去做吧,咱们只管用已有的较成熟的哈希函数就好了。PHP内核应用的哈希函数是time33函数,又叫DJBX33A,其实现如下: static inline ulong zend_inline_hash_func(const char *arKey, uint nKeyLength){ `register ulong` hash `= 5381;` `/* variant with the` hash `unrolled eight` times `*/` for `(; nKeyLength >= 8; nKeyLength -= 8) {` hash `= ((`hash `<<` 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++; hash `= ((`hash `<<` 5) + hash) + *arKey++;hash = ((hash << 5) + hash) + *arKey++; ...

February 2, 2021 · 3 min · jiezi

关于php:聊聊PHP虚拟机

什么是虚拟机?“虚拟机”是个十分大的概念,从字面意思了解,“虚拟机”就是“虚构的计算机”,咱们在学习服务端编程时,置信大部分同学都接触过虚拟机。有这样一种场景,因为咱们日常应用的计算机大部分是Windows操作系统,但绝大多数的服务端软件却都运行在Linux零碎上,假如咱们在Windows上进行编程,就无奈间接在Windows上进行测试,十分不不便。基于这样的场景于是就有了虚拟机,它的作用是能够在windows零碎的根底上运行Linux零碎,而后咱们就能够很不便的在windows零碎上测试Linux零碎的程序。这个Linux操作系统是通过某种技术手段虚构进去的,两头的过程非常复杂,无奈用喋喋不休来形容。 明天想聊的虚拟机和下面说的虚拟机略有不同,然而它们要解决的问题是一样的。下面说的虚拟机,它虚构出了一个残缺的操作系统,我把它称之为“操作系统级虚拟机”。而咱们明天要聊的虚拟机它是针对编程语言的,它能达到的成果是,同一份代码运行在不同的操作系统上输入雷同的后果,能够实现一次编写到处运行,我把它称为“语言级虚拟机”。咱们十分相熟的Java、PHP、Python等编程语言,实际上都是基于虚拟机的语言,它们都具备跨平台性,咱们只须要编写一次代码,就能够运行在不同的操作系统上,并且输入简直完全相同的后果。 理解过零碎编程的同学应该都晓得,不同操作系统对于同一个性能所提供的“零碎API”可能是不一样的。例如 Windows和Linux零碎都提供了网络监听的API,然而它们对应的SOCKET API却不同,假如咱们应用平台相干的编程语言(例如:C、C++),咱们在编程时就必须要留神这样的区别,并且针对不同的操作系统做相应的兼容解决,否则程序在Linux零碎上能失常运行,然而Windows就会报错。这种相似的区别十分多,具体细节要看对应的零碎编程手册才晓得。有的零碎API齐全不同,而有的仅仅是个别参数不同,办法名完全相同,程序员在编写代码时须要时刻留神这些,能力编写出强壮的跨平台代码,这对老手来讲是十分艰难的,并且这样一来,程序员就须要把很大一部分精力破费在兼容性问题上,而不能专一于理论性能的开发。 有了虚拟机之后,下面的问题就不复存在了。虚拟机的作用简略来说就是中介代理,好比咱们初来乍到大城市要租房子,北上广等大城市的房东那么多,如果没有房产中介(虚拟机),咱们就须要和N个房东对接,而后能力租到适合的房子;有了房产中介(虚拟机),咱们只须要通知房产中介(虚拟机)咱们要租什么样的房子,由房产中介(虚拟机)去协调各个房东,咱们就能租到适合的房子,过程不同,最初的后果是雷同的。同理,以Socket API调用为例,咱们把编写好的代码交给虚拟机,再由虚拟机来负责调用零碎API,相当于两头加了一层中介代理,虚拟机将依据操作系统抉择正确的Soekct API,来帮咱们实现最终的性能。这样的益处是程序员不再须要关注底层API的细节,能够专一于真正性能的编写,虚拟机帮咱们屏蔽底层零碎API的细节,并且编程的门槛也大大降低,代码健壮性也大大提高。 PHP的执行过程PHP解释执行过程理解PHP的同学都晓得,PHP是一种解释型语言,也称作脚本语言,它的特点就是轻量、简略易用。传统的编程语言在运行前都须要进行编译、链接,而后能力执行并输入后果。而脚本语言(PHP)则省略了这个过程,间接通过shell命令就能执行执行并输入对应的后果,十分轻量、直观、易上手。不瞒大家说,我在入坑编程时也学过Java,为什么最初入了PHP的坑呢,可能就是这些特点吸引的我。方才咱们只说了PHP的长处,然而大多数时候都是有得必有失,我想编程语言也一样,PHP十分轻量、易上手那么它必然是就义了某种长处为代价的,否则为什么其它编程语言不这么做呢。接下来咱们就聊一聊PHP的执行过程,我想理解了PHP的执行过程,就能了解PHP语言设计上的取舍了。 以下是PHP在开启了Opcache缓存后程序运行的次要过程。图-1 从 图-1 中能够看到,载入PHP代码文件后,首先通过词法分析器(re2c/lex),从代码中提取出 单词符号(token),而后再通过 语法分析器(yacc/bison),从token中发现语法结构后,生成形象语法树(AST),再经由动态编译器生成Opcode,最初由解释器模仿机器指令来执行每一条Opcode。 另外,当PHP开起了Opcache后,ZendVM会对Opcode进行缓存解决,缓存在共享内存中。不仅如此,ZendVM还会对编译后的Opcode进行优化,编译的优化技术包含 办法内联、常量流传、反复代码删除 等。有了Opcache后,不仅能够省略掉 词法剖析、语法分析、动态编译等步骤,同时Opcode也被额定优化了,程序的执行效率比首次执行时的速度更快。 以上就是PHP解释执行的过程,尽管解释执行对程序员十分敌对,省略了动态编译的步骤,但实际上这个过程并没有省略,只是由虚拟机帮咱们实现了,以就义一部分性能为代价,换来了轻量、易用性、灵活性。其中 词法剖析、语法分析、动态编译、解释执行 这些流程都是在执行时实现的。 编译型语言执行过程理解过解释型语言的执行过程后,作为比照咱们再来看下编译型语言的执行过程,来看看它相比比解释型语言有什么不同。图-2从图-2中咱们能够看到,虚线框中的执行过程包含:词法剖析、语法分析、编译,这3步在PHP解释执行时也同样有,惟一的区别是,C/C++这3步是提前由编译器在编译过程中实现的,这样能够在运行时节俭大量的工夫和开销。生成汇编代码后,第4步是链接汇编文件,并生成可执行文件,这里的可执行文件指的是二进制的机器码,CPU能够间接执行不须要再额定翻译,这4个步骤合起来称为动态编译。能够很显著的看到,编译型语言绝对解释型语言在后期须要做更多的工作,但换来的是更高的性能和执行效率。因而,个别在大型的我的项目中,因为对性能要求比拟高,代码量也很大,如果采纳解释型语言会大大降低执行效率,应用动态编译型可能取得更好的执行效率,升高服务器洽购老本。 什么是JIT?JIT能够说是虚拟机中最有技术含量的技术,方才咱们别离讲了解释型语言和编译型语言执行的过程,也剖析了它们各自的劣势和劣势,咱们能够思考一下,有没有一种技术,既有解释型语言轻量、易上手的长处,同时也领有编译型语言的高性能,论断就是JIT。上面咱们要介绍的就是编程语言中的JIT技术,它的全称是“即时编译”,具体指的是什么呢?咱们先来看下维基百科对即时编译的定义。 在计算机技术中,即时编译(英语:just-in-time compilation,缩写为JIT;又译及时编译、实时编译),也称为动静翻译或运行时编译,是一种执行计算机代码的办法,这种办法波及在程序执行过程中(在运行期)而不是在执行之前进行编译。通常,这包含源代码或更常见的字节码到机器码的转换,而后间接执行。实现JIT编译器的零碎通常会一直地剖析正在执行的代码,并确定代码的某些局部,在这些局部中,编译或从新编译。方才咱们说了,JIT既领有解释型语言的轻量易用性,同时领有高性能,那么它是如何实现的呢?以PHP8中退出了JIT的个性为例,下图形容了PHP开启了JIT个性后的执行流程,PHP8-JIT是在Opcache优化的根底上更进一步,将Opcache中保留的Opcode优化后再进行编译,将Opcode编译成CPU可辨认的可执行文件,也就是二进制文件,相当于C++编译后的可执行文件,只不过这个过程不须要在运行前实现,而是在运行时,虚拟机开启后盾线程,将Opcode转换成二进制文件,有了二进制文件缓存后,当下次执行该逻辑时,CPU就能够间接执行,不须要再通过解释,实践性能和C++一样。这样的益处就是既保留了PHP语言的易用性、灵活性,同时也取得了高性能。 图-3 JIT的触发条件JIT实际上就是把运行时的一部分代码,转换成可执行文件并缓存起来,减速下次代码的执行。那么JIT是程序启动后就会触发吗? JIT在程序首次启动时并不会起作用,能够了解为PHP/Java代码在首次执行时,其实依然是以解释的模式运行的,JIT须要在程序运行一段时间后能力真正触发。说到这里,大家有没有跟我有一样的疑难,为什么JIT不在程序启动时,就把所有的代码都转换成可执行文件缓存起来,就像C++一样,这样岂不是效率更高。在Java语言中的确有少部分这样的利用,但并不是支流。次要有以下几方面的起因 全副编译成二进制文件须要消耗很多工夫,程序启动会十分慢,这对于大型项目来说是不可承受的并不是所有的代码都有必要进行性能优化,大部分代码在理论场景中用的并不多编译成二进制会占用很大的容量提前编译好相当于是动态的编译,JIT编译绝对于动态编译有很多不可代替的劣势JIT的触发条件,次要是基于“计数器的热点探测”,虚构机会为每个办法(或者代码块)建设计数器,如果执行次数超过肯定的阈值就认为它是“热点办法”,在达到阈值后,虚构机会开启后盾线程将该代码块编译成可执行文件,缓存在内存中,减速下次执行的速度。以上只是简略形容了热点代码的触发规定,理论的虚拟机采纳的规定,会比这个更简单。 JIT&提前编译的优劣势JIT编译器是在运行时进行的,咱们很容易发现,它和提前编译相比有几个很显著的劣势。首先,JIT编译须要耗费运行时的计算资源,本来这些资源能够用来执行程序,不论JIT编译器如何优化(例如:分层编译),这是始终没方法回避的问题,其中最耗费资源的一步是“过程间剖析”,比方剖析这个办法是否永远不可能被调用,形象办法是否永远只会调用繁多版本的论断,这些信息对生成高质量的代码有十分高的价值,然而要准确的失去这些信息,必须要通过大量的耗时计算,耗费大量运行时的计算资源。反过来,如果这些耗时的工作的提前编译时就实现了,运行时就只需享受高质量代码带来的高性能,最多就是提前编译时略微慢一点,但这都是能够承受的。 说了这么多,那JIT编译和提前编译相比,在性能优化上就真的没什么劣势了吗?论断是不是的,JIT编译有很多提前编译不可代替的劣势。正是因为JIT编译器是在运行时进行的,所以JIT编译器能获取到程序实在的数据,通过一直收集程序运行时的监控信息,并对这些数据进行剖析,JIT编译器能够对程序做一些激进的优化,这是提前的动态编译器做不到的。 首先是,性能剖析制导优化。比如说JIT编译器在运行时,通过程序运行的监控数据,如果发现某些代码块被执行的特地频繁,那能够集中优化这一块代码,例如:给这段代码调配更好的寄存器、缓存等。 而后是激进预测优化。比如说有一个接口,它的实现类有3个,但在实在运行过程中,95%以上的工夫都在运行A这个实现类,通过数据的剖析,那就能够激进的对它进行预测,每次都执行A,如果发现有几次预测谬误了,能够退回到解释状态再次执行,但只是小概率事件,并且不影响程序执行的后果。 最初是链接时优化,传统的编译器的步骤是编译优化和链接是离开的,什么意思呢?退出某个程序须要用到A、B、C 3个库,编译器先各自编译这3个类库,并且进行各种伎俩的优化,转换成汇编代码保留到文件中,最初一步是将这3个汇编文件链接起来,最终转换成可执行文件。这里存在一个问题,A、B、C 3个库在编译时是别离进行优化的,假如A和B中有些办法是反复执行的,或者能够办法内联来优化,那是无奈做到的。然而JIT编译器是的不同之处在于,它是运行时动静链接的,能够针对整个程序的调用栈进行优化,这样的优化更加彻底。 总结写这篇博客的次要目标,是对本人这段时间学习虚拟机相干技术的一个总结,在我谷歌搜寻PHP虚拟机相干文章时,发现可参考的文章寥寥无几。因为Java和PHP的执行原理很相近,我想能够通过学习Java虚拟机来理解ZendVM的工作原理,Java虚拟机十分成熟,能够说是虚拟机的鼻祖,JVM世面上的优良书籍十分多,JVM关上了我的新世界,让我对虚拟机有了全新的意识,JIT技术更是惊艳到我。最初,PHP是世界上最好的语言! 参考《深刻了解Java虚拟机(第3版)》深刻了解PHP opcode优化PHP 8新个性之JIT简介PHP JIT in DepthJava 9 AOT 初探How PHP's Just In Time compiler works

February 2, 2021 · 1 min · jiezi

关于php:记一次PHP优化案例

网站架构简介:当初很多的企业都是应用lnmp或者lamp来做企业的网站服务器架构,这两种网站的服务架构,咱们都是比拟相熟的;基于nginx的性能优于Apache,现阶段的很多公司,都是逐步把Apache替换成nginx,毕竟nginx的自带的高可用配置,反向代理等等性能相当突出。 Lnmp网站服务器架构,其实就是linx+nginx+mysql+php架构体系,架构装置我就不多说了。接下来咱们来谈谈,我遇到案例吧 案例: 有一天,后盾的共事,说后盾拜访很慢,而且有时候呈现502谬误。而后反馈给技术下级,接着又找到我解决一下(那时在喝着茶),而后我晓得又有事干了。 剖析: 而后我间接找到那个共事,问问是不是网络起因啊,我也叫其余的共事,拜访一下,还是呈现拜访忙的问题。这时我就晓得事件没那么简略了。公司利用的是lnmp网站服务器架构,以前没有做太多的优化,接下来咱们须要优化网站的服务架构了 一、案例剖析。 咱们能够想到,既然是拜访迟缓,有时候间接拜访不了,以前是没问题的,到当初就忽然呈现了问题,那必然是咱们的nginx与php响应不过去导致的,起因可能是其余域名网站的用户连接数巨增导致的。那咱们找到问题的本源解决并优化就能够了。接着凭着本人的教训与百度,去解决问题。 二、问题解决与过程剖析 1、Nginx优化: 1、查看nginx的日志,找出谬误 `$` cat `/usr/local/nginx/logs/error.log` | grep `error`没发现错误,失常 查看后盾域名的access.logs $ cat /var/log/access_nging.log | grep error (这里没及时截到图,日志是被刷了,本地做了日志切割,并定时删除了) 发现日志日志外面能够找到error错误信息,并且有十几个502谬误。找到呈现的问题了。 2、问题剖析以及nginx优化 1、nginx关上文件数限度导致的。 1)、首先咱们想到可能的起因nginx的关上文件书的问题,减少nginx的关上文件数 进入nginx配置文件,发现关上文件数为4096,果不其然,关上文件数没有调到最佳,可能是这个起因导致的。咱们须要把4096改为51200;保留从新加载nginx vim /usr/local/nginx/conf/nginx.conf worker_rlimit_nofile 51200; events { worker_connections 51200; } service nginx relaod 2)、Linux系统文件限度 咱们改了nginx的关上文件配置,不肯定有用,咱们须要看一下零碎的限度的关上文件数 ulimit –n 咱们能够看到零碎的文件关上数量也是4096,接下来,咱们更改一下零碎的关上文件数,并配置永恒失效。 进入配置文件 vim /etc/security/limits.conf 更改参数: soft nofile 65535hard nofile 65535soft nproc 65535hard nproc 65535注:零碎限度能够轻易改,我只有比nginx的关上文件数大就好。 3、nginx的fastcgi连接时间太短导致的。 个别nginx响应php,都是通过FastCGI接口来调用,所以fastcgi参数配置很重要,当HTTP服务器每次遇到动静程序时,能够将其间接交付给FastCGI过程来执行,而后将失去的后果返回给浏览器,而很多php的网页都是采纳动静程序。所以fastcgi的配置,也起的至关重要的作用。所以这是一个优化不可短少的一部分。 进入nginx.conf配置文件 vim /usr/local/nginx/conf/nginx.conf 把fastcgi的connect、send、read的参数的工夫改成300,配置如下: 从新加载nginx service nginx reload ...

February 2, 2021 · 1 min · jiezi

关于php:ThinkAPI服务更新IP白名单

ThinkAPI对立API接口服务是由官网联结合作伙伴封装的一套接口调用服务及SDK,旨在帮忙ThinkPHP开发者更不便和更低成本调用官网及第三方的提供的各类API接口及服务,从而更好的构建开发者生态。本次ThinkAPI服务更新如下: 减少IP白名单性能鉴于API接口调用的安全性思考,减少了IP白名单性能,能够在集体设置->API治理右上角点击IP白名单按钮设置接口调用的IP白名单,如果没有设置任何白名单,则示意不限IP拜访。如果你出于某些起因须要裸露本人账号的appCode给第三方倡议设置IP白名单以保障平安。 减少2021春运防疫政策查问接口减少2021春运防疫政策查问接口(收费接口),接口文档:https://docs.topthink.com/think-api/2139736 2021年各地出行防疫政策查问下架抖音相干接口因为政策起因及服务商并发能力思考,为了更好的可继续倒退API对立接口服务,API市场决定对抖音相干接口做下架解决,对于曾经购买接口次数的用户能够抉择退款或者持续应用至次数用完。后续如需服务咱们会独自疏导给接口服务商 对于造成的不便 咱们深感歉意。如需退款请分割市场在线客服。

February 2, 2021 · 1 min · jiezi

关于php:php开发memcached

一、memcached 简介memcached是高性能的分布式内存缓存服务器。个别的应用目标是,通过缓存数据库查问后果,缩小数据库拜访次数,以进步动静Web利用的速度、进步可扩大 性。它能够应答任意多个连贯,应用非阻塞的网络IO。因为它的工作机制是在内存中开拓一块空间,而后建设一个HashTable,Memcached自治理这些HashTable。 二、memcached 装置(参考” Linux下的Memcache装置”)首先是下载 memcached 了,目前最新版本是 1.4.0,间接从官方网站即可下载到 memcached-1[1].4.0.tar.gz。除此之外,memcached 用到了 libevent,我yum install libevent libevent-devel 接下来是将 memcached-1[1].4.0.tar.gz 解开包、编译、装置: tar -xzf memcached-1.1.12.tar.gz cd memcached-1.1.12 ./configure make make install 三、运行 memcached 守护程序运行 memcached 守护程序很简略,只需一个命令行即可,不须要批改任何配置文件(也没有配置文件给你批改): /usr/local/bin/memcached -d -m 128 -l 192.168.x.y -p 11211 -u www 参数解释: -d 以守护程序(daemon)形式运行 memcached; -m 设置 memcached 能够应用的内存大小,单位为 M; -l 设置监听的 IP 地址,如果是本机的话,通常能够不设置此参数;(个别是不写) -p 设置监听的端口,默认为 11211,所以也能够不设置此参数; -u 指定用户,如果以后为 root 的话,须要应用此参数指定用户。 当然,还有其它参数能够用,man memcached 一下就能够看到了。 四、memcached 的工作原理首先memcached 是以守护程序形式运行于一个或多个服务器中,随时承受客户端的连贯操作,客户端能够由各种语言编写,目前已知的客户端 API 包含 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客户端在与 memcached 服务建设连贯之后,接下来的事件就是存取对象了,每个被存取的对象都有一个惟一的标识符 key,存取操作均通过这个 key 进行,保留到 memcached 中的对象实际上是搁置内存中的,并不是保留在 cache 文件中的,这也是为什么 memcached 可能如此高效疾速的起因。留神,这些对象并不是长久的,服务进行之后,里边的数据就会失落。 ...

February 1, 2021 · 4 min · jiezi

关于php:大话PHP之性能

1缘起对于PHP,很多人的直观感觉是PHP是一种灵便的脚本语言,库类丰盛,应用简略,平安,非常适合WEB开发,但性能低下。PHP的性能是否真的就如同大家的感觉一样的差呢?本文就是围绕这么一个话题来进行探讨的。从源码、利用场景、基准性能、比照剖析等几个方面深入分析PHP之性能问题,通过实在的性能数据来谈话,最终找出影响PHP模块性能的关键因素。 2从原理剖析PHP性能从原理剖析PHP的性能,次要从以下几个方面:内存治理、变量、函数、运行机制、网络模型来进行剖析。 2.1内存治理相似Nginx的内存治理形式,PHP在外部也是基于内存池,并且引入内存池的生命周期概念。在内存池方面,PHP对PHP脚本和扩大的所有内存相干操作都进行了托管。对大内存和小内存的治理采纳了不同的实现形式和优化。在内存调配和回收的生命周期内,PHP采纳一次初始化申请+动静扩容+内存标识回收机制,并且在每次申请完结后间接对内存池进行从新mask。 2.2变量总所周知,PHP是一种弱变量类型的语言,所以在PHP外部,所有的PHP变量都对应成一种类型Zval,其中具体定义如下: 在变量方面,PHP做了大量的优化工作,比如说Reference counting和copy on writer机制。这样可能保障内存应用上的优化,并且缩小内存拷贝次数(请参考http://blog.xiuwz.com/2011/11...)。在数组方面,PHP外部采纳高效的hashtable来实现。 2.3函数在PHP外部,所有的PHP函数都回转化成外部的一个函数指针。比如说扩大中函数 ZEND_FUNCTION ( my_function );//相似function my_function(){} 在外部开展后就会是一个函数 void zif_my_function ( INTERNAL_FUNCTION_PARAMETERS ); void zif_my_function( int ht, zval * return_value, zval * this_ptr, int return_value_used, zend_executor_globals * executor_globals ); 从这个角度来看,PHP函数在外部也是对应一个函数指针。 2.4运行机制在话说PHP性能的时候,很多人都会说“C/C++是编译型,JAVA是半编译型,PHP是解释型”。也就是说PHP是先动静解析再代码运行的,所以从这个角度来看,PHP性能必然很差。 确实,从PHP脚本运行来输入,确实是一个动静解析再代码运行的过程。 PHP的运行阶段也分成三个阶段:●Parse。语法分析阶段。● Compile。编译产出opcode两头码。● Execute。运行,动静运行进行输入。 通过上图也能够看出,其实在PHP外部自身也是存在编译的过程。事实上,在规范的生产环境中,也都基本上利用了这个特点,比如说opcode cache工具apc、eacc、xcache等等。基于opcode cache,能到做到“PHP脚本编译一次,屡次运行”的成果。从这点上,PHP就和JAVA的半编译机制十分相似。 所以,从运行机制上来看,PHP的运行模式和JAVA是十分相似的,都是先产生两头码,而后运行在不同虚拟机上。 2.5动静运行从下面的几个剖析来看,PHP在内存治理、变量、函数、运行机制等几个方面都做了大量的工作,所以从原理来看,PHP不应该存在性能问题,性能至多也应该和JAVA比拟靠近。 但为什么还有很多人感觉PHP慢呢?尤其是一些计算量的性能比照上,总发现PHP解决的性能绝对比拟低效。这个时候就不得不谈PHP动静语言的个性所带来的性能问题了,因为PHP是动静运行时,所以所有的变量、函数、对象调用、作用域实现等等都是在执行阶段中才确定的。这个从根本上决定了PHP性能中很难扭转的一些货色:在C/C++等可能在动态编译阶段确定的变量、函数,在PHP中须要在动静运行中确定,也就决定了PHP两头码不能间接运行而须要运行在Zend Engine上。 说到PHP变量的具体实现,又不得不说一个货色了:hashtable。Hashtable能够说在PHP灵魂之一,在PHP外部宽泛用到,蕴含变量符号栈、函数符号栈等等都是基于hashtable的。 以PHP变量为例来阐明下PHP的动静运行特点,比如说代码: <?php$var = “hello, blog.xiuwz.com”;?>该代码的执行后果就是在变量符号栈(是一个hashtable)中新增一个项 当要应用到该变量时候,就去变量合乎栈中去查找(也就是变量调用对出了一个hash查找的过程)。 同样对于函数调用也基本上相似有一个函数符号栈(hashtable)。 其实对于动静运行的变量查找特点,在PHP的运行机制中也能看出一些。 能够看出,PHP代码在compile之后,产出的了类符号表、函数符号表、和OPCODE。在真正执行的时候,zend Engine会依据op code去对应的符号表中进行查找,解决。 从某种程度上,在这种问题的上,很难找到解决方案。因为这是因为PHP语言的动静个性所决定的。然而在国内外也有不少的人在寻找解决方案。因为通过这样,可能从根本上齐全的优化PHP。典型的列子有facebook的hiphop。 但所有的这种编译优化计划,都基本上是就义了PHP动静运行的个性。当然能够在具体的编译优化中去对动静个性做一些折中,但很难做到完完全全的兼容。 2.6网络模型目前采纳PHP的形式,比拟现实和通用的模式是采纳fastcgi(PHP-FPM)。Php-fpm在网络模型上比拟相似nginx,采纳了多过程Master+多worker的模式。Php-fpm自身是基于libevent中的epoll模型。从网络模型来看,该形式也不会和其余网络模型存在性能差别。 2.7论断从下面剖析来看,在根底的内存治理、变量、函数、运行机制、网络模型方面,PHP自身并不会存在显著的性能差别,但因为PHP的动静运行个性,决定了PHP和其余的编译型语言相比,所有的变量查找、函数运行等等都会多一些hash查找的CPU开销和额定的内存开销,至于这种开销具体有多大,能够通过后续的基准性能和比照剖析得出。 因而,也能够大体看出PHP不太适宜的一些场景:大量计算性工作、大数据量的运算、内存要求很严格的利用场景。如果要实现这些性能,也倡议通过扩大的形式实现,而后再提供钩子函数给PHP调用。这样能够减低外部计算的变量、函数等系列开销。 3基准性能对于PHP基准性能,目前短少规范的数据。大多数同学都存在理性的意识,有人认为800QPS就是PHP的极限了。此外,对于框架的性能和框架对性能的影响很没有响应的权威数字。 本章节的目标是给出一个基准的参考性能指标,通过数据给大家一个直观的理解。 具体的基准性能有以下几个方面: 1、 裸PHP性能。实现根本的性能。 ...

February 1, 2021 · 2 min · jiezi

关于php:ubuntu1604快速安装LNMP

ubuntu16默认装置的LNMP(nginx:1.10 php:7.0 mysql:5.7)1.更新ubuntu软件源: apt-get update2.装置nginx: apt-get install nginx拜访ip能够看到Welcome Nginx的界面,阐明nginx装置胜利3.装置mysql: apt-get install mysql-server mysql-client4.装置php: apt-get install php php-gd php-xml php-mbstring php-curl php-mysql php-mongodb5.nginx简略配置: vim /etc/php/7.0/fpm/pool.d/www.conf #批改php-fpm配置文件listen = /run/php/php7.0-fpm.sock#listen = 127.0.0.1:9000php-fpm7.0 -t #查看下配置文件是否有谬误service php7.0-fpm restart #重启 php-fpm7.0 vim /etc/nginx/sites-enabled/default #批改nginx配置文件root /var/www;# Add index.php to the list if you are using PHPindex index.php index.html index.htm index.nginx-debian.html;location ~ \.php$ { #socket 形式 必须和php-fpm设置的listen门路一样 # With php7.0-fpm: fastcgi_pass unix:/run/php/php7.0-fpm.sock; # With php7.0-cgi alone: #fastcgi_pass 127.0.0.1:9000;}nginx -t #查看下配置文件是否有谬误service nginx restart #重启nginx6.网站测试: ...

February 1, 2021 · 1 min · jiezi

关于php:编译语言和解释型语言

编译语言1. 可执行程序不能够跨平台。编译语言个别是不能跨平台运行的。如windows下.exe可执行程序不能在Mac OS零碎下运行2. 源代码不能够跨平台。不同平台反对的函数、类型、变量不雷同3. 执行前须要先编译成可执行文件,一次编译屡次执行4. 因为运行的编译后的可执行文件,不会裸露源码,源码绝对平安解释型语言1. 源代码可跨平台2. 边转换边执行2. 因为每次执行都须要解释器从新转换源代码为二进制代码,效率偏低3. 解释型语言是须要源码才能够运行的,源码安全性没有编译型语言高

February 1, 2021 · 1 min · jiezi

关于php:mysql事务的实现原理

此篇文章算是对mysql事务的一个总结,根本把mysql事务相干的知识点都涵盖到了,面试问来问去无非也就是这些,在理解这些之前咱们先对mysql在执行的过程中 有一个整体的意识,如下图 如上图所示,MySQL服务器逻辑架构从上往下能够分为三层: (1)第一层:解决客户端连贯、受权认证等。 (2)第二层:服务器层,负责查问语句的解析、优化、缓存以及内置函数的实现、存储过程等。 (3)第三层:存储引擎,负责MySQL中数据的存储和提取。MySQL中服务器层不治理事务,事务是由存储引擎实现的。MySQL反对事务的存储引擎有InnoDB、NDB Cluster等,其中InnoDB的应用最为宽泛;其余存储引擎不反对事务,如MyIsam、Memory等。 具体过程都在图中有所标注,大略看看有个意识就能够了。接下来咱们逐个总结 典型的MySQL事务是如下操作的:start transaction;…… #一条或多条sql语句commit;其中start transaction标识事务开始,commit提交事务,将执行后果写入到数据库。如果sql语句执行呈现问题,会调用rollback,回滚所有曾经执行胜利的sql语句。当然,也能够在事务中间接应用rollback语句进行回滚。 主动提交MySQL中默认采纳的是主动提交(autocommit)模式,如下所示: mysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | ON |+---------------+-------+1 row in set (0.00 sec)在主动提交模式下,如果没有start transaction显式地开始一个事务,那么每个sql语句都会被当做一个事务执行提交操作。 通过如下形式,能够敞开autocommit;须要留神的是,autocommit参数是针对连贯的,在一个连贯中批改了参数,不会对其余连贯产生影响。 mysql> set autocommit =0;Query OK, 0 rows affected (0.00 sec)mysql> show variables like 'autocommit';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit | OFF |+---------------+-------+1 row in set (0.00 sec)如果敞开了autocommit,则所有的sql语句都在一个事务中,直到执行了commit或rollback,该事务完结,同时开始了另外一个事务。 非凡操作在MySQL中,存在一些非凡的命令,如果在事务中执行了这些命令,会马上强制执行commit提交事务;如DDL语句(create table/drop table/alter/table)、lock tables语句等等。 不过,罕用的select、insert、update和delete命令,都不会强制提交事务。 事务的特点:ACID原子性(Atomicity)定义 原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做;如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。简略来说,就是$\color{red}{要么全副失败,要么全副胜利}$ 实现原理在阐明原子性原理之前,首先介绍一下MySQL的事务日志。MySQL的日志有很多种,如二进制日志、谬误日志、查问日志、慢查问日志等,此外InnoDB存储引擎还提供了两种事务日志:redo log(重做日志)和undo log(回滚日志)。其中redo log用于保障事务持久性;undo log则是事务原子性和隔离性实现的根底。 ...

February 1, 2021 · 1 min · jiezi

关于php:final关键字在PHP中的使用

final关键字的应用非常简单,在PHP中的最次要作用是定义不可重写的办法。什么叫不可重写的办法呢?就是子类继承后也不能从新再定义这个同名的办法。 class A { final function testA(){ echo 'This is class A!', PHP_EOL; }}class childA extends A { // Fatal error: Cannot override final method A::testA() function testA(){ echo 'This is class childA', PHP_EOL; }}而如果在类定义前加上这个关键字的话,则类也是不可继承的。 final class B { function testB(){ echo 'This is class B!', PHP_EOL; }}// Fatal error: Class childB may not inherit from final class (B)class childB extends B{}由此可见,final关键字就和他自身的意义一样,这个类或者办法是不可扭转的。那么接口能不能用这个关键字呢?答案当然是否定的,接口的意义自身就是定义一个契约让实现类来实现,如果定义了final关键字,那么接口的意义就不存在了,所以从语言层面来说接口以及接口中的办法就不能应用final关键字。 interface C { // Fatal error: Access type for interface method C::testC() must be omitted final function testC();}在Java中,final还能够用来定义常量,但在PHP中,类常量是通过const来定义的。所以final定义不了变量。 ...

February 1, 2021 · 1 min · jiezi

关于php:php实现五大io模型1阻塞与非阻塞

阻塞:是指应用程序执行IO操作须要彻底实现后才返回到用户空间非阻塞:是指应用程序执行IO操作被调用后立刻返回给用户一个状态值,无需等到IO操作彻底实现。 阻塞模型: 非阻塞模式: 阻塞模式下,用户过程会始终期待内核态数据,所以效率极低。打个比方:小明要烧水,他就始终等着水烧开才行,但其实,在烧水过程中小明还能去做别事。做个优化就是非阻塞模式,用户过程在执行IO操作后,内核态会立刻返回一个数值通常就是空,用户过程能够去做别的事,等内核态数据后果好了在申请获取真正的执行后果。以下面小明例子就是,小明烧水时候,就能够去看书了,看一会去看看水是否开了,查看水是否烧开,同时又能看书学习。 性能剖析:假如一个程序须要执行两个操作a和b,其中a须要执行IO操作,b不须要。阻塞模式下耗费工夫等于a+b,而非阻塞模式等于a和b中耗费工夫最大都操作。服务端代码: $server = stream_socket_server('tcp://127.0.0.1:9999', $erron, $error);while (true) { $conn = stream_socket_accept($server); if ($conn) { $data = fread($conn, 65535); echo $data; sleep(3); fwrite($conn, 'this is server'); fclose($conn); }}阻塞客户端: function operation(){ sleep(2);}echo "client start n";$client = stream_socket_client('tcp://127.0.0.1:9999', $erron, $error, 60);fwrite($client, "is client 1n");echo fread($client, 65535);operation();fclose($client);非阻塞客户端: function operation(){ sleep(2);}echo "client start n";$client = stream_socket_client('tcp://127.0.0.1:9999', $erron, $error, 60);stream_set_blocking($client, 0);//设置非阻塞fwrite($client, "is client 1n");operation();while (!feof($client)) { sleep(1); var_dump(fread($client, 65535));}fclose($client);工夫耗费: 阻塞模式非阻塞模式 学习总结:利用对象形式封装了一套io网络库有须要能够参考一下:https://github.com/liweiphp/io-mode ...

January 30, 2021 · 1 min · jiezi

关于php:彻底搞明白PHP中的include和require

在PHP中,有两种蕴含内部文件的形式,别离是include和require。他们之间有什么不同呢? 如果文件不存在或产生了谬误,require产生E_COMPILE_ERROR级别的谬误,程序进行运行。而include只产生正告,脚本会继续执行。这就是它们最次要的区别,其余方面require根本等同于include。 被蕴含文件先按参数给出的门路寻找,如果没有给出目录(只有文件名)时则依照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最初才在调用脚本文件所在的目录和当前工作目录下寻找如果定义了门路不论是绝对路径还是当前目录的相对路径 include_path 都会被齐全疏忽include_path 在php.ini中定义当一个文件被蕴含时,其中所蕴含的代码继承了 include 所在行的变量范畴。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在蕴含文件中定义的函数和类都具备全局作用域除了一般的require和include之外,还有require_once和include_once,他们的作用是: 如果该文件中曾经被蕴含过,则不会再次蕴含。如同此语句名字暗示的那样,只会蕴含一次能够用于在脚本执行期间同一个文件有可能被蕴含超过一次的状况下,想确保它只被蕴含一次以防止函数重定义,变量从新赋值等问题咱们来看些例子: // a.php 不存在include "a.php"; // warning// require "a.php"; // errorecho 111; // 应用include时111会输入// file1.php 中只有一行代码echo 'file1';require_once 'includeandrequire/file1.php'; // file1require_once 'includeandrequire/file1.php'; // notinginclude_once 'includeandrequire/file1.php'; // notinginclude_once 'includeandrequire/file1.php'; // notingrequire 'includeandrequire/file1.php'; // file1require 'includeandrequire/file1.php'; // file1require 'includeandrequire/file1.php'; // file1require 'includeandrequire/file1.php'; // file1咱们能够看出当第一个_once加载胜利后,前面不论是require_once还是include_once,都不会再加载这个文件了。而不带_once的则会反复加载文件。 file2.php<?phpecho 'file2:' . $a, PHP_EOL;echo 'file2:' . $b, PHP_EOL;$b = "file2";myFile.php<?php$a = 'myFile';$b = 'youFile';require_once 'includeandrequire/file2.php';echo $a, PHP_EOL;echo $b, PHP_EOL;// 输入后果// file2:myFile// file2:youFile// myFile// file2file3.php<?php$c = 'file3';myFile.php<?phpfunction test(){ require_once 'includeandrequire/file3.php'; echo $c, PHP_EOL; // file3}test();echo $c, PHP_EOL; // empty被蕴含文件中能够获取到父文件中的变量,父文件也能够取得蕴含文件中的变量,然而,须要留神_once的一个非凡状况。 ...

January 30, 2021 · 1 min · jiezi

关于php:Swoole-v46-版本新特性之-SNI-支持

Swoole 在 v4.6.0 版本中对 SNI 进行了反对,这篇文章就对这个新个性进行一些演示和阐明。 先来理解一下什么是 SNI 协定? Server Name Identification 简称 SNI,是一个扩大的 TLS 计算机联网协定,用来解决一个服务器领有多个域名的状况。 在该协定下,在握手过程开始时通过客户端通知它正在连接的服务器的主机名称。这容许服务器在雷同的 IP 地址和 TCP 端口号上出现多个证书,并且因而容许在雷同的 IP 地址上提供多个平安 HTTPS 网站(或其余任何基于 TLS 的服务),而不须要所有这些站点应用雷同的证书。 那么如果一台服务器有多个虚拟主机,而且每个主机的域名不一样,应用了不一样的证书,该和哪个主机进行通信? 和 HTTP 协定用来解决服务器多域名的计划相似,HTTP 在申请头中应用 Host 字段来指定要拜访的域名。 而 TLS 的做法也是增加 Host,在客户端收回 SSL 申请中的 Client Hello 阶段进行增加,这样就能够让服务器可能切换到正确的域并返回相应的证书。 在 Swoole 的 GitHub 中也有一个 Issue (#4031),想让 Swoole 的 HTTP Server 反对通过 Hostname 来配置 SSL 信息。 实际上是 Swoole 在 #3908 中曾经进行了反对,不过英文网站的文档还没来及更新,所以没有找到相干阐明。 上面就来演示 Swoole 如何设置 SNI: 首先先下载证书,这里间接应用 Swoole 测试的证书 ...

January 29, 2021 · 3 min · jiezi

关于php:对象赋值在PHP中到底是不是引用

之前的文章中,咱们说过变量赋值的问题,其中有一个问题是对象在进行变量赋值的时候,间接就是援用赋值。那么到底真实情况是怎么呢? 之前变量赋值的文章PHP的变量赋值 对象援用测试在持续深刻的学习PHP手册后,发现原来对象还真不是间接的援用复制。通过上面手册中的例子来进行剖析: class SimpleClass{}$instance = new SimpleClass();$assigned = $instance;$reference = &$instance;$instance->var = '$assigned will have this value';$instance = null; // $instance and $reference become nullvar_dump($instance);var_dump($reference);var_dump($assigned);$instance是实例化后的SimpleClass对象$assigned间接赋值$reference援用赋值首先,咱们给$instance对象定义了一个变量var而后将$instance赋值为null对于援用来说,$reference变量天然也为成了null然而$assigned并没有变成null,它仍然是SimpleClass的实例对象,并且,划重点哦:它有了var属性是不是很神奇,照理说,一般赋值是拷贝,两个变量不会相互影响。而援用赋值是复制指针(雷同的内存地址),批改任意一个变量其余的变量也会扭转。然而对象的一般赋值貌似并不属于它们中的任何一个。 $reference很好了解,自身应用&符号进行了赋值,表明了这个变量是一个援用赋值。它成为了$instance的快捷方式,$instance的所有变动它都都会跟着扭转。这是变量层面的。 $assigned从代码字面上看是一个一般赋值。不过对象是一种非凡的状态,它用一般赋值赋过去的值其实是对象的一个句柄。在PHP手册中有一个Note是如此形容的: 首先,将PHP中的变量看成是一个一个的数据槽。这个数据槽能够保留一个根本类型(int、string、bool等)。创立援用时,这个槽里保留的是内存地址,或者说是指向援用对象的一个指针,援用没有拷贝操作,仅仅是将指针指向了原变量(参考数据结构)。创立一般赋值时,则是拷贝的根本类型。 而对象则与根本类型不同,它不能间接保留在数据槽中,而是将对象的“句柄”保留在了数据槽。这个句柄是指向对象特定实例的标识符。尽管句柄不是咱们所能直观操作的类型,但它也属于根本类型。 当你获取一个蕴含对象句柄的变量,并将其调配给另一个变量时,另一个变量获取的是这个对象的句柄。(留神,不是援用!不是援用!不是援用!!)。通过句柄,两个变量都能够批改同一个对象。然而,这两个变量并没有间接关系,它们是两个独立的变量,其中一个变量批改为其余值时,并不会对另一个变量产生影响。只有该变量在批改对象外部的内容时,另一个变量因为持有雷同的句柄,所以它的对象内容也会相应地产生扭转。 Note原文:https://www.php.net/manual/zh/language.oop5.basic.php#79856 总结通过本文的剖析,咱们能够看出,变量赋值说白了就是变量层面的操作。它保留的永远只是一个值而已。当一般赋值时,这个值就是一个根本类型。当援用赋值时,这个保留的根本类型就是一个指针。不论怎么样,它也不会因为保留的是对象而将一般赋值间接转变为援用赋值,真正的援用赋值是必须要加&符的。 这个内容有点绕,不过这样的内容能力更体现本人的外围能力。读书百遍其义自现,对于手册中的很多常识自己也是来回一直学习能力了解。下面的Note作者写得十分好,英文好的敌人能够间接去看英文原版。 测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E5%AF%B9%E8%B1%A1%E8%B5%8B%E5%80%BC%E5%9C%A8PHP%E4%B8%AD%E5%88%B0%E5%BA%95%E6%98%AF%E4%B8%8D%E6%98%AF%E5%BC%95%E7%94%A8%EF%BC%9F.php 参考文档: https://www.php.net/manual/zh/language.oop5.basic.php各自媒体平台均可搜寻【硬核项目经理】

January 29, 2021 · 1 min · jiezi

关于php:PHP高级编程之消息队列原理与实现方法详解

本文实例讲述了PHP高级编程之音讯队列原理与实现办法。分享给大家供大家参考,具体如下: 什么是音讯队列音讯队列(英语:Message queue)是一种过程间通信或同一过程的不同线程间的通信形式 为什么应用音讯队列音讯队列技术是分布式应用间替换信息的一种技术。音讯队列可驻留在内存或磁盘上,队列存储音讯直到它们被应用程序读出。通过音讯队列,应用程序可独立地执行,它们不须要晓得彼此的地位、或在继续执行前不须要期待接管程序接管此音讯。 什么场合应用音讯队列你首先须要弄清楚,音讯队列与近程过程调用的区别,在很多读者征询我的时候,我发现他们须要的是RPC(近程过程调用),而不是音讯队列。 音讯队列有同步或异步实现形式,通常咱们采纳异步形式应用音讯队列,近程过程调用多采纳同步形式。 MQ与RPC有什么不同? MQ通常传递无规则协定,这个协定由用户定义并且实现存储转发;而RPC通常是专用协定,调用过程返回后果。 什么时候应用音讯队列同步需要,近程过程调用(PRC)更适宜你。 异步需要,音讯队列更适宜你。 目前很多音讯队列软件同时反对RPC性能,很多RPC零碎也能异步调用。 音讯队列用来实现下列需要 ① 存储转发 ② 分布式事务 ③ 公布订阅 ④ 基于内容的路由 ⑤ 点对点连贯 谁负责解决音讯队列通常的做法,如果小的我的项目团队能够有一个人实现,包含音讯的推送,接管解决。如果大型团队,通常是定义好消息协定,而后各自开发各自的局部,例如一个团队负责写推送协定局部,另一个团队负责写接管与解决局部。 那么为什么咱们不讲音讯队列框架化呢? 框架化有几个益处: ① 开发者不必学习音讯队列接口② 开发者不须要关怀音讯推送与接管③ 开发者通过对立的API推送音讯④ 开发者的重点是实现业务逻辑性能 怎么实现音讯队列框架上面是作者开发的一个SOA框架,该框架提供了三种接口,别离是SOAP,RESTful,AMQP(RabbitMQ),了解了该框架思维,你很容易进一步扩大,例如减少XML-RPC, ZeroMQ等等反对。 本文只讲音讯队列框架局部。 6.1. 守护过程音讯队列框架是本地应用程序(命令行程序),咱们为了让他在后盾运行,须要实现守护过程。 每个实例解决一组队列,实例化须要提供三个参数,$queueName = '队列名', $exchangeName = '替换名', $routeKey = '路由' $daemon = new frameworkRabbitDaemon($queueName = 'email', $exchangeName = 'email', $routeKey = 'email'); 守护过程须要应用root用户运行,运行后会切换到普通用户,同时创立过程ID文件,以便过程进行的时候应用。 守护过程外围代码 6.2. 音讯队列协定音讯协定是一个数组,将数组序列化或者转为JSON推送到音讯队列服务器,这里应用json格局的协定。 $msg = array( 'Namespace'=>'namespace',"Class"=>"Email","Method"=>"smtp","Param" => array( $mail, $subject, $message, null)); ...

January 28, 2021 · 1 min · jiezi

关于php:mac下安装phpredis及安装遇到的坑

Redis简介Redis 是齐全开源的,恪守 BSD 协定,是一个高性能的 key-value 数据库。Redis 与其余 key - value 缓存产品有以下三个特点: Redis反对数据的长久化,能够将内存中的数据保留在磁盘中,重启的时候能够再次加载进行应用。Redis不仅仅反对简略的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。Redis反对数据的备份,即master-slave模式的数据备份。编译装置下载包下载地址:redis-4.3.0.tgz 留神: 因为我以后还是应用php5.6.40,所以最初反对这一版本是4.3.0 如果版本抉择谬误可能会呈现上面谬误 装置解压安装包 tar -xzvf redis-4.3.0.tgz通过 phpize 生成编译 configure 配置文件 cd redis-4.3.0/Applications/MAMP/bin/php/php5.6.40/bin/phpize /* 这里肯定要写对应的理论门路 *//configure --with-php-config=/Applications/MAMP/bin/php/php5.6.40/bin/php-config执行phpize呈现 Cannot find autoconf: /Applications/MAMP/bin/php/php5.6.40/bin/phpizeConfiguring for:PHP Api Version: 20121113Zend Module Api No: 20121212Zend Extension Api No: 220121212Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. 装置autoconf brew install autoconf /* 执行这条命令须要在mac装置Homebrew */装置Homebrew举荐看下这篇文章:mac下镜像飞速装置Homebrew教程Homebrew官网地址:brew.sh 编译 makemake install配置 php.ini 文件因为我用的是 MAMP PRO(mac php环境集成软件安装包),这个集成安装包集成了很多的php版本,所以须要批改php.ini配置文件,千万不要去找对应版本的ini文件,因为可能会产生料想不到的事件,重启后可能你之前批改的配置生效。 ...

January 28, 2021 · 1 min · jiezi

关于php:php国密SM3签名算法

php国密SM3签名算法代码地址https://github.com/lizhichao/sm 装置composer require lizhichao/one-sm应用require __DIR__ . '/vendor/autoload.php';// 字符串签名echo \OneSm\Sm3::sign('abc') . PHP_EOL;echo \OneSm\Sm3::sign(str_repeat("adfas哈哈哈", 100)) . PHP_EOL;// 文件签名echo \OneSm\Sm3::signFile(__FILE__) . PHP_EOL;

January 28, 2021 · 1 min · jiezi

关于php:使用PolarDB和ECS搭建门户网站

体验指标本场景基于PolarDB和ECS实现搭建门户网站。 背景常识PolarDB数据库简介PolarDB是阿里云自研的下一代关系型云数据库,有三个独立的引擎,别离能够100%兼容MySQL、100%兼容PostgreSQL、高度兼容Oracle语法,存储容量最高可达100TB,单库最多可扩大到16个节点,实用于企业多样化的数据库利用场景。 PolarDB采纳存储和计算拆散的架构,所有计算节点共享一份数据,提供分钟级的配置升降级、秒级的故障复原、全局数据一致性和收费的数据备份容灾服务。PolarDB既交融了商业数据库稳固牢靠、高性能、可扩大的特色,又具备开源云数据库简略凋谢、自我迭代的劣势,例如PolarDB MySQL性能最高能够晋升至MySQL的6倍,而老本只有商用数据库的1/10。集群架构,计算与存储拆散。 集群架构,计算与存储拆散。PolarDB采纳多节点集群的架构,集群中有一个Writer节点(主节点)和多个Reader节点(读节点),各节点通过分布式文件系统(PolarFileSystem)共享底层的存储(PolarStore)。 读写拆散。当应用程序应用集群地址时,PolarDB MySQL/PostgreSQL通过外部的代理层(Proxy)对外提供服务,应用程序的申请都先通过代理,而后才拜访到数据库节点。代理层不仅能够做平安认证和爱护,还能够解析SQL,把写操作(例如事务、UPDATE、INSERT、DELETE、DDL等)发送到主节点,把读操作(例如SELECT)平衡地散发到多个只读节点,实现主动的读写拆散。对于应用程序来说,就像应用一个单点的MySQL数据库一样简略。外部的代理层(Proxy)后续将反对PolarDB兼容Oracle语法引擎。 体验筹备本场景须要开明PolarDB及ECS阿里云体验实验室 有提供2小时ECS体验PolarDB新用户可购 1元开明PolarDB实例及存储包 连贯ECS服务器关上终端工具。 Windows:关上命令窗口。MAC:关上命令行终端Terminal。Windows用户请查看零碎中是否装置有SSH工具。查看办法: 在终端中输出命令 ssh -V 。 ssh -V如果显示SSH版本则示意已装置,如下图所示。如果未装置,请下载安装 OpenSSH工具。 在终端中输出连贯命令 ssh [username]@[ipaddress] 。您须要将其中的username和ipaddress替换为步骤一中创立的ECS服务器的弹性公网IP。例如:ssh root@123.123.123.123命令显示后果如下: 输出 yes。批准持续后将会提醒输出登录明码。 明码为已创立的云服务的ECS的登录明码。登录胜利后会显示如下信息。 装置LAMP环境LAMP是指运行在Linux下的Apache、MySQL和PHP的环境。参考以下操作在云服务器上安装开发环境。1.在ECS服务器上,执行以下命令装置Apache服务及其扩大包。 yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql返回相似如下图后果则示意装置胜利。2.PbootCMS是应用PHP语言开发的CMS零碎。参考以下操作装置PHP环境。执行以下命令,装置PHP。 yum -y install php php-mysql gd php-gd gd-devel php-xml php-common php-mbstring php-ldap php-pear php-xmlrpc php-imap3.执行以下命令下载并装置MySQL。 wget http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpmyum -y install mysql57-community-release-el7-10.noarch.rpmyum -y install mysql-community-server4.执行以下命令启动MySQL数据库。 systemctl start mysqld搭建门户网站在实现环境部署后,参考以下操作搭建门户网站。1.在ECS服务器上,执行以下命令,装置Git。 yum -y install git2.在ECS服务器上,执行以下命令下载PbootCMS源码文件。 cd ~ && git clone https://gitee.com/hnaoyun/PbootCMS.git3.执行以下命令将安装包拷贝到Apache的wwwroot目录下。 ...

January 28, 2021 · 1 min · jiezi

关于php:PHP数组函数的时间复杂度清单

PHP 给开发者提供了弱小的数组函数,帮忙开发者进步了开发效率。 正是 PHP 数组函数太易用、太不便,让开发者经常疏忽数组函数的工夫复杂度。 这里有一份很实用的问答,高赞答复列举了对于数组函数的工夫复杂度。 List of Big-O for PHP functions 心愿看完下面的问答能帮忙到大家!

January 27, 2021 · 1 min · jiezi

关于php:PHPMQTT-v121-版本发布MQTT-协议解析-协程客户端

v1.2 版本次要批改了 Client 的结构函数参数和 Protocol 的命名空间,以及优化重连逻辑。 Protocol新增一层Protocol,应用V3和V5来辨别 MQTT 协定等级。 同时将Simps\MQTT\Types也挪动到了Protocol下,批改为Simps\MQTT\Protocol\Types。 1.1Simps\MQTT\Protocol::pack(array $array)Simps\MQTT\ProtocolV5::pack(array $array)Simps\MQTT\ProtocolInterface::MQTT_PROTOCOL_LEVEL_3_1;Simps\MQTT\Types::CONNECT;1.2Simps\MQTT\Protocol\V3::pack(array $array)Simps\MQTT\Protocol\V5::pack(array $array)Simps\MQTT\Protocol\ProtocolInterface::MQTT_PROTOCOL_LEVEL_3_1;Simps\MQTT\Protocol\Types::CONNECT;ClientClient 之前是间接传递数组参数的,当初改为对象的形式。 1.1use Simps\MQTT\Client;$config = [ 'host' => '127.0.0.1', 'port' => 1883, 'user_name' => '', 'password' => '', 'client_id' => Client::genClientID(), 'keep_alive' => 10,];$swooleConfig = [ 'open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024, 'connect_timeout' => 1.0, 'write_timeout' => 3.0, 'read_timeout' => 0.5,];$client = new Client($config, $swooleConfig);1.2use Simps\MQTT\Client;use Simps\MQTT\Config\ClientConfig;$config = new ClientConfig();$config->setUserName('') ->setPassword('') ->setClientId(Client::genClientID()) ->setKeepAlive(10);$swooleConfig = [ 'open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024, 'connect_timeout' => 1.0, 'write_timeout' => 3.0, 'read_timeout' => 0.5,];$config->setSwooleConfig($swooleConfig);$client = new Client('127.0.0.1', 1883, $config);// 也能够这样设置$config = new ClientConfig([ 'userName' => '', 'password' => '', 'clientId' => '', 'keepAlive' => 10, 'protocolName' => 'MQTT', 'protocolLevel' => 4, 'properties' => [], 'delay' => 3000, // 3s 'swooleConfig' => []]);$client = new Client('127.0.0.1', 1883, $config);更新日志向下不兼容更新命名空间 (2204df6) (28f8abe)移除不反对 PHP 7.0 (3dc5bcd)加强为所有的常量增加可见性标识符 (0176469)新增 ClientConfig (d90b9dc)优化 Client (9229224)更新测试和示例代码 (959a21d) (08531ac)减少重连次数限度和优化重连延迟时间 (#32)对于 PHPMQTTMQTT 协定解析 & 协程客户端实用于 PHP 的 MQTT 协定解析和协程客户端反对 MQTT 协定 3.1、3.1.1 和 5.0 版本,反对 QoS 0、QoS 1、QoS 2首个反对 MQTT v5.0 协定的 PHP library文档:https://mqtt.simps.ioGitHub:https://github.com/simps/mqttGitee:https://gitee.com/phpiot/mqtt ...

January 27, 2021 · 1 min · jiezi

关于php:新的一年回顾我写的PHPer面试2020

hi!新的一年来了,回顾2020年我在看云写的几本书,也算有很好问题。超出我预期的用户量付费浏览了《web开发者常识体系》和《PHPer面试-2020》。其中不少读者是来自思否,我在思否也注册2,3年了,很感激这个平台。下图是付费用户的pvuv数据: 家喻户晓2020年的金三银四简直没有,很多同学打算赶一波2021年的金三银四。亦或者很多小伙伴往年仓促找工作并不如意,明年春天从新找个称心如意的。两本书的价格下调一半已上,3/5块钱一本。心愿对大家的学习有所帮忙,也让同学感觉更加物有所值,物超所值。 《web开发者常识体系》很厚很厚的一本电子书,一瓶脉动的钱,真心举荐。无废话解说lnmp,redis,网络,平安,运维的个性要点精华,和作为面试者和面试官的教训心得。 旨在帮忙读者构建作为一名web开发者的齐备常识体系。 PHP这门动静语言自身并不弱小,是咱们(生态)让它成就第一语言。 《PHPer面试-2020》往年我求职理论经验,梳理总结笔记凝固成这一本电子书。本册适宜在中小型公司有2~5年工作教训,或者大学期间已有肯定技术栈积攒的同学翻看。年底了,一瓶可乐的价格。 有梳理补全常识体系和面试需要的同学,倡议关注一下。 心田os:如果我求职时候有tm这么一本整顿好的面试秘籍,那是真的香阿!

January 27, 2021 · 1 min · jiezi

关于php:word文档转html格式在线预览使用了phpofficepydocxjava-POI各方案最终用unoconv解决

最近客户要做一个word,excel 文件在线预览性能,以下是实现此性能的全过程。因为咱们用的是PHP开发我的项目,最开始想到的是用PHPoffice里的phpword来进行转换,以下是要害代码。 <?php$phpWord = \PhpOffice\PhpWord\IOFactory::load('test.doc');$xmlWriter = \PhpOffice\PhpWord\IOFactory::createWriter($phpWord, "HTML");$xmlWriter->save('test.html); 用这种办法转是能够转,然而转进去的html文件绝对原文件,失落了很多字,如果说款式和原文不一样还能够忍耐,然而内容失落,就不太好了,而且对DOC格局又无奈解决,所以这种办法,我最终抉择了放弃。而后,我就想用python来解决这个问题,查到了python有个pydocx库能够解决word文档,于是我就装置了一下。 pip install pydocx这个库用起来也很简略,次要代码如下: from pydocx import PyDocXhtml = PyDocX.to_html("test2.doc")f = open("test.html", 'w', encoding="utf-8")f.write(html)f.close()转换成果也还能够,除了表格款式和原文有点不一样以外,内容倒是没失落,然而有一个问题,这个库是转换docx的,对doc转换不了,咱们客户还上传挺多doc格局的文件的,于是我只好另外想方法。查资料发现java有个poi库能够用来对word文件进行转换, Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格局档案读和写的性能。我想试一下,查资料半天,就开始写了,先Maven引入依赖: <dependencies> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> <!-- 针对2003版本的库 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.poi.xwpf.converter.xhtml</artifactId> <version>2.0.2</version> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.4.3</version></dependency> </dependencies>以下是援用他人的可用代码: import cn.hutool.core.img.ImgUtil;import fr.opensagres.poi.xwpf.converter.xhtml.Base64EmbedImgManager;import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLConverter;import fr.opensagres.poi.xwpf.converter.xhtml.XHTMLOptions;import org.apache.poi.hwpf.HWPFDocument;import org.apache.poi.hwpf.converter.WordToHtmlConverter;import org.apache.poi.openxml4j.util.ZipSecureFile;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.w3c.dom.Document;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerException;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import java.awt.image.BufferedImage;import java.io.*;/** * office转换工具测试 * */public class OfficeConvertUtil { /** * 将word2003转换为html文件 2017-2-27 * * @param wordPath word文件门路 * @param wordName word文件名称无后缀 * @param suffix word文件后缀 * @throws IOException * @throws TransformerException * @throws ParserConfigurationException */ public static String Word2003ToHtml(String wordPath, String wordName, String suffix) throws IOException, TransformerException, ParserConfigurationException { String htmlPath = wordPath + File.separator + "html" + File.separator; String htmlName = wordName + ".html"; final String imagePath = htmlPath + "image" + File.separator; // 判断html文件是否存在,每次从新生成 File htmlFile = new File(htmlPath + htmlName);// if (htmlFile.exists()) {// return htmlFile.getAbsolutePath();// } // 原word文档 final String file = wordPath + File.separator + wordName + suffix; InputStream input = new FileInputStream(new File(file)); HWPFDocument wordDocument = new HWPFDocument(input); WordToHtmlConverter wordToHtmlConverter = new WordToHtmlConverter( DocumentBuilderFactory.newInstance().newDocumentBuilder() .newDocument()); wordToHtmlConverter.setPicturesManager((content, pictureType, suggestedName, widthInches, heightInches) -> { BufferedImage bufferedImage = ImgUtil.toImage(content); String base64Img = ImgUtil.toBase64(bufferedImage, pictureType.getExtension()); // 带图片的word,则将图片转为base64编码,保留在一个页面中 StringBuilder sb = (new StringBuilder(base64Img.length() + "data:;base64,".length()).append("data:;base64,").append(base64Img)); return sb.toString(); }); // 解析word文档 wordToHtmlConverter.processDocument(wordDocument); Document htmlDocument = wordToHtmlConverter.getDocument(); // 生成html文件下级文件夹 File folder = new File(htmlPath); if (!folder.exists()) { folder.mkdirs(); } // 生成html文件地址 OutputStream outStream = new FileOutputStream(htmlFile); DOMSource domSource = new DOMSource(htmlDocument); StreamResult streamResult = new StreamResult(outStream); TransformerFactory factory = TransformerFactory.newInstance(); Transformer serializer = factory.newTransformer(); serializer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); serializer.setOutputProperty(OutputKeys.INDENT, "yes"); serializer.setOutputProperty(OutputKeys.METHOD, "html"); serializer.transform(domSource, streamResult); outStream.close(); return htmlFile.getAbsolutePath(); } /** * 2007版本word转换成html 2017-2-27 * * @param wordPath word文件门路 * @param wordName word文件名称无后缀 * @param suffix word文件后缀 * @return * @throws IOException */ public static String Word2007ToHtml(String wordPath, String wordName, String suffix) throws IOException { ZipSecureFile.setMinInflateRatio(-1.0d); String htmlPath = wordPath + File.separator + "html" + File.separator; String htmlName = wordName + ".html"; String imagePath = htmlPath + "image" + File.separator; // 判断html文件是否存在 File htmlFile = new File(htmlPath + htmlName);// if (htmlFile.exists()) {// return htmlFile.getAbsolutePath();// } // word文件 File wordFile = new File(wordPath + File.separator + wordName + suffix); // 1) 加载word文档生成 XWPFDocument对象 InputStream in = new FileInputStream(wordFile); XWPFDocument document = new XWPFDocument(in); // 2) 解析 XHTML配置 (这里设置IURIResolver来设置图片寄存的目录) File imgFolder = new File(imagePath); // 带图片的word,则将图片转为base64编码,保留在一个页面中 XHTMLOptions options = XHTMLOptions.create().indent(4).setImageManager(new Base64EmbedImgManager()); // 3) 将 XWPFDocument转换成XHTML // 生成html文件下级文件夹 File folder = new File(htmlPath); if (!folder.exists()) { folder.mkdirs(); } OutputStream out = new FileOutputStream(htmlFile); XHTMLConverter.getInstance().convert(document, out, options); return htmlFile.getAbsolutePath(); } public static void main(String[] args) throws Exception { System.out.println(Word2003ToHtml("D:\\tmp", "test", ".doc")); System.out.println(Word2007ToHtml("D:\\tmp", "test2", ".docx")); }}用java 倒是转换doc格局转的挺好的,然而转换docx格局的时候,款式全乱了,我查了半天POI的文档,网上也没有哪位大佬来解决这个款式乱的问题,于是我想用python来转docx ,java来转doc,然而又感觉太麻烦。在查了半天材料当前,我最终的解决办法如下。还是回到了用php解决,然而不是用phpoffice来解决,而是用unocov进行转换,先装libreoffice ...

January 27, 2021 · 3 min · jiezi

关于php:PHP的可变变量与可变函数

什么叫可变。在程序世界中,可变的当然是变量。常量在定义之后都是不可变的,在程序执行过程中,这个常量都是不能批改的。然而变量却不同,它们能够批改。那么可变变量和可变函数又是什么意思呢?很显著,就是用另一个变量来定义他们,这个变量是可变的呀! 可变变量$a = 'hello';$$a = 'world';echo $a, ' ', $hello;咦,咱们没有定义\$hello这个变量呀。嗯,从外表上看咱们的确没有定义这个变量,但请留神这个$$符号。$符号的意思就是定义变量,当咱们在一个$符号前面跟上一个曾经定义的变量名,那么这个变量的内容就成为了新的变量名。也就是说,$a的内容hello成为了一个新的变量名叫$hello,而后给它赋值为world。是不是感觉不太好了解,也不便于咱们查看代码,这个问题咱们最初再说。 当然,以下的用法要留神: $a = 1;$$a = 2;echo $1; // Parse error: syntax error, unexpected '1'echo ${1}; // ok$a = ['b', 'c', 'd'];$$a = 'f';echo $b, $c, $d;数字类型不是非法的变量名,不能作为可变变量被定义然而利用{},是能够输入的,{}会获取{}外部的值并作为一个变量来解析,这里的{1}咱们利用可变变量赋值成为了一个变量,间接输入是十分的,但放在{1}中就成为了一个可解析的变量名,咱们能够简略的了解为{1}转换成了$'1',成为了一个正式的变量名数组当然是不行啦它们这样写都是不会报错的应用对象就不行了,间接就会报错了,对象是不能进行可变变量的操作的。 class A {}class B extends A {}$a = new A();$$a = new B(); // Catchable fatal error: Object of class A could not be converted to string 可变函数可变函数其实也大同小异,当咱们在一个变量的前面加上()时,PHP就会尝试将这个变量当做函数来解析。 function testA(){ echo "testA";}$a = 'testA';$a(); // testA可变变量是将一个字符串转换成了一个变量名,而可变函数则是将一个字符串当做函数名来调用。比方类中的办法,咱们能够这样来调用: ...

January 27, 2021 · 1 min · jiezi

关于php:php实现格式化多行文本为Js可用格式

js里当初存写模板的场景好多,如:弹框类的html代码模板等,js不反对换行的长文本写法,必须要一行行的加起来,如: 代码如下:var content = '<div>row 1</div>' '<div>row 2</div>';而不能够写成: 代码如下:var content = '<div> row 1</div><div>row2 </div> '; 于是小加工一php小段代码,简化手工打的操作。 tojs.php 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>Str To Js String</title> <style type="text/css"> .content-box { border: 1px #f0f0f0域名交易 slid; border-left: 4px #e0e0e0 solid; padding: 5px 5px 5px 10px; } </style> </head> <body> <h1>输出格式化的文本:</h1> <?php $jsContent = ''; if(isset($_POST['content']) && $_POST['content']) { $content = strtr(htmlspecialchars($_POST['content']), array("rn" => "n")); $rows = explode("n", $content); foreach($rows as $row) { $jsContent .= '+ '' . $row . "'<br/>"; } $jsContent{0} = ' '; } ?> <form action="#" method="post"> <textarea name="content" style="width: 99%;height: 300px; "></textarea> <p><input type="submit" value="提交" /></p> </form> <h2>格式化后的后果:</h2> <div class="content-box"> <?php echo $jsContent;?> </div> </body> </html> ...

January 26, 2021 · 1 min · jiezi

关于php:php两种无限分类方法实例

这篇文章次要介绍了php两种有限分类办法实例,本文给出了递归办法和非递归办法实现的有限分类实例,须要的敌人能够参考下 一、递归办法 复制代码 代码如下: $items = array( array('id'=>1,'pid'=>0,'name'=>'一级11'), array('id'=>2,'pid'=>0,'name'=>'一级12'), array('id'=>3,'pid'=>1,'name'=>'二级21'), array('id'=>4,'pid'=>3,'name'=>'三级31'), array('id'=>5,'pid'=>1,'name'=>'二级22'), array('id'=>6,'pid'=>3,'name'=>'三级32'), array('id'=>7,'pid'=>6,'name'=>'四级41'), ); $i = 0; function formatTree($arr, $pid = 0){ $tree = array(); $temp = array(); global $i; if($arr){ foreach($arr as $k=>$v){ if($v['pid'] == $pid){// $temp = formatTree($arr, $v['id']); $temp && $v['son'] = $temp; $tree[] = $v; ...

January 26, 2021 · 2 min · jiezi

关于php:PHP中iconv函数知识汇总

iconv函数库可能实现各种字符集间的转换,是php编程中不可短少的根底函数库。本文内容是参考了网上的其余资源,而后联合本人的实际,有须要的小伙伴能够参考下。 明天在批改论文在线的时候,遇到了iconv这个函数。学习一下 ? 1 2 3 4header('Content-Type: application/vnd.ms-excel;charset=UTF-8"'); $name=iconv('utf-8', 'gb2312', $data['year'].'年,第'.$data['period'].'期通信录'); header('Content-Disposition: attachment;filename="' . $name . '.xls"'); header('Cache-Control: max-age=0'); 这段代码的意思,就是把utf-8格局转化为gb2312的格局,而后赋值给$name,这样导出excel文件的名字的时候,就是中文的$name的名字。 下边是对于这个函数的具体和延长用法 ? 1iconv("UTF-8","GB2312//IGNORE",$data) ignore的意思是疏忽转换时的谬误,如果没有ignore参数,所有该字符前面的字符串都无奈被保留。 这个iconv()这个函数,在php5中是内置的.谢谢. 例子: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 echo $str= '你好,这里是卖咖啡!'; echo ''; echo iconv('GB2312', 'UTF-8', $str); //将字符串的编码从GB2312转到UTF-8 ...

January 26, 2021 · 1 min · jiezi

关于php:PHP的switch和ifelse谁更快

对于多个if条件判断的状况下,咱们应用switch来代替ifelse对于代码来说会更加的清晰明了,那么他们的效率比照呢?从PHP手册中发现有人曾经比照过了,本人也用他的代码进行了试验: $s = time();for ($i = 0; $i < 1000000000; ++$i) { $x = $i % 10; if ($x == 1) { $y = $x * 1; } elseif ($x == 2) { $y = $x * 2; } elseif ($x == 3) { $y = $x * 3; } elseif ($x == 4) { $y = $x * 4; } elseif ($x == 5) { $y = $x * 5; } elseif ($x == 6) { $y = $x * 6; } elseif ($x == 7) { $y = $x * 7; } elseif ($x == 8) { $y = $x * 8; } elseif ($x == 9) { $y = $x * 9; } else { $y = $x * 10; }}print("if: " . (time() - $s) . "sec\n");$s = time();for ($i = 0; $i < 1000000000; ++$i) { $x = $i % 10; switch ($x) { case 1: $y = $x * 1; break; case 2: $y = $x * 2; break; case 3: $y = $x * 3; break; case 4: $y = $x * 4; break; case 5: $y = $x * 5; break; case 6: $y = $x * 6; break; case 7: $y = $x * 7; break; case 8: $y = $x * 8; break; case 9: $y = $x * 9; break; default: $y = $x * 10; }}print("switch: " . (time() - $s) . "sec\n");通过1000000000次的循环并在每个判断条件中都退出了运算操作后,咱们发现后果是switch的效率更高,运行速度更快,在我的电脑上的后果是: ...

January 26, 2021 · 2 min · jiezi

关于php:Leetcode-PHP题解D133-9-Palindrome-Number

D133 9. Palindrome Number题目链接9. Palindrome Number 题目剖析这道题很简略,就是判断给定的数字是不是回文数。回文数就是从左往右读和从右往左读是一样的。 但这个题和第7题稍有不同,符号也要统一。 解题思路符号也要统一那就简略了,间接用strrev函数翻转,而后判断与原内容是否相等即可。 最终代码<?phpclass Solution { /** * @param Integer $x * @return Boolean */ function isPalindrome($x) { return $x == strrev($x); }}若感觉本文章对你有用,欢送用爱发电赞助。

January 26, 2021 · 1 min · jiezi

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

v4.6.2 版本次要是一个 Bug 修复版本,没有向下不兼容改变。 新增了 Coroutine\Socket->recvLine() 和 Coroutine\Socket->readWithBuffer() 办法 别离用于解决 socket_read 兼容性问题和应用 recv(1) 逐字节接管时产生大量零碎调用问题 同时加强了 Response\create() 办法,能够独立于 Server 应用,如: use Swoole\Coroutine\Server;use Swoole\Coroutine\Server\Connection;use Swoole\Http\Request;use Swoole\Http\Response;Swoole\Coroutine\run(function () { $server = new Server('0.0.0.0', 9501, false); go(function () use ($server) { $server->handle(function (Connection $conn) use ($server) { $req = Request::create(); while(true) { $data = $conn->recv(); if (strlen($data) != $req->parse($data) or $req->isCompleted()) { break; } } var_dump($req->get); $resp = Response::create([$conn->exportSocket(), $req]); $resp->header('X-Server', 'swoole'); $resp->end('Hello, Swoole'); $server->shutdown(); }); $server->start(); });});启动后应用 curl 发动申请 ...

January 25, 2021 · 1 min · jiezi

关于php:Wampserver安装和配置

Wam pserver是由Windows+Apache+MySQL+PHP组合的集成开发软件包,能够用于搭建Web服务器为外界提供网络服务。 浏览器浏览网页的流程: 1.浏览器输出网址后,通过DNS服务器将网址转换成相应的IP地址,如198.1.16.33.因为域名的默认端口是80,最终的解析地址是198.1.16.33:80.网络会依据这个ip地址找到对应的服务器--也就是咱们配置的Apache服务器。 2.而后Apache服务器会将它某个目录下的index.html里的代码,通过URL地址在返回给客户端的游览器,而后游览器就会依据返回的代码解析成咱们看到的网页内容。 3.如果咱们拜访的是PHP文件,那么在Apache会将文件传给PHP进行解析,解析后在通过Apache服务器返回到浏览器中。 4.MySQL用来存储服务器上相应的数据的。当须要提交或者读取相干数据时,都是通过MySQL来读取其中的数据的。 Wampserver的配置: 1.Apache的配置: (1).外网拜访权限 刚装置好的wampserver默认是只容许127.0.0.1拜访的,也就是只容许本机拜访。 1).找到wamp/bin/Apache/conf/httpd.conf关上,搜寻onlineoffline tag - don't remove。把其下的“Deny from all”删掉,再把“Allow from 127.0.0.1”改成“Allow from all”,就能够了。 注:开启URL重写性能非必须。(它的作用就是设置URL重写以暗藏URL中含有的index.php。一般来说URL过长或者动态化的URL都不利于SEO(搜索引擎优化: 改良网站在搜索引擎中的关键词天然排名,为了达到更好的搜寻到本网站)。因而暗藏的目标就是要达到更好的SEO成果。) 2).持续搜寻,找到如图所示的两个中央(别离在大概第190行和第225行),别离把“AllowOverride None”改成“AllowOverride All”(这一步操作是针对应用了URL重写性能的敌人,如果没有用到的话这步倡议不要做批改,因为 改了这个之后Apache的安全性会稍微有所降落。) 3).开启URL重写性能,当然咯,如果大家感觉URL重写性能没有必要的话,这个能够间接忽视,然而如果开了 的话,下面的第二条就必须做一下了,否则很容易造成谬误。依照下面的办法关上httpd.conf文件,找到#LoadModule rewrite_module modules/mod_rewrite.so,而后把后面的“#”删掉,就能够了,当然咯,如果想要这个批改失效的话,还须要立刻重启一下apache服务。 (2).批改wampserver网页文件寄存目录: 1).批改wampserver中的www文件地位。关上wampserver的装置目录,在关上外面的“script”文件夹,用记事本关上外面的config.inc.php,找到“$wwwDir = $c_installDir.'/www';”,改成大家心愿的目录就行了,比方改成D:website,对应的代码就是$wwwDir = ‘D:/website’;(留神,windows下示意门路的“”在这里必须改为“/”)。而后敞开wampserver,而后再关上,www目录就变成咱们设定的D:website了。 2).批改Apache中www文件的地位。关上wamp/bin/Apache/conf/httpd.conf,寻找“DocumentRoot”大略在第178行,把前面的值改成咱们理论网站须要的门路,再寻找“”,同样把前面的值改成咱们网站寄存的理论地址,就OK了。

January 25, 2021 · 1 min · jiezi

关于php:PHP的PDO对数字的默认处理导致的莫名其妙的错误

PDO::ATTR_STRINGIFY_FETCHES (integer)PHP 官网文档的解释是:强制以字符串形式看待所有的值。这个选项开启后,就会导致 1 变成 '1'这样的问题,我抉择敞开。 PDO::ATTR_EMULATE_PREPARES (integer)PDO::ATTR_EMULATE_PREPARES 启用或禁用预处理语句的模仿。 有些驱动不反对或有限度地反对本地预处理。应用此设置强制PDO总是模仿预处理语句(如果为 true ),或试着应用本地预处理语句(如果为 false)。如果驱动不能胜利预处理以后查问,它将总是回到模仿预处理语句上。 须要 bool 类型。(参考:https://www.php.net/manual/zh...) 这个问题我当初还没有碰到,网上有位开发者碰到了,并且给大家解释了一下这个选项的影响:PDO::ATTR_EMULATE_PREPARES属性设置为false引发的血案 所以这个选项大家依据本人的需要来设置吧。

January 25, 2021 · 1 min · jiezi

关于php:Hyperf-发布-轻量级有向无环图任务编排库-和-逆波兰表示法-孵化组件以及-v214-版本

更新内容本周次要新增了 轻量级有向无环图工作编排库 和 逆波兰表示法 两个孵化我的项目,并修复了一些组件的 ????Bug,持续晋升 Hyperf 的稳定性,公布于 2.1.4 版。 倡议用户应用以下命令更新此版本。 composer update "hyperf/*" -o间接拜访 官网 hyperf.io 或 文档 hyperf.wiki 查看更新内容 修复#3165 修复办法 Hyperf\Database\Schema\MySqlBuilder::getColumnListing 在 MySQL 8.0 版本中无奈失常应用的问题。#3174 修复 hyperf/database 组件中 where 语句因为不谨严的代码编写,导致被绑定参数会被歹意替换的问题。#3179 修复 json-rpc 客户端因对端服务重启,导致接收数据始终异样的问题。#3189 修复 kafka 在集群模式下无奈失常应用的问题。#3191 修复 json-rpc 客户端因对端服务重启,导致连接池中的连贯全副生效,新的申请进来时,首次应用皆会报错的问题。新增#3170 为 hyperf/watcher 组件新增了更加敌对的驱动器 FindNewerDriver,反对 Mac Linux 和 Docker。#3195 为 JsonRpcPoolTransporter 新增了重试机制, 当连贯、发包、收包失败时,默认重试 2 次,收包超时不进行重试。优化#3169 优化了 ErrorExceptionHandler 中与 set_error_handler 相干的入参代码, 解决动态检测因入参不匹配导致报错的问题。#3191 优化了 hyperf/json-rpc 组件, 当连贯中断后,会先尝试重连。变更#3174 严格查看 hyperf/database 组件中 where 语句绑定参数。新组件孵化DAG 轻量级有向无环图工作编排库。RPN 逆波兰表示法。对于 HyperfHyperf 是基于 Swoole 4.5+ 实现的高性能、高灵活性的 PHP 协程框架,内置协程服务器及大量罕用的组件,性能较传统基于 PHP-FPM 的框架有质的晋升,提供超高性能的同时,也放弃着极其灵便的可扩展性,规范组件均基于 PSR 规范 实现,基于弱小的依赖注入设计,保障了绝大部分组件或类都是 可替换 与 可复用 的。 ...

January 25, 2021 · 1 min · jiezi

关于php:thinkphp-5-报错-显示-nginx-404页面

明天把我的项目布署到线上,报错了,却始终显示nginx的404页面,如果始终这样是没法解决问题的,我上线看了一下thinkphp的日志文件: [ sql ] [ SQL ] SELECT `data_id`,`pid` FROM `tb_data_manage` WHERE `pid` IN (53,49,47,46,35) [ RunTime:0.000595s ][ error ] [8]未定义数组索引: see[/data/web/data_manage/runtime/temp/5e9fc553d7acc7eaa186b674b2a29538.php:143]很显著,是php出错,而不是nginx找不到页面,而且nginx的pathinfo设置也没有问题,config.php外面app_debug我也是设的是true,于是我在网上各种找解决办法,最终的解决办法是关上thinkphp/tpl上面的文件think_exception.tpl最初面,在最上面的php标签里加个退出 })(); </script> <?php } exit; ?></body></html>而后问题就解决了,再拜访一下浏览器,不会再显示404,thinkphp的谬误页面进去了

January 25, 2021 · 1 min · jiezi

关于php:ThinkPHP-V607发布修正版本

V6.0.7版本公布,本版本次要针对上个版本做了一些路由修改,还意外播种了一些性能晋升,是一个倡议更新的版本。 次要更新修改Validate类的PHP8兼容性改良redis驱动的append办法修改路由匹配检测问题优化路由变量正则规定生成改良responseView的内容渲染装置和更新V6版本开始仅反对Composer装置及更新,反对上个版本的无缝更新,间接应用 composer update 更新到最新版本即可。 如果须要全新装置,应用: composer create-project topthink/think tp 官网文档官网6.0齐全开发手册6.0入门必读教程官网服务应用服务市场 —— 新年优惠活动进行中ThinkAPI——对立API服务

January 25, 2021 · 1 min · jiezi

关于php:你知道可以通过网址访问的Servlet如何实现吗

Servlet生命周期实现形式实例和初始化机会就绪/调用/服务阶段销毁机会案例实操Servlet 的生命周期Servlet 没有 main() 办法,不能独立运行,它的运行齐全由 Servlet 引擎来管制和调度。所谓生命周期,指的是 servlet 容器何时创立 servlet 实例、何时调用其办法进行申请的解决、并何时销毁其实例的整个过程。(此处探讨默认的生命周期) 实例和初始化机会当申请达到容器时,容器查找该 servlet 对象是否存在,如果不存在,则会创立实例并进行初始化。 就绪/调用/服务阶段有申请达到容器,容器调用 servlet 对象的 service() 办法,解决申请的办法在整个生命周期中能够被屡次调用; HttpServlet 的 service() 办法,会根据申请形式来调用 doGet() 或者 doPost() 办法。然而,这两个 do 办法默认状况下,会抛出异样,须要子类去 override。 销毁机会当容器敞开时(应用程序进行时),会将程序中的 Servlet 实例进行销毁。 上述的生命周期能够通过 Servlet 中的生命周期办法来察看。在 Servlet 中有三个生命周期办法,不禁用户手动调用,而是在特定的机会由容器主动调用,察看这三个生命周期办法即可察看到 Servlet 的生命周期。 init 办法,在 Servlet 实例创立之后执行(证实该 Servlet 有实例创立了) public void init(ServletConfig config) throws ServletException { System.out.println("有实例创立了"); } service 办法,每次有申请达到某个 Servlet 办法时执行,用来解决申请(证实该 Servlet 进行服务了) protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("服务调用了"); } ...

January 25, 2021 · 2 min · jiezi

关于php:谷歌面试题如何从无序链表中移除重复项

一位小伙伴来问一道谷歌的口试题,对于单链表操作的,问到底有多少种解决方案,明天咱们就来聊聊。 题目的大抵意思是: 假如存在一个无序单链表,将反复结点去除后,并保原程序。去重前:1→3→1→5→5→7去重后:1→3→5→7程序删除通过双重循环间接在链表上执行删除操作。外层循环用一个指针从第一个结点开始遍历整个链表,而后内层循环用另外一个指针遍历其余结点,将与外层循环遍历到的指针所指结点的数据域雷同的结点删除,如下图所示。 假如外层循环从outerCur开始遍历,当内层循环指针innerCur遍历到上图实线所示的地位(outerCur.data==innerCur.data)时,此时须要把innerCur指向的结点删除。 具体步骤如下: 用tmp记录待删除的结点的地址。为了可能在删除tmp结点后持续遍历链表中其余的结点,使innerCur指针指向它的后继结点:innerCur=innerCur.next。从链表中删除tmp结点。实现代码如下: 运行后果: 算法性能剖析 因为这种办法采纳双重循环对链表进行遍历,因而,工夫复杂度为O(N^2)。其中,N为链表的长度。在遍历链表的过程中,应用了常量个额定的指针变量来保留以后遍历的结点、前驱结点和被删除的结点,因而,空间复杂度为O(1)。 递归法次要思路为:对于结点cur,首先递归地删除以cur.next为首的子链表中反复的结点,接着从以cur.next为首的子链表中找出与cur有着雷同数据域的结点并删除。 实现代码如下: 算法性能剖析 这种办法与办法一相似,从实质上而言,因为这种办法须要对链表进行双重遍历,因而,工夫复杂度为O(N^2)。其中,N为链表的长度。因为递归法会减少许多额定的函数调用,因而,从实践上讲,该办法效率比后面的办法低。 空间换工夫通常状况下,为了升高工夫复杂度,往往在条件容许的状况下,通过应用辅助空间实现。 具体而言,次要思路如下。 建设一个HashSet,HashSet中的内容为曾经遍历过的结点内容,并将其初始化为空。从头开始遍历链表中的所以结点,存在以下两种可能性:如果结点内容曾经在HashSet中,则删除此结点,持续向后遍历。如果结点内容不在HashSet中,则保留此结点,将此结点内容增加到HashSet中,持续向后遍历。「引申:如何从有序链表中移除反复项?」 如链表:1,3、5、5、7、7、8、9 去重后:1,3、5、7、8、9 剖析与解答 上述介绍的办法也实用于链表有序的状况,然而因为以上办法没有充分利用到链表有序这个条件,因而,算法的性能必定不是最优的。本题中,因为链表具备有序性,因而,不须要对链表进行两次遍历。所以,有如下思路:用cur 指向链表第一个结点,此时须要分为以下两种状况探讨。 如果cur.data==cur.next.data,那么删除cur.next结点。如果cur.data!=cur.next.data,那么cur=cur.next,持续遍历其余结点。总结对于无序单链表中,想要删除其中反复的结点(多个反复结点保留一个)。删除方法有依照程序删除、应用递归形式删除以及能够应用空间换工夫(HashSet中元素的唯一性)。 点赞越多,bug越少~

January 25, 2021 · 1 min · jiezi

关于php:PHP没有定时器

的确,PHP没有相似于JS中的setInterval或者setTimeout这样的原生定时器相干的函数。然而咱们能够通过其余形式来实现,比方应用declare。 先来看看是如何实现的,而后咱们再好好学习一下declare表达式到底是个什么货色。 function do_tick($str = ''){ list($sec, $usec) = explode(' ', microtime()); printf("[%.4f] Tick.%s\n", $sec + $usec, $str);}register_tick_function('do_tick');do_tick('--start--');declare (ticks = 1) { while (1) { sleep(1); // 这里,每执行一次就去调用一次do_tick() }}很简略的代码,运行起来当前将每秒输入以后的工夫。 declare语法的定义如下:declare (directive) statemaent;declare 构造用来设定一段代码的执行指令directive 局部容许设定 declare 代码段的行为。目前只意识两个指令:ticks以及 encodingTick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会产生的事件。N 的值是在 declare 中的 directive 局部用 ticks=N 来指定的在每个 tick 中呈现的事件是由 register_tick_function() 来指定的这里,咱们只钻研ticks的应用。 上述代码中,咱们应用register_tick_function()注册了do_tick()办法给ticks,declare指定了ticks=1,也就是每执行一次可计时的低级语句,就会去执行一次register_tick_function()中注册的办法。当declare代码块中的while每次循环时,都有一个sleep()进展了一秒,而这个sleep()就是那个可计时的低级语句。 那么,while()不是可计时的低级语句嘛?当然不是,where、if等条件判断都不是这种可计时的低级语句。 不是所有语句都可计时。通常条件表达式和参数表达式都不可计时。咱们通过上面这个例子再来看看具体到一步步declare是怎么执行的: function test_tick(){ static $i = 0; echo 'test_tick:' . $i++, PHP_EOL;}register_tick_function('test_tick');test_tick(); // test_tick:0$j = 0; declare (ticks = 1) { $j++; // test_tick:1 $j++; // test_tick: 2 sleep(1); // 停1秒后,test_tick:3 $j++; // test_tick:4 if ($j == 3) { // 条件表达式,不会执行ticks echo "aa", PHP_EOL; // test_tick:5 \n test_tick:6,PHP_EOL会计一次ticks }}// declare应用花括号前面所有代码无成果,作用域限定在花括号以内echo "bbb"; // echo "ccc"; // echo "ddd"; // 正文很具体了,咱们就不必一一阐明了。上面咱们来看将ticks定为2,并且declare上面的statemaent不必花括号的后果: ...

January 25, 2021 · 1 min · jiezi

关于php:五分钟学会模板模式

概述模板模式就是定义一个操作中的算法骨架,而后将一些步骤提早到子类中。模板办法使得子类在不扭转算法的构造即可重定义该算法的某些步骤。 应用场景喝茶水 咱们都晓得泡茶根本步骤(算法骨架)有: 烧水、泡茶、喝茶水。整个过程中很要害的步骤是泡茶,泡茶须要跑什么茶呢?泡多久?(留给子类本人去实现)。 API 写过API接口的码友们都晓得,写API个别有四个步骤: 参数解析、参数校验、解决业务、组织返回参数。 把申请参数解析成该业务的申请参数json解析成实体类;参数校验,您能够应用通用的形式就是判断参数是否为空,也能够本人定义非凡的校验形式;解决业务个别每个接口都是不一样的,基本上都是本人去实现;至于返回参数,可能您得依据该API接口业务来返回。 领取订单 做过领取相干的零碎的人都分明,领取订单大抵分这三个步骤: 组织申请银行或者第三方领取公司的申请参数、发动领取、解决返回后果。 以上三个场景中的步骤就是算法骨架,至于每个步骤可能每个人喝茶偏好不一样,API接口业务不一样、银行或者第三方领取的领取解决不一样,可能须要本人做非凡的解决。 场景事实实现一个API接口 算法类 package com.tian.springbootdemo.controller;import com.tian.springbootdemo.rep.Result;/** * @auther: 老田 * @Description: 模板类 */public abstract class AbstractTemplate { /** * 算法骨架 */ public Result execute() { //第一步:解析参数 parseRequestParameters(); //第二步:校验参数 checkRequestParameters(); //第三步:业务解决 Object data= doBusiness(); //第四步:组织返回参数 return assembleResponseParameters(data); } /** * 解析参数 */ public abstract void parseRequestParameters(); /** * 校验参数 */ public abstract void checkRequestParameters(); /** * 业务解决 */ public abstract Object doBusiness(); /** * 组织返回参数 */ public abstract Result assembleResponseParameters(Object object);}实现类一import com.tian.springbootdemo.rep.Result;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;/** * @auther: 老田 * @Description: api接口 */@RequestMapping("/api")@Controllerpublic class MyApiController extends AbstractTemplate { @RequestMapping(value = "/users", method = RequestMethod.POST) @ResponseBody @Override public Result execute() { return super.execute(); } @Override public void parseRequestParameters() { System.out.println("*****解析参数*****"); } @Override public void checkRequestParameters() { System.out.println("*****校验参数*****"); } @Override public Object doBusiness() { System.out.println("*****解决业务*****"); // TODO: 2018/11/17 调用service解决业务 User user = new User(); user.setName("小田哥"); user.setId(1); user.setAge(20); user.setSex("man"); return user; } @Override public Result assembleResponseParameters(Object object) { System.out.println("*****返回参数*****"); Result result = new Result("200", "解决胜利"); result.setData(object); return result; }}实现类二 ...

January 24, 2021 · 4 min · jiezi

关于php:还热乎的面经

十分一般的二本菜鸟一枚(去年毕业),也始终有个大厂梦 回看2020,本人也的确比拟严严实实的补了一波根底,尽管干燥,然而过程中带来的成就感还是满满的。组内的几次分享,也让我对这些根底了解的较粗浅 这也让我有了底气,在加入完整将来的PHP技术技术大会之后,决定尝试去面试大厂,检测一下本人的成绩吧 从12.10~12.27,一共面了大略5家(蕴含好将来和百度),很侥幸的都通过了所有技术面试,几乎不敢相信(没见过世面的样子!-_-) 好了,下边才是本文主题,好将来和百度的面经(脑子容量无限,大略就记住下边这些。程序没有先后,想起来一个写一个) 好将来面经一面自我介绍介绍一下当初做的我的项目我的项目中遇到了哪些问题?是怎么解决的?我的项目中用到了哪些技术栈是你之前没有接触过的?是怎么学习的?给一个表构造,给一个SQL,问这个SQL查问过程是否有回表尽可能残缺的形容MySQL执行一条SQL语句经验了哪些给一个打卡记录表,写一个SQL,获取到打卡次数最多的前10名给了一个有序数组,找出某个数字的下标PHP7数组的底层实现(一面没答上来,的确没看过)PHP是如何进行内存治理的过程、线程、协程的应用场景Redis有哪些数据类型?缓存雪崩?缓存穿透?缓存击穿?Nginx的多过程模型说说Laravel的服务容器502、504这两个状态码在什么状况下会呈现?你是如何排查的?说一些你常常用到的查看零碎状况的linux命令工作中用到了哪些设计模式二面数组的挪动:[1,2,3,4,5] 右移2位变成[4,5,1,2,3]单向链表环的检测给你一个无序数组,找到前K个最大的Redis中,set、zset底层实现原理Nginx如何实现平滑重启的?以什么形式?Nginx和php的通信原理?具体说一下,哪些状况会呈现502和504?我的项目中有哪些值得拿出来说的?信号监听这块怎么做的?kill -9 为什么能强杀过程过程间通信形式PHP内存治理是怎么实现的?PHP7数组的底层实现(一面之后看了一下,二面答复的时候,面试官说我形容的是PHP5的底层数组实现,PHP7有优化)Redis中的zset,是如何实现扩容的?说一下依赖注入如果php-fpm没起来,Nginx会报哪个错误码你是如何晋升接口QPS的composer加载原理hrbp面就没记录了,大抵就是理解集体状况和如何学习之类的 好将来始终是我的指标公司,也是我毕业以来面的最大的厂(没方法,这学历,没人内推,很难有大厂的面试机会)。刚开始面的时候超忐忑,然而缓缓就进入状态了,每一轮面完真的成就感满满,不是说本人都会,而是面试官真的超好,你可能不是很分明的中央,他一步步的去疏导你,而后本人依照那个思路就找到答案了 面试感觉就是,面试官超业余,人也很好,反正感觉就特地好。面试通过,还是超级开心的。原本打算间接去好将来了,然而两头收到了百度的面试,所以就想试一下,很侥幸也通过了,下边是百度的面经 百度面经一面说说你当初做的我的项目(问的很细)说说你用go写的爬虫我的项目你的我的项目中用到了哪些数据结构你的爬虫我的项目如果做降级,你会怎么做?说说Redis的几种数据类型及应用场景MySQL索引说一下,晓得多少说多少括号匹配问题输入n对括号的所有组合(回溯,没答上来)go里边的channel说一下你们对外的接口,如果用适配器模式进行批改,你会怎么做Nginx和PHP通信的残缺流程Nginx的多过程模型如果Nginx的master过程被杀了之后,还能失常拜访吗?二面高并发有遇到过吗?(.....没有)有没有基于趣味理解过分布式(......没有)说一下你了解的duck typinggo中的接口和php中的接口的区别你的我的项目中有哪些值得说的?晓得什么是稳固排序吗?快排是稳固排序吗?为什么?还有哪些是不稳固排序?说一下同步、异步、阻塞、非阻塞、同步阻塞、异步阻塞、IO多复路过程间通信形式有哪些?乐观锁、乐观锁MySQL用的是乐观锁还是乐观锁?InnoDB和MyISAM的区别?Redis和Memcache的区别?你会在哪些场景下抉择Memcache?你理解http和tcp吗?说一下你晓得的内容TCP、UDP的区别?什么是面向字节流的传输?TCP是如何保障牢靠传输的?http的申请头内容和响应头内容有哪些说一下group by是如何实现的?三面介绍一下当初和以前做的我的项目你我的项目中是如何保障幂等的双向链表,插入一个节点MySQL的主从同步?如何保障程序的?你有什么解决方案?(MySQL主从同步的确没认真理解过,而后面试官就让说本人的思路)PHP的垃圾回收机制Redis中list的底层实现如何对待团队外部竞争的问题如果有个我的项目十分紧急,你如何做取舍有没有转go的想法三次握手?DOS攻打?如果有十条一样的单子并发申请到你的代码逻辑中,你会如何解决?而后是hrbp面试,基本上是问一些在大学里都干了啥之类的 技术面试官真的都挺好的,也是一步步的疏导你去思考问题,没有接触过没关系,说本人是如何思考的就行 而后很快也有了后果,通过了所有的面试。在面百度的期间,好将来那边曾经跟我沟通完了所有的货色,就差发offer了。而后我是给好将来说我这边有百度的面试,想面完,好将来的hr真的超好,她说能够等百度这边给后果了再给她们回复 百度面完之后,它们招聘那边的人迟迟没分割我,起初我就被动问了一下,说明天就分割我,预计是它们把邮件疏忽了。后边百度那边就给我发了入职资料的邮件,薪资流水、学历、学位这些 我确认百度这边通过之后,就把好将来的offer拒了。哎,可能只有学历十分一般的小伙伴能力了解吧,去百度是想镀一层金,平台大,有资源 然而在后边的沟通中,真的特地不难受,跟我谈薪资的hr谈话的形式,我真的超不喜爱。她给我的薪资,我感觉跟我预期的有点低,我说我考虑一下,而后稍后给回复。我记得她说了一句“年底了,咱们hc少”,那个语气,大家本人悟。起初我承受了,为了镀金嘛 而后谈到入职工夫的问题,对方说了一句“早点来对你有益处”,因为这个hr谈话始终都是那种比拟淡漠的,听到这句话我真的炸了。我是为了镀金,但也不能没底线,我就让她们终止流程了 我也晓得那是她的职责,然而总感觉她姿势放的有点高,谈话形式让人很有压迫感,我真不喜爱那种气氛 起初三面我的那个老大跟我理解了状况,说让再考虑一下。我最初还是抉择了不去(我晓得未来我不跟hr单干,技术团队的气氛并不会是那样,然而那种不难受的感觉曾经在心里了,很难再承受了) 而后我就分割了好将来的hr,问她们是否还有hc,我想再面一次。而后她问了我百度那边的状况,就跟她们那边主管磋商,接着之前的流程走了 兜兜转转,兴许它就是最好的后果。自身我也超喜爱好将来的技术气氛,兴许这就是缘分,哈哈哈,加油! 好了,叨叨完了,心愿大家也能拿到本人称心的offer!

January 22, 2021 · 1 min · jiezi

关于php:盘点那些年火过的php建站系统

 大家好,我是为宽广程序员兄弟操碎了心的小编,每天举荐一个小工具/源码,装满你的收藏夹,每天分享一个小技巧,让你轻松节俭开发效率,实现不加班不熬夜不掉头发,是我的指标! 明天小编盘点的这些开源php零碎都是技术小白都能玩的转的。当初这些我的项目有的仍然是时下的热门,有的曾经成为数百万内容创业者必不可少的根底零碎,也有一些逐渐过期,兴许不晓得什么时候就会退出历史的舞台,让咱们好好回顾,而你又据说过哪些?应用过哪些?又怀恋过哪些? 1.Discuz 技术小白们喜爱相熟的DZ论坛社区零碎,能够说这是迄今为止中国人利用最宽泛的开源社区零碎。康盛公司出品,康盛被腾讯收买之后进一步倒退状态,全中国有几百万站长在应用。 到当初,Discuz零碎仍然是大多数中小社区和内容交换圈子的首选,甚至于晚期的小米社区都曾应用这套零碎。大量的开发者的退出,让利用核心云端插件和模板库异样的丰盛,你简直能够通过装置插件找到你所有想要应用的性能,大量的模板让技术小白都能轻松应用。对于小白来说,你只有懂得根底的网站运维环境就能够利用Discuz零碎搭建一个大型欠缺的社区生态链,一键装置环境,如果你不懂运维,祝贺你,官网还提供一环境安装包,一键装置。 长处:插件模板丰盛,技术常识欠缺,你所遇到的所有bug和问题简直都能从官方论坛中找到解决办法,而且是间接贴出具体的问题文件门路以及第多少行代码,只须要文本编辑器齐全照抄批改一遍就能解决问题。 毛病:零碎臃肿,逻辑结构复杂,对于php初学者来说简直不存在二次开发和模板定制的可能性。界面款式古老死板,对挪动端反对相当的让人无奈,如果你从模板库找不到喜爱的手机模板,祝贺你,技术不好你算是彻底入坑了。 2.WordPress 国外的一款开源博客零碎,作为博客零碎,Wodrdpress能够算的上是国内利用最宽泛的国外开源博客零碎了。在互联网大暴发时代,相当多的人依靠该零碎制作博客和资讯门户网站。 与Discuz一样,作为一种利用宽泛的开源网站零碎,它最大的长处是小白式装置,简直不劳神就能够轻松架设,尽管没有一键环境安装包,不过也是略微懂一点环境架设常识就能运行起来。同样有大量的插件和模板,在后盾利用核心就能够间接点击装置,相当的省心。 同时也与Discuz有雷同的缺点,零碎逻辑绝对简单,如果你是个技术小白或者是初学者,别想了,间接搜寻相干资源下载安装更省心。大部分的应用问题能轻易解决! 在呈现可视化编辑插件之后,更是将WordPress推向了一个顶峰,只有会做图片,会排版,利用可视化编辑插件能够轻松定制想要的任何网页款式。 富文本编辑框相当的清新,自适应界面对手机端堪称完满,如果你想用手机端编写博客,应用WordPress零碎也是相当的省心,因为该零碎连后盾都能自适应手机端。 长处:装置不便,应用便捷,插件和模板利用资源丰盛,小白也能部署应用。 毛病1:前后端大量利用第三方字体库,包含谷歌字体库和360字体库,在谷歌被墙了之后基本上利用谷歌字体库的页面是别想关上了,而360字体库访问速度是相当的慢,如果你没有技术根底去更换字体库调用的能力,祝贺你,你的网站根本彻底瘫痪。(不懂啥是字体库的童鞋慎入此坑) 毛病2:WordPress对系统资源占用偏高,如果你用零碎自带的模板还行,如果你用可视化编辑器或者是一些相当简单的模板的状况下,基本上虚拟主机是跑不动的,服务器部署带起来也会资源占用相当的高。 3.织梦CMS 互联网大暴发时代中国利用最宽泛的CMS内容管理系统,技术小白就算了,这零碎尽管装置同样简便,然而齐全没有技术根底的话你只能应用超难看的根本模板了。不过淘宝上有大量整合好的精美模板,几块钱就能够在淘宝上买到一个精美的织梦CMS内容管理系统+前端模板。这方面来讲,小白仍然能够应用该零碎做网站。 因为防盗技术的不够欠缺,在织梦CMS零碎免费后市面上大量呈现破解版,尽管织梦仍然提供收费开源的版本,然而有各种性能限度,或者大多数的开发者压根不晓得本人正在应用的基本上都是破解版,切实是太泛滥了。 尽管插件不够丰盛,然而模板的二次开发难度低到难以想象,基本上php入门者都能轻易的用织梦CMS制作精美的模板网站。目前市面上二三流的网站开发公司基本上都是用织梦零碎帮企业做网站定制开发。不得不说,相熟人的一看后盾就能发现这是个大坑。 总而言之,织梦CMS曾经成为低技术门槛、烂开发公司的代名词,如果你还在用织梦CMS给他人做网站,被人看到会被笑话的!当然,对于入门级开发者来说,织梦能够算的上是最好用的企业网站和内容治理网站开源零碎了。 长处:模板二次开发简略,上手容易。页面构造简略,网站响应速度相当快。 毛病:插件资源比拟少,齐全不懂技术的人无奈应用。惨不忍睹和跟不上时代的后盾款式总让你看起来感觉丢人。每次内容更新都须要在后盾进行一个伪动态转换,并且进行缓存清理,否则即便你公布了新的内容,前台也看不到。 4.帝国CMS 除了开发商与织梦不是同一家公司以外,其它的状况基本一致。包含长处和毛病,这是一套与织梦CMS零碎完全相同类型的零碎。简直找不到什么太大的优劣差异,连市场份额也根本与织梦CMS相差无几。 5.ThinkCMF 依靠于ThinkPHP为底层技术开发的内容治理框架,在用处上简直与织梦CMS完全一致。由一个小型团队提供,完全免费开源,没有任何限度。可能是上市比拟晚的起因,不论是在界面款式、体验度方面都完爆织梦CMS,各种前端框架兼容性良好。 最重要的是,这简直是我在市面上同类型零碎当中看到的开发文档最为欠缺的一个,各种变量和利用形式写的都相当残缺。你只须要有一丁点的PHP根底,就能够轻松应用它做各种模板整合开发,当然插件开发还是须要更深刻的PHP常识的。 长处:二次开发简略轻松,自带七牛云存储插件,能够将图片资源存储在七牛云,响应速度极快,整套零碎拜访毫无提早感。 毛病:技术小白得靠边站,根底模板都没有提供,想玩起来必须得本人入手。 6.Flarum 这是一个小众的论坛零碎,大多数人都没听说过,来自国外的一款优良的论坛零碎,好在有国人进行中文优化。这套零碎的最大劣势体现就是响应速度快。前端框架异样精美,自适应手机端,体验良好。 比拟坑的是,Flarum零碎简直不怎么更新,更新周期十分长,中文优化版本Flarumchina也因为英文官网不更新的起因,简直几个月才会看见一次更新,让人十分心塞。性能绝对较少,然而笔者之所以将这套零碎放进来最大的起因是它的前端精美到能够让人疏忽所有细节,哪怕有N多BUG笔者都违心忍耐的水平。 长处:前端优良,响应速度极快,页面精美。 毛病:环境要求异样简单,PHP5.6左右玩的转,不论是高了还是低了基本上出错你也找不到起因,技术文章很少,开发难度极大。整套零碎让你感觉不像是PHP写的,更像是js写的.... 以上阐明仅代表笔者个人观点,如果你有更好的想法和认为更优良的零碎,欢送留言骂街! 结尾 本期就分享到这里,我是小编南风吹,专一分享好玩乏味、离奇、实用的开源我的项目及开发者工具、学习资源!心愿能与大家独特学习交换,欢送关注我的公众号【Github导航站】。

January 22, 2021 · 1 min · jiezi

关于php:PHP方法参数的那点事儿

在所有的编程语言中,办法或者函数,都能够传递一些参数进来进行业务逻辑的解决或者计算。这没什么可说的,然而在PHP中,办法的参数还有许多十分有意思的能力,上面咱们就来说说这方面的内容。 援用参数波及到值传递和援用传递的问题。在失常状况下,咱们应用值传递的时候,变量是进行了拷贝,办法内外的变量不会共享内存。也就是说,在办法体中批改了变量的值,办法内部的变量不会产生变动。而援用传递则是传递的变量的内存地值。办法内外的变量能够看做是同一个变量,比方: $a = 1;function test(&$arg){ $arg++;}test($a);echo $a; // 2为参数加上&标识,就表明这个参数是援用传递的参数。如果没有加这个标识,则所有的根本类型参数都会以值的形式进行传递。为什么要强调根本类型呢?上面咱们用类当参数来测试一下: class A{ public $a = 1;}function testA($obj){ $obj->a++;}$o = new A();testA($o);echo $o->a; // 2在这个例子中,咱们并没有应用&标识来表明参数$obj是援用类型的,但如果传递的参数是对象的话,那么它默认就是进行的援用传递。如果想让对象也是值传递呢?道歉,在办法参数中是没方法实现的,只能在办法体中应用clone形式对对象参数进行克隆。 class A{ public $a = 1;}function testA($obj){ $o = clone $obj; $o->a++;}$o = new A();testA($o);echo $o->a; // 1对于值和援用的问题,能够参考设计模式中原型模式的解说:PHP设计模式之原型模式 默认参数参数是能够有默认值的,这个我想大家都应该很分明了。然而在应用的时候也须要留神,那就是默认参数不要放在后面,否则很容易出错,比方: function testArgsA($a = 1, $b){ echo $a+$b;}testArgs(); // errorfunction testArgsB($a = 1, $b = 2){ echo $a+$b;}testArgsB(); // 3function testArgsC($a, $b = 2){ echo $a+$b;}testArgsC(1); // 3在简单的函数或者紧急的业务开发中,很有可能一个不小心就会漏写参数,这时候testArgsA就会返回谬误了。当然,这种大意类的谬误是咱们应该尽量避免的。 ...

January 22, 2021 · 2 min · jiezi

关于php:Error-php72wcommon-conflicts-with-phpcommon5416

问题明天在本地跑共事我的项目的时候发现报错了Uncaught Error: Call to undefined function bcdiv()起因是因为本地php环境没有开启 bamath 扩大,于是便间接用命令[root@k8s-master /]# yum install php-bcmath报错如下Error: php72w-common conflicts with php-common-5.4.16-48.el7.x86_64解决办法装置 epel+Remi 这两个源,Remi repository 是蕴含最新版本 PHP 和 MySQL 包的 Linux 源,由 Remi 提供保护。yum install epel-release.noarch//装置remi的centos7的源rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm//这个remi的源装置后还须要批改一下,使其失效,我这里用的是7.2版本vi /etc/yum.repos.d/remi-php72把enabled=0改为enabled=1而后执行[root@k8s-master /]# yum install php-bcmath

January 21, 2021 · 1 min · jiezi

关于php:laravel使用npm构建报错laravelmixsrcMixjs18-static-primary-null

问题明天在应用npm构建laravel8我的项目时呈现报错:laravel应用npm构建报错laravel-mix/src/Mix.js:18 static _primary = null > mix watch -- --watch-options-poll=1000[webpack-cli] /www/wwwroot/xxx/node_modules/laravel-mix/src/Mix.js:18 static _primary = null; ^SyntaxError: Unexpected token = at new Script (vm.js:83:7) at NativeCompileCache._moduleCompile (/www/wwwroot/xxx/node_modules/v8-compile-cache/v8-compile-cache.js:240:18) at Module._compile (/www/wwwroot/xxx/node_modules/v8-compile-cache/v8-compile-cache.js:184:36) at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10) at Module.load (internal/modules/cjs/loader.js:653:32) at tryModuleLoad (internal/modules/cjs/loader.js:593:12) at Function.Module._load (internal/modules/cjs/loader.js:585:3) at Module.require (internal/modules/cjs/loader.js:692:17) at require (/www/wwwroot/xxx/node_modules/v8-compile-cache/v8-compile-cache.js:159:20) at module.exports (/www/wwwroot/xxx/node_modules/laravel-mix/setup/webpack.config.js:2:17)npm ERR! code ELIFECYCLEnpm ERR! errno 2npm ERR! @ watch-poll: `mix watch -- --watch-options-poll=1000`npm ERR! Exit status 2npm ERR! npm ERR! Failed at the @ watch-poll script.npm ERR! This is probably not a problem with npm. There is likely additional logging output above.npm ERR! A complete log of this run can be found in:npm ERR! /root/.npm/_logs/2021-01-21T09_04_30_514Z-debug.log办法于是上网查了很多材料,很多都是说,删除node_modules重装,或者更换taobao镜像,然而试了都不好使,最初本人摸索,发现是node版本问题,于是,解决这里的问题只须要降级node版本即可 ...

January 21, 2021 · 1 min · jiezi

关于php:CCJavaPHPPython主要应用在哪里方面

首先,咱们先遍及一下编程语言的基础知识。用任何编程语言来开发程序,都是为了让计算机干活,比方编写一篇文章,下载一首MP3等,而计算机干活的CPU只意识机器的指令,所以,只管不同的编程语言差别极大,最初都得“翻译”成CPU能够执行的机器指令。实践上任何语言干任何事件简直都能够, 然而次要干什么那就不一样了。 Java java经常跟“企业”分割在一起,因为具备一些很好的语言个性,以及丰盛的框架,在企业应用中最被青眼,你总能够听到对于J2EE,JSP,Hibernate之类的货色的探讨。同时, java在手机畛域也有一席之地,在广泛智能化之前,很多手机就是以反对java利用作为卖点的,而智能手机暴发之后,java手机主场变成了android,作为安卓的规范编程语言而存。 总结: Java:网页。企业级开发,一般应用软件,游戏后盾。 C和C++ C/C++实践上说能够做任何开发,只有有适合的硬件驱动和API,特点是效率高,基本上是编译语言外面效率最高的。除非你的零碎中连C/C++编译器都不具备。某些零碎当中C++编译器是不具备的,然而C个别都具备。目前而言,C语言次要用来开发底层模块(比方驱动,解码器,算法实现),服务利用(比方web服务器)和嵌入式应用(比方微波炉里的程序)。C++也能够做这些,不过因为C++的复杂性和规范问题,人们还是更违心应用C来做。C++更适宜比较复杂但又特地须要高效率的设施,比方大型游戏,一些根底库,大型桌面利用。 总结: C:零碎底层,驱动,嵌入式开发。 C++:游戏开发,大规模,高性能,分布式要求的程序开发。 JavaScript javascript听起来跟java有关系,其实并没有任何关系,只是名字像而已,就好比雷峰塔和雷锋的关系一样,尽管只差一个字。 js最宽泛的利用毫无疑问是在web前端。简略的说,网站给你传过来的是一堆用各种标签示意格局的文档,而js负责操纵这些文档实现一些客户端动态效果。js的领地还不仅如此,当初的Node.js还能够用于服务器端的开发。 总结: JavaScript是浏览器的脚本语言,个别和Html,CSS这些一起学,次要做网站的前端开发,展示各种酷炫的画面。 PHP php这三个字你经常会在浏览器地址栏里看到,所以不意外php是用来开发网站的。也是web后端的王者语言,有数的网站后端都运行着php代码。 总结: PHP:次要是网络前端,用于生成网页。也能够整个web服务器都用php,比方很多论坛引擎。 Python Python因为具备丰盛和弱小的库,它又叫做作胶水语言,可能把用其余语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种利用情景是,应用Python疾速生成程序的原型(有时甚至是程序的最终界面),而后对其中有特地要求的局部,用更适合的语言改写,比方3D游戏中的图形渲染模块,性能要求特地高,就能够用C/C++重写,而后封装为Python能够调用的扩大类库。Python是做服务器开发与物联网开发。信息安全,大数据处理,数据可视化机器学习,物联网开发,各大软件的api,桌面利用,都须要python。 总结: Python:动静解释型,开发效率高,开源,灵便,入门门槛低。

January 21, 2021 · 1 min · jiezi

关于php:PHP中用号连接数组的结果是

咱们在开发中,有时候会将两个数组合并连接起来,这个时候要留神了,千万不要偷懒间接应用+号哦,为什么呢?咱们看看以下代码: $a = [1, 2];$b = [4, 5, 6];$c = $a + $b;print_r($c);请用第一间接通知我它的后果是什么?或者我这么问你应该能猜到,它的后果是: Array( [0] => 1 [1] => 2 [2] => 6)看进去了吧,用+号操作符连贯的数组,后果取的是并集。也就是依据键,雷同键的不会笼罩,没有键退出进来造成一个新数组。并不是将两个数组真的加起来。 如果咱们用$b+$a呢?那么后果就是$b的内容。 $c = $b + $a;print_r($c);Array( [0] => 4 [1] => 5 [2] => 6)那么咱们要取得1,2,4,5,6这样一个数组要怎么办呢?没错,应用array_merge()函数,请留神数组Key的地位: $c = array_merge($a, $b);print_r($c);Array( [0] => 1 [1] => 2 [2] => 4 [3] => 5 [4] => 6)$c = array_merge($b, $a);print_r($c);Array( [0] => 4 [1] => 5 [2] => 6 [3] => 1 [4] => 2)如果是key/value模式的Hash数组呢?后果也是一样的,$a中没有键将合并过去,雷同的键将不解决。 ...

January 21, 2021 · 1 min · jiezi

关于php:2020年得与失汗水和泪水

北漂的第五年,开年的时候感觉和以往没什么不同,除夕夜还是在云南旅游过的。白天去玉龙雪山玩,有些高原反馈加上冻着了有点发烧,晕晕乎乎的被带到高速收费口边上的蓝色抗灾帐篷做查看,没想到,【新冠病毒】竟成了2020年影响千千万万个家庭的主导因素。 失去了2019年终奖;干了两年半的工作;中介暴雷,年付房租六万块钱;衰弱,过劳瘦削了20斤; 打球被一群初中生叫 "胖叔",感触下~失去了和老婆感情变好了;大厂offer;稿费三千块钱;小宝,哈哈哈; 心里话:当拿第一个30+offer时候老婆说我是运气,直到拿了3个~致力的汗水和喜悦的泪水因为结婚了始终没有度蜜月,1月报了团,去云南玩了一趟,依照上一年年终奖3万多作为估算规范,所以这次出去玩报团+买玉总共也花了3万多,后果往年没发,这里外里...因为工作稳固,2月把造娃提上日程并付诸实践。惊闻第一个教育公司假借疫情之名发表开张(兄弟连),前公司迅速跟进,2,3,4月,果决发表砍掉2019的年终奖,也砍断了我对公司的眷恋,老板开始安顿大小周,月月欠薪,日日抓考勤,谈降薪,谈固定薪资数改为固定+绩效,骚操作玩的飞起~ 这段时间因为房租到期,搬家一次。拾掇拾掇我的鞋子。 因为前公司非法裁员原告了,我还作为原告身份和老板一起去仲裁,人生经验阿,没想到第一次劳动仲裁是去作为资方。 在舒服区待久了,求职往往是苦楚的体验。4,5月碰壁了几次,开始整顿温习,写了一本电子书,过后感觉很不错的,当初看来还有很大晋升空间。名字叫《phper面试-2020》,看云是个不错的文档写作、托管及数字出版平台。 通过一个多月的致力,拿了3个offer;通过一年的在线售卖,稿费拿了三千多。(定价10块一本,平台扣3块,我到手7块)自豪的晒出未提现稿费: 自豪的晒出我的历史提现记录: 6月,入职了一家三线大厂,没达到预期,半个月后辞职了。8月,因为房东要装修,被迫又要搬家,索性搬到了要生产的医院左近。10月,中介暴雷(相似蛋壳),房东上门,闹了几翻,去过几次派出所,斗争,从新和房东签协定。 11月,小宝来到这个世界,以我老婆为领导的组织架构调整为三口之家。 7~12月,大厂的工作很须要我转变心态,很多中央须要我学习。 2021年,我也开始减肥了。 与君分享我的一个教训,人总是会通过思考近景,来缓解当下环境带来的压力,对以后本人原本要付出的致力,要吃的苦就放任了,须知,若要俯视星空,必先好高鹜远。 你无奈在展望未来时串联点滴,你只能在回顾过去时将其升华。 -乔布斯

January 20, 2021 · 1 min · jiezi

关于php:ThinkORM20开发指南

ThinkORM是一个基于PHP和PDO的数据库中间层和ORM类库,之前始终作为ThinkPHP5.*系列的内置ORM类,以优异的性能和突出的性能著称,从ThinkPHP6.0版本开始反对独立应用,并作了降级改良,提供了更优良的性能和开发体验,最新版本要求PHP7.1+。 2.0版本次要个性:基于PDO和PHP强类型实现反对原生查问和查问结构器主动参数绑定和预查问简洁易用的查问性能弱小灵便的模型用法反对预载入关联查问和提早关联查问反对多数据库及动静切换反对MongoDb反对分布式及事务反对断点重连反对JSON查问反对数据库日志反对PSR-16缓存及PSR-3日志标准环境要求2.0版本:PHP7.1+ 装置应用composer装置 composer require topthink/think-orm 最新的2.0版本要求PHP7.1+,如果你的PHP环境低于7.1,能够装置1.0版本。开发指南因为ThinkORM曾经齐全独立,后续的手册也会独立保护。 点击查看: ThinkORM开发指南

January 20, 2021 · 1 min · jiezi

关于php:ThinkPHP-V606V5141版本发布兼容PHP80

V6.0.6版本公布,本版本次要为兼容PHP8.0,另外还做了一些修改和必要的优化。次要更新:兼容composer2生成配置文件优化optimize:schema指令减少socket-log 的 curl 超时设置修改路由匹配减少兼容PHP8解决减少汉字辨认匹配范畴 反对局部生僻字正则改良响应文件申请时的缓冲革除资源路由反对设置变量规定$request->ip() 办法兼容PHP8修复验证器in、between办法,应用数组,性能异样修改含有__make的类实例化后未执行invokeAfter的问题修复命令行创立中间件命名空间有效 bug装置和更新V6版本开始仅反对Composer装置及更新,反对上个版本的无缝更新,间接应用 composer update 更新到最新版本即可。 如果须要全新装置,应用: composer create-project topthink/think tp 官网文档官网6.0齐全开发手册6.0入门必读教程官网服务应用服务市场 —— 新年优惠活动进行中ThinkAPI——对立API服务除了6.0之外,官网同时还公布了V5.1.41版本,次要为了兼容PHP8.0做了一些调整,依然反对无缝降级。依照打算,5.1版本将不再提供性能和安全更新,生态产品该当尽快更新到6.0版本为妥。

January 20, 2021 · 1 min · jiezi

关于php:PHP8新特性盘点

PHP 8.0.0 曾经正式公布了,这个对于PHPer无疑是一个令人振奋的音讯。它蕴含了很多新性能与优化项, 包含命名参数、联结类型、注解、结构器属性晋升、match表达式、nullsafe运算符、JIT,并改良了类型零碎、错误处理、语法一致性。最人性化的个性:命名参数、联结类型、mixed类型这几个新个性让PHP在强类型方面进一步欠缺,而且对PHPDoc的正文依赖越来越弱,代码即文档的益处是开发者最头疼的事件终于有方法能够偷懒了。 命名参数命名参数能够让函数或者办法的调用更加清晰直观,对于如下的函数定义 function foo(string $a, string $b, ?string $c = null, ?string $d = null) { /* … */ } 你能够通过上面的形式传入参数进行调用 foo( b: 'value b', a: 'value a', d: 'value d',); 最大的益处是传入参数的程序是和定义无关的,而且还能够混合传参(但不倡议)。 联结类型绝对于以前的 PHPDoc 申明类型的组合, 当初能够用原生反对的联结类型申明取而代之,可在理论运行中验证。PHP7 class Number { /** @var int|float */ private $number; /** * @param float|int $number */ public function __construct($number) { $this->number = $number; }}new Number('NaN'); // Ok PHP8 class Number { public function __construct( private int|float $number ) {}}new Number('NaN'); // TypeError 新的 mixed类型mixed自身是以下类型之一: ...

January 20, 2021 · 2 min · jiezi

关于php:PHP8新特性系列构造器属性提升使用及注意事项

本篇次要说下PHP8结构器属性晋升的用法,这个个性对于一些须要在结构器中设置或初始化一些类属性的时候十分有用(包含public、protected和private),比方在PHP7中你能够这样定义一个类的属性,而后在构造方法中传值。 class Point { public int $x; private string $y; public function __construct(int $x = 0, string $y='') { $this->x = $x; $this->y = $y; }} 在PHP8中则能够简化为间接在构造函数办法外面定义类的属性 class Point { public function __construct(public int $x = 0, private string $y = '') { // 你能够在结构器中间接输入类的x和y属性的值(也就是传入的x和y变量的值) var_dump($this->x); var_dump($this->y); }} 不过须要留神的是结构器属性只能在结构器办法中定义(如同是废话),而且必须增加public/protected/private,如果不增加的话是不会作为类属性定义的,除非你在父类中曾经定义了结构器属性,比方: class Test { public function __construct( public int $x = 0 ) {}}class Child extends Test { public function __construct( $x, public int $y = 0, public int $z = 0, ) { parent::__construct($x); }} 在理论应用过程中,还有些细节须要留神。 ...

January 20, 2021 · 2 min · jiezi

关于SegmentFault:PHP中使用if的时候为什么建议将常量放在前面

在某些框架或者高手写的代码中,咱们会发现有不少人喜爱在进行条件判断的时候将常量写在后面,比方: if(1 == $a){ echo 111;}这样做有什么益处呢?咱们假如一个不小心的粗枝大叶,少写了一个=号,会有什么后果。 $a = 'a';if($a = 'b'){ echo 111;}echo $a;没错,111输入了,$a的值也变成了b。少了一个等号,就变成了赋值操作,这样的操作会先给$a赋值,而后依据$a的值进行判断。如果$a = '',就不会输入111,然而$a的值还是会变成''。 划重点:这样的写法php是不会报错的,这也是有可能造成BUG的状况。 那么反过来呢? $a = 'a';if('b' = $a){ echo 111;}首先,大部分的IDE都会报语法错误,也就是间接划红线了。常量是不能被赋值批改的,不论是数字、字符串还是零碎或者咱们本人曾经定义了的常量。 其次,这种状况下你要是还发现不了这里有问题的话也没关系,运行起来也会报错的,代码是无奈持续向下运行的。 当然,这只是一个小技巧,而且最次要的目标是为了应答大意带来的问题。所以并不是强制的标准,有些公司可能会在代码审计或者标准文档中强调这样写法,当然,最好的还是咱们要杜绝这种大意带来的谬误。 测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/PHP%E4%B8%AD%E4%BD%BF%E7%94%A8if%E7%9A%84%E6%97%B6%E5%80%99%E4%B8%BA%E4%BB%80%E4%B9%88%E5%BB%BA%E8%AE%AE%E5%B0%86%E5%B8%B8%E9%87%8F%E6%94%BE%E5%9C%A8%E5%89%8D%E9%9D%A2%EF%BC%9F.php =========== 各自媒体平台均可搜寻【硬核项目经理】

January 20, 2021 · 1 min · jiezi

关于php:Macbook-m1-Big-Sur-安装php71-mondodb-折腾记

首先,我参考How to Install PHP 7.0 / 7.1 using HomeBrew on Mac Big Sur用exolnet/homebrew-deprecated 这个源装置失败了 /bin/sh ./config.sub -apple-darwin20.2.0 failed多方查找如果,最初应用shivammathur/php装置胜利了 装置php7.1$brew tap shivammathur/php$brew search php==> Formulaebrew-php-switcher ✔ php@7.2 phpmd shivammathur/php/php shivammathur/php/php@7.2php php@7.3 phpmyadmin shivammathur/php/php@5.6 shivammathur/php/php@7.3php-code-sniffer php@7.4 ✔ phpstan shivammathur/php/php@7.0 shivammathur/php/php@7.4 ✔php-cs-fixer phplint phpunit shivammathur/php/php@7.1 shivammathur/php/php@8.1==> Caskseclipse-php netbeans-php phpstorm$brew install php@7.1切换版本装置brew-php-swither切换工具 $brew install brew-php-switcher==> Downloading https://github.com/philcook/brew-php-switcher/archive/v2.2.tar.g==> Downloading from https://codeload.github.com/philcook/brew-php-switcher/tar.#=#=-# # ==> Installing brew-php-switcher ???? /usr/local/Cellar/brew-php-switcher/2.2: 6 files, 11.0KB, built in 4 seconds$brew install php@7.1brew切换php版本 ...

January 19, 2021 · 1 min · jiezi

关于前端:Windows10错误在打开特定路径时导致BSOD崩溃

Windows 10中的谬误仅通过在浏览器的地址栏中关上特定门路或应用其余Windows命令,即可使操作系统解体并显示蓝屏死机。 上周,BleepingComputer理解到Windows平安钻研人员在Twitter上披露的两个谬误,攻击者能够在各种攻打中滥用这些谬误。 第一个谬误容许无特权的用户或程序输出单个命令,该命令导致NTFS卷被标记为已损坏。只管chkdsk在许多测试中都解决了此问题,但咱们的一项测试表明该命令导致硬盘驱动器损坏,从而导致Windows无奈启动。 明天,咱们看看导致Windows 10仅通过尝试关上一条异样门路而导致BSOD解体的第二个谬误。 关上此门路会导致BSOD 自10月以来,Windows平安研究员 Jonas Lykkegaard 在推特上发表了很屡次推文,讲述了一条门路,该门路会立刻导致Windows 10解体并在进入Chrome地址栏中时显示BSOD。 当开发人员想要间接与Windows设施进行交互时,他们能够将Win32设施命名空间门路作为各种Windows编程性能的参数传递。例如,这容许应用程序间接与物理磁盘进行交互,而无需通过文件系统。 Lykkegaard通知BleepingComputer,他发现了“控制台多路复用器驱动程序”的以下Win32设施名称空间门路,他认为该门路用于“内核/用户模式ipc”。当以各种形式关上门路时,即便来自低特权用户,也会导致Windows 10解体。 .globalrootdevicecondrvkernelconnect 连贯到该设施时,开发人员应传递“ attach”扩大属性以与该设施正确通信。 CDCreateKernlConnection显示“附加”扩大属性 Lykkegaard发现,如果因为不正确的谬误查看而尝试不通过属性而连贯到门路,则会导致异样,从而导致Windows 10中的蓝屏死机(BSOD)解体。 更蹩脚的是,特权低的Windows用户能够尝试应用此门路连贯到设施,从而使计算机上执行的任何程序都很容易解体Windows 10。 在咱们的测试中,咱们曾经确认此谬误在Windows 10 1709版和更高版本中存在。BleepingComputer无奈在晚期版本中对其进行测试。 BleepingComputer上周与Microsoft分割,以理解他们是否曾经晓得该谬误以及是否会修复该谬误。 微软发言人对BleepingComputer示意:“微软对考察已报告的平安问题的客户承诺,咱们将尽快为受影响的设施提供更新。” 威逼演员能够滥用该谬误 只管目前尚不确定此破绽是否可用于近程代码执行或晋升特权,但仍能够将其用作计算机上的拒绝服务攻打。 Lykkegaard与BleepingComputer共享了一个Windows URL文件(.url),其设置指向。 globalroot device condrv kernelconnect。下载文件后,Windows 10会尝试从有问题的门路中出现URL文件的图标,并主动使Windows 10解体。 BSOD由拜访。 globalroot device condrv kernelconnect引起 尔后,BleepingComputer发现了许多其余利用此bug的办法,包含在Windows登录时主动导致BSOD的办法。 在现实生活中,该破绽可能会被威逼角色滥用,他们能够拜访网络并心愿在攻打过程中覆盖本人的形迹。 如果他们具备管理员凭据,则能够近程执行拜访网络上所有Windows 10设施上的此门路的命令,以使它们解体。在网络上造成的毁坏可能会提早考察或阻止治理控件检测到特定计算机上的攻打。

January 19, 2021 · 1 min · jiezi

关于php:Golang实现PHP常用函数

go-to-php用Golang封装PHP罕用的函数,为了辨别PHP与Go中的函数,go-to-php封装的函数,都是在对应的PHP函数的后面加上大写的P。Pallord函数除外。相干代码点击github 装置字符串相干包go get -u github.com/Echo-Mr-Pengw/go-to-php/str 数组相干包开发中 ....... 字符串相干函数go-to-php封装函数对应的PHP函数Pimplode(glue string , pieces interface{}) stringimplodePjoin(glue string , pieces interface{}) stringimplode的别名,同PimplodePexplode(delimiter , str string , limit int) []stringexplodePstrlen(str string) intstrlenPmb_strlen(str string) intmb_strlenPlcfirst(str string) stringlcfirstPucfirst(str string) stringucfirstPstrtoupper(str string) stringstrtoupperPstrtolower(str string) stringstrtolowerPucword(str string) stringucwordPtrim(str , character_mask string) stringtrimPltrim(str , character_mask string) stringltrimPrtrim(str , character_mask string) stringrtrimPchop(str , character_mask string) stringrtrim的别名,同PrtrimPmd5(str string) stringmd5Psha1(str string) stringsha1Pord(str string) intordPallord(str string) interface{}转化全副字符,ord的升级版Pchr(ascii int32) stringchrPecho(a ...interface{})echoPvar_dump(a ...interface{})var_dumpPprint(a interface{})printPstr_repeat(input string , multiplier int) stringstr_repeat

January 18, 2021 · 1 min · jiezi

关于php:企业发卡网源码基于知宇发卡系统源码内核

 企业发卡网源码的高级售卡跟踪(AST)容许您向订单增加跟踪信息,并为您的客户提供跟踪订单的简略办法。AST提供了弱小的性能,让每个商户都可能更好地治理和自动化他们的发货后订单流,缩小客户服务工夫,进步客户满意度并能助店铺以更正式的形式治理WooCommerce订单,并使发货后的操作自动化。 源码演示及获取形式:w12.ink 基于知宇发卡零碎源码次要特点 1、轻松地向订单增加跟踪信息 很容易将跟踪信息增加到您的订单中,企业发卡网源码容许您从WooCommerce订单管理员或单个订单管理员增加跟踪,咱们还容许您在增加跟踪信息时将订单标记为已实现。 2、定制订单电子邮件上的跟踪显示 您能够齐全自定义订单电子邮件及其帐户上的跟踪信息显示。咱们的定制程序提供实时预览,您能够抉择设计布局、显示/暗藏跟踪信息、编辑内容、字体、色彩等。。 3、放弃你的跟踪链接是最新的 企业发卡网源码系统维护此列表,您能够同步运送提供商列表,以使其与运送提供商信息中的任何更改放弃最新。 4、WooCommerce REST API反对 AST创立了一个装运跟踪WooCommerce REST API端点,因而您能够从任何内部零碎或装运标签服务轻松更新WooCommerce订单中的跟踪信息,并主动执行日常工作流程。。 5、从CSV批量上载 如果您的发货人在文件中提供跟踪信息,并且您心愿防止将它们手动增加到订单中,那么AST提供了一个疾速而简略的界面,能够从CSV将多个跟踪号批量导入订单。 6、自定义订单状态 改良您的订单治理流程,应用自定义订单状态,为您在不同工夫以独自的软件包发货的订单启用局部已发货,或启用已交付订单状态(如果应用)轨道船用于跟踪和交付自动化。 企业发卡网源码领取外围内核: namespace app\common;use app\common\util\notify\Sell;use think\Db;use think\Exception;class Pay { protected $error = ''; public function getError() { return $this->error; } /** * @var array 缓存的实例 */ public static $instance = []; public static function load($channel, $account = []) { $code = $channel->code; if (!isset($account['params']->refer)) { $account['params']->refer = ''; } $class = '\\app\\common\\pay\\' . $code; if (!isset(SELF::$instance[$code])) { // 实例化领取渠道 SELF::$instance[$code] = new $class(); // 加载渠道账户 SELF::$instance[$code]->channel = $channel; // 加载渠道账户 SELF::$instance[$code]->account = $account; } return SELF::$instance[$code]; } /** * 实现订单 * * @param string $order 订单 */ public function completeOrder(&$order) { Db::startTrans(); try { $time = time(); // 实现订单 $res = Db::table('order')->where(['id' => $order->id, 'status' => 0])->update(['status' => 1, 'success_at' => $time]); if (!$res) { Db::rollback(); exit; } // 用户加钱 $user = Db::table('user')->lock(true)->where('id', $order->user_id)->find(); if ($user) { $money = $order->total_product_price; //加的钱为产品总价 Db::table('user')->where('id', $order->user_id)->update(['money' => ['exp', 'money+' . $money]]); //以后余额 $balance = round($user['money'] + $money, 3); // 记录金额日志 record_user_money_log('goods_sold', $user['id'], $money, $balance, "胜利售出商品{$order->goods_name}({$order->quantity}张)"); // 扣除手续费 if ($order->fee_payer == 1 && $order->fee > 0) { Db::table('user')->where('id', $order->user_id)->update(['money' => ['exp', 'money-' . $order->fee]]); //以后余额 $balance = round($balance - $order->fee, 3); if ($balance < 0) { throw new Exception("商家余额不足以扣除手续费"); } // 记录金额日志 record_user_money_log('goods_sold', $user['id'], -$order->fee, $balance, "扣除交易手续费,订单:{$order->trade_no}"); // 扣除下级佣金 } if ($user['parent_id'] > 0) { $parent = Db::table('user')->lock(true)->where('id', $user['parent_id'])->find(); $spreadRebateRate = get_spread_rebate_rate(); $rebate = round($order->fee * $spreadRebateRate, 3); if ($parent && $rebate > 0) { // 返佣 Db::table('user')->where('id', $parent['id'])->update(['money' => ['exp', 'money+' . $rebate], 'rebate' => ['exp', 'rebate+' . $rebate]]); // 记录金额日志 record_user_money_log('sub_sold_rebate', $parent['id'], $rebate, round($parent['money'] + $rebate, 3), "上级[{$user['username']}]售出商品,返佣{$rebate}元"); } } $smsPrice = 0; if ($order->sms_payer == 1) { //判断是否发送了短信 if ($order->sms_notify == 1) { $smsPrice = get_sms_cost(); Db::table('user')->where('id', $order->user_id)->update(['money' => ['exp', 'money-' . $smsPrice]]); //以后余额 $balance = round($balance - $smsPrice, 3); if ($balance < 0) { throw new Exception('商家余额不足以扣除短信费'); } // 记录金额日志 record_user_money_log('goods_sold', $user['id'], -$smsPrice, $balance, "扣除短信费,订单:{$order->trade_no}"); //扣完短信费,更新到订单信息中 Db::table('order')->where('id', $order->id)->update(['sms_price' => $smsPrice]); } } //交易实现先冻结资金,T+1日再冻结 if ($order->fee_payer == 1) { $freezeMoney = round($money - $order->fee - $smsPrice, 3); } else { $freezeMoney = round($money - $smsPrice, 3); } //记录这张订单最终的商家支出是多少 $order->finally_money = $freezeMoney; $order->save(); if ($freezeMoney >= 0) { //退出主动冻结队列// $unfreezeTime = time() + 86400; //订单解冻24小时 $unfreezeTime = strtotime(date('Y-m-d', $time)) + 86400; //次日凌晨冻结 if (1 == $order->settlement_type) { // T1 结算 //解冻金额 Db::table('user')->where('id', $user['id'])->update(['money' => ['exp', 'money-' . $freezeMoney], 'freeze_money' => ['exp', 'freeze_money+' . $freezeMoney]]); //以后余额 $balance = round($balance - $freezeMoney, 3); record_user_money_log('freeze', $user['id'], -$freezeMoney, $balance, "解冻订单:{$order->trade_no},解冻金额:{$freezeMoney}元"); Db::table('auto_unfreeze')->insert([ 'trade_no' => $order->trade_no, 'user_id' => $user['id'], 'money' => $freezeMoney, 'unfreeze_time' => $unfreezeTime, 'created_at' => $time, ]); } elseif (0 == $order->settlement_type) { // T0 结算,补一张0元解冻记录,用于投诉 record_user_money_log('freeze', $user['id'], 0, $balance, "解冻订单:{$order->trade_no},解冻金额:0元(T0 计算)"); Db::table('auto_unfreeze')->insert([ 'trade_no' => $order->trade_no, 'user_id' => $user['id'], 'money' => 0, 'unfreeze_time' => $unfreezeTime, 'created_at' => $time, ]); } } } Db::commit(); $notify = new Sell(); $notify->notify($order, $freezeMoney); } catch (\Exception $e) { Db::rollback(); // 记录谬误订单 record_file_log('complete_error', $order->trade_no . $e->getMessage()); record_file_log('complete_error', $e->getTraceAsString()); die('error'); } } 企业发卡网源码高级附加内核 1、跟踪每个我的项目加载内核 ...

January 18, 2021 · 3 min · jiezi

关于php:还不知道PHP有闭包那你真OUT了

做过一段时间的Web开发,咱们都晓得或者理解JavaScript中有个十分弱小的语法,那就是闭包。其实,在PHP中也早就有了闭包函数的性能。早在5.3版本的PHP中,闭包函数就曾经呈现了。到了7以及起初的古代框架中,闭包函数的应用更是无处不在。在这里,咱们就先从根底来理解PHP中闭包的应用吧! 闭包函数(closures)在PHP中都会转换为 Closure 类的实例。在定义时如果是赋值给变量,在结尾的花括号须要增加;分号。闭包函数从父作用域中继承变量,任何此类变量都应该用 use 语言构造传递进去。 PHP 7.1 起,不能传入此类变量:superglobals、 $this 或者和参数重名。 根底语法闭包的应用非常简单,和JavaScript也十分类似。因为他们都有另外一个别名,叫做匿名函数。 $a = function () { echo "this is testA";};$a(); // this is testAfunction testA ($a) { var_dump($a); }testA($a); // class Closure#1 (0) {}$b = function ($name) { echo 'this is ' . $name;};$b('Bob'); // this is Bob咱们将$a和$b两个变量间接赋值为两个函数。这样咱们就能够应用变量()的模式调用这两个函数了。通过testA()办法,咱们能够看出闭包函数是能够当做一般参数传递的,因为它主动转换成为了 Closure 类的实例。 $age = 16;$c = function ($name) { echo 'this is ' . $name . ', Age is ' . $age;};$c('Charles'); // this is Charles, Age is$c = function ($name) use ($age) { echo 'this is ' . $name . ', Age is ' . $age;};$c('Charles'); // this is Charles, Age is 16如果咱们须要调用内部的变量,须要应用use关键字来援用内部的变量。这一点和一般函数不一样,因为闭包有着严格的作用域问题。对于全局变量来说,咱们能够应用use,也能够应用global。然而对于局部变量(函数中的变量)时,只能应用use。这一点咱们前面再说。 ...

January 18, 2021 · 3 min · jiezi

关于php:redis不小心清空了数据库flushall只能跑路吗

前言前段时间这个新闻在行业内闹的满城风雨 一名程序员因为对公司不满,删除了公司的数据库,起初被判7年,这也给咱们程序员敲响了一记警钟,无论产生什么,这种做法都是十分不得当的,不光是职业道德的问题,而且还会收到法律的制裁。然而咱们都晓得redis中有一个叫flushall的命令,如果不小心在线上执行了会怎么办呢? tips:本文仅仅作为实践解说,如果要尝试请在本地环境尝试,若在线上执行之后导致数据无奈复原,后果自负!!! 复原数据思路大家都晓得redis和memcache都作为缓存应用,redis有一点最大的不同在于数据能够长久化,redis的长久化是基于aof和rdb日志来进行长久化的,所以在复原数据的时候咱们能够思考用日志来复原rdb日志都是二进制文件,也是不可读的,在这方面可能做不了太多事件,然而aof文件都是可读性很好的文件,而且外面记录了每一条命令(当然也记录了那一条flushall命令),所以咱们能够用aof日志来复原整个redis数据然而大家留神 aof日志是有重写机制的,而且有肯定的触发条件(如下),万一输出了flushall之后触发了重写机制,那么所有数据都会失落,而正式环境redis数据是始终在写入的,数据量是始终在变大的,随时都有触发重写条件的可能,所以得立刻关机,如果正好在你执行flushall的下一秒 触发了aof重写机制,那么数据就永远无奈复原了。auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小,增长率100%时,重写auto-aof-rewrite-min-size 64mb #aof文件,至多超过64M时,重写复原数据步骤shutdown nosave关上对应的aof文件 appendonly.aof ,找到flushall对应的命令记录*120839 $820840 flushall而后删除,保留 从新关上redis即可倡议以上说的办法只是实践,并且我在本地尝试过是可行的,线上环境状况要简单的多,保险起见,最好间接把flushall这种命令禁止掉,间接加在reids.conf中 rename-command FLUSHALL ""rename-command FLUSHDB ""rename-command KEYS ""

January 17, 2021 · 1 min · jiezi

关于php:iframe无刷新提交表单iframe仿ajax提交表单

本文摘要应用ajax能够实现无刷新提交表单,但有人示意ajax的效率不行,或者是其余毛病,例如客户端臃肿,太多客户段代码造成开发上的老本,如果网速慢,则会呈现ajax申请迟缓,页面空白的状况,对客户的体验不好。ajax申请不利于搜索引擎优化,个别搜不到ajax增加到页面的信息。 这次就介绍一下iframe仿造ajax异步申请,实际上iframe是同步申请,只是把提交的跳转,产生在iframe的可视区域内。 代码index.html <!DOCTYPE html><html><head> <title>iframe提交表单</title> <meta charset="utf-8"> <style type="text/css"> #result{ border: none; /*去掉默认的边框*/ width: 300px; /*可视区域的宽度*/ height: 60px; /*可视区域的高度*/ } </style></head><body><!-- 表单 --><h1>iframe提交表单</h1><form action="check.php" method="post" target='result'> <input type="text" class="input_css" name="user" placeholder="请输出账号"><br/> <input type="password" class="input_css" name="pwd" placeholder="请输出明码"><br/> <input type="submit" class="formbtn" value="登陆"><br/></form><!-- 用于查看提交后果 --><iframe name='result' id="result" scrolling="no"></iframe></body></html>check.php <style type="text/css">*{ margin:0; padding:0;}</style><?php// 设置编码header("Content-type:text/html;charset=utf-8");// 取得POST过去的登陆所需参数$user = $_POST["user"];$pwd = $_POST["pwd"];// 过滤参数if ($user == '' && $pwd == '') { echo "<p style='color:#f00;font-size:15px;margin-top:10px;'>账号和明码不得为空</p>";}else if ($user == '' ) { echo "<p style='color:#f00;font-size:15px;margin-top:10px;'>账号不得为空</p>";}else if ($pwd == '' ) { echo "<p style='color:#f00;font-size:15px;margin-top:10px;'>明码不得为空</p>";}else{ echo "<p style='color:#000;font-size:15px;margin-top:10px;'>你提交的账号是:".$user."<br/>你提交的明码是:".$pwd."</p>";}?> 动图演示 在线演示http://www.likeyunba.com/demo... 本文作者Author:TANKINGDate:2021-01-13Wechat:sansure2016Web:http://www.likeyun.cn/Qrcode:Join in ...

January 16, 2021 · 1 min · jiezi

关于php:注意PHP中字符串与数字的比较

在日常开发过程中,==运算符是咱们每天都会接触到的。这个运算符中其实埋了十分多的坑,明天咱们就来看下字符串和数字用==比拟须要留神的问题。 首先来看看这些代码: echo '"1234" == " 1234" is ' . ('1234' == ' 1234'), PHP_EOL;echo '"1234" == "\n1234" is ' . ('1234' == "\n1234"), PHP_EOL;echo '"1234" == "1234" is ' . ('1234' == '1234'), PHP_EOL;echo '"1234" == "1234 " is ' . ('1234' == '1234 '), PHP_EOL;echo '"1234" == "1234\n" is ' . ('1234' == "1234\n"), PHP_EOL;都是字符串的==操作,它们的后果会是什么呢? "1234" == " 1234" is 1"1234" == "\n1234" is 1"1234" == "1234" is 1"1234" == "1234 " is "1234" == "1234\n" is 没错,空格或者制表符号在前的会疏忽掉这些符号,也就是说,这些字符串在比照的时候进行了类型转换,都被强转成了int型。而特殊字符在后的,则会依照字符串类型进行比对,那么,纯字符类型呢? ...

January 16, 2021 · 1 min · jiezi

关于php:Spring-Ioc-实例化-Bean-对象有几种方式

Spring 实例化 bean 的形式结构器的形式动态工厂形式实例化工厂形式案例实操结构器的形式实例化 bean 对象<bean id="hello" name="hello" class="com.xxx.demo.Hello"></bean> 通过默认结构器创立 空构造方法必须存在 否则创立失败 动态工厂模式特点: 要有该工厂类及工厂办法 工厂办法是动态的 StaticFactory 动态工厂 /** 动态工厂模式* */public class StaticFactory { public static GoodsService createGoodsService() {//办法肯定要是一个静态方法 return new GoodsService(); }} GoodsService实体类 public class GoodsService { public void getGoodsInfo() { System.out.println("外星人贼便宜"); }} Bean配置 <bean id="goodsService" class="com.xxx.demo.StaticFactory" factory-method="createGoodsService"></bean> 当咱们指定Spring应用动态工厂办法来创立Bean实例时,Spring将先解析配置文件,并依据配置文件指定的信息,通过反射调用动态工厂类的动态工厂办法,并将该动态工厂办法的返回值作为Bean实例,在这个过程中,Spring不再负责创立Bean实例,Bean实例是由用户提供的动态工厂办法提供的。 实例化工厂形式创立 Bean相比拟动态工厂实现 1、工厂办法为非静态方法 2、须要配置工厂bean,并在业务bean中配置factory-bean,factory-method属性 实例化工厂定义 /** 实例化工厂@author Best Liu* */public class InstanceFactory { public OrderService createOrderService() { return new OrderService(); }} 实体类定义 public class OrderService { public void getOrderInfo() { System.out.println("亲,曾经下单实现,然而想发货没门"); }} ...

January 15, 2021 · 1 min · jiezi

关于php:composer-升级版本-遇到如下信息

D:phpstudy_proWWW>composer selfupdateUpdating to version 2.0.8 (stable channel). Downloading (100%)Failed to decode response: zlib_decode(): data errorRetrying with degraded mode, check https://getcomposer.org/doc/a... for more info 起因:网络问题。 解决办法**composer页提供了一个degraded模式的解决办法。如果咱们开启了ipv6则须要将IPv6勾销勾选。

January 15, 2021 · 1 min · jiezi

关于php:phpRedis实现的布隆过滤器

因为Redis实现了setbit和getbit操作,人造适宜实现布隆过滤器,redis也有布隆过滤器插件。这里应用php+redis实现布隆过滤器。 首先定义一个hash函数汇合类,这些hash函数不肯定都用到,实际上32位hash值的用3个就能够了,具体的数量能够依据你的位序列总量和你须要存入的量决定,下面曾经给出最佳值。 class BloomFilterHash{ /** * 由Justin Sobel编写的按位散列函数 */ public function JSHash($string, $len = null) { $hash = 1315423911; $len || $len = strlen($string); for ($i=0; $i<$len; $i++) { $hash ^= (($hash << 5) + ord($string[$i]) + ($hash >> 2)); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * 该哈希算法基于AT&T贝尔实验室的Peter J. Weinberger的工作。 * Aho Sethi和Ulman编写的“编译器(原理,技术和工具)”一书倡议应用采纳此特定算法中的散列办法的散列函数。 */ public function PJWHash($string, $len = null) { $bitsInUnsignedInt = 4 * 8; //(unsigned int)(sizeof(unsigned int)* 8); $threeQuarters = ($bitsInUnsignedInt * 3) / 4; $oneEighth = $bitsInUnsignedInt / 8; $highBits = 0xFFFFFFFF << (int) ($bitsInUnsignedInt - $oneEighth); $hash = 0; $test = 0; $len || $len = strlen($string); for($i=0; $i<$len; $i++) { $hash = ($hash << (int) ($oneEighth)) + ord($string[$i]); } $test = $hash & $highBits; if ($test != 0) { $hash = (($hash ^ ($test >> (int)($threeQuarters))) & (~$highBits)); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * 相似于PJW Hash性能,但针对32位处理器进行了调整。它是基于UNIX的零碎上的widley应用哈希函数。 */ public function ELFHash($string, $len = null) { $hash = 0; $len || $len = strlen($string); for ($i=0; $i<$len; $i++) { $hash = ($hash << 4) + ord($string[$i]); $x = $hash & 0xF0000000; if ($x != 0) { $hash ^= ($x >> 24); } $hash &= ~$x; } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * 这个哈希函数来自Brian Kernighan和Dennis Ritchie的书“The C Programming Language”。 * 它是一个简略的哈希函数,应用一组奇怪的可能种子,它们都形成了31 .... 31 ... 31等模式,它仿佛与DJB哈希函数十分类似。 */ public function BKDRHash($string, $len = null) { $seed = 131; # 31 131 1313 13131 131313 etc.. $hash = 0; $len || $len = strlen($string); for ($i=0; $i<$len; $i++) { $hash = (int) (($hash * $seed) + ord($string[$i])); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * 这是在开源SDBM我的项目中应用的首选算法。 * 哈希函数仿佛对许多不同的数据集具备良好的总体散布。它仿佛实用于数据集中元素的MSB存在高差别的状况。 */ public function SDBMHash($string, $len = null) { $hash = 0; $len || $len = strlen($string); for ($i=0; $i<$len; $i++) { $hash = (int) (ord($string[$i]) + ($hash << 6) + ($hash << 16) - $hash); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * 由Daniel J. Bernstein传授制作的算法,首先在usenet新闻组comp.lang.c上向世界展现。 * 它是有史以来公布的最无效的哈希函数之一。 */ public function DJBHash($string, $len = null) { $hash = 5381; $len || $len = strlen($string); for ($i=0; $i<$len; $i++) { $hash = (int) (($hash << 5) + $hash) + ord($string[$i]); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * Donald E. Knuth在“计算机编程艺术第3卷”中提出的算法,主题是排序和搜寻第6.4章。 */ public function DEKHash($string, $len = null) { $len || $len = strlen($string); $hash = $len; for ($i=0; $i<$len; $i++) { $hash = (($hash << 5) ^ ($hash >> 27)) ^ ord($string[$i]); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; } /** * 参考 http://www.isthe.com/chongo/tech/comp/fnv/ */ public function FNVHash($string, $len = null) { $prime = 16777619; //32位的prime 2^24 + 2^8 + 0x93 = 16777619 $hash = 2166136261; //32位的offset $len || $len = strlen($string); for ($i=0; $i<$len; $i++) { $hash = (int) ($hash * $prime) % 0xFFFFFFFF; $hash ^= ord($string[$i]); } return ($hash % 0xFFFFFFFF) & 0xFFFFFFFF; }}接着就是连贯redis来进行操作 ...

January 15, 2021 · 3 min · jiezi

关于php:关于PHP数组Key的强制类型转换

PHP是弱类型语言,就像JavaScript一样,在定义变量时,不须要强制指定变量的类型。同时,PHP又有着弱小的数组性能,数组的Key即能够是一般的数字类型下标,也能够是字符串类型的Hash键值,那么,当一个数组的Key同时领有字符串和数字时,会产生什么状况呢? 首先来看上面这样一段代码: $arr = [ "1" => "a", "01" => "b", 1 => "aa", 1.1 => "aaa", "0.1" => "bb",];var_dump($arr);// array(3) {// [1] =>// string(3) "aaa"// '01' =>// string(1) "b"// '0.1' =>// string(2) "bb"// }咦?咱们定义的"1"、1下标的值都变成了1.1的"aaa"了? 没错,PHP中的数组Key值只承受数字和字符串类型,当Key是字符串时,会强强制转换为数字类型,恪守类型强制转换的规定。浮点数也是同样的情理,间接转换成了向下取整的整型。 那么"0.1"和"01"为什么还在?首先,"01"不是规范的十进制数值,无奈转换成整型,所以"01"还是一个字符串下标,那"0.1"呢?它当然也不是一个规范的十进制数值。这里是违反了字符串转型数字的强制类型转换准则的,在变量的强制转换中,这两种字符串都会被转换为0,但在数组中则不会,这里会是一个坑,也是须要留神的中央。 在PHP官网文档中给出的Key值转换阐明如下: 蕴含有非法整型值的字符串会被转换为整型。例如键名 "8" 理论会被贮存为 8。然而 "08" 则不会强制转换,因为其不是一个非法的十进制数值。浮点数也会被转换为整型,意味着其小数局部会被舍去。例如键名 8.7 理论会被贮存为 8。布尔值也会被转换成整型。即键名 true 理论会被贮存为 1 而键名 false 会被贮存为 0。Null 会被转换为空字符串,即键名 null 理论会被贮存为 ""。数组和对象不能被用为键名。保持这么做会导致正告:Illegal offset type。接下来,是笔者已经做过的一道面试题,和这个类型转换有着十分大的关系,代码如下: $a = ['a'];$a[2] = 'b';$a[] = 'c';$a['1'] = 'd';// 以下循环的输入后果是?foreach ($a as $v) { echo $v, ',';}// 以下循环的输入后果是?for ($i = 0; $i < count($a); ++$i) { echo $a[$i], ' ,';}大家先不要运行,间接看代码看看能不能看出这两段代码的输入后果会是什么,而后运行一下,看看后果和你想像的是不是一样。 ...

January 15, 2021 · 1 min · jiezi

关于php:技术普及帖你刚才在淘宝上买了一件东西

这篇文章曾经比拟老了,大略公布于2012年以前。偶然读到这篇文章,感觉很不错,想找到原文珍藏一下,然而原文曾经找不到了,只晓得作者是阿里员工卡特。网络中很多转载版本排版切实难看,遂本人写一篇精心排版的版本。你发现快要过年了,于是想给你的女朋友买一件毛衣,你关上了www.taobao.com,这时你的浏览器首先查问DNS服务器,将www.taobao.com转换成IP地址。不过你首先会发现,在不同的地区或者不同的网络(电信、联通、挪动)下,转换后的IP地址很可能是不一样的,这首先波及负载平衡的第一步,通过DNS解析域名时,将你的拜访调配到不同的入口,同时尽可能保障你所拜访的入口是所有入口中可能较快的一个(这和后文的CDN不一样)。 你通过这个入口胜利地拜访了www.taobao.com理论的入口IP地址,这时产生了一个PV(Page View,页面访问量。每日每个网站的总PV量是形容一个网站规模的重要指标。淘宝网全网在素日(非促销期间)的PV大略是16~25亿个之间)。同时作为一个独立的用户,你这次拜访淘宝网的所有页面均算作一个UV(Unique Visitor,用户拜访)。最近臭名远扬的12306.cn的日PV量最高峰在10亿个左右,而UV量却远小于淘宝网十余倍,这其中的起因置信大家都晓得。 因为同一时刻拜访www.taobao.com的人数过于微小,所以,即使是生成淘宝首页页面的服务器,也不可能仅有一台,仅用于生成www.taobao.com首页的服务器就可能有成千盈百台,那么你的一次拜访时生成页面给你看的工作便会被调配给其中一台服务器实现。这个过程要保障公正、偏心、均匀(即这成千盈百台服务器每台累赘的用户数要差不多),这一很简单的过程由几个零碎配合实现,其中最要害的便是LVS(Linux Virtual Server,世界上最风行的负载平衡零碎之一,是由目前在淘宝网供职的章文嵩博士开发的)。 通过一系列简单的逻辑运算和数据处理,这次用于给你看的淘宝网首页的HTML内容便胜利生成了。对Web前端略微有点常识的人都应该晓得,浏览器下一步会加载页面中用到的CSS、JS (JavaScript)、图片等款式、脚本和资源文件。然而可能绝对较少的人才会晓得,你的浏览器在同一个域名下并发加载的资源数量是无限的,例如IE 6和IE 7是两个,IE 8是6个,chrome各版本不大一样,个别是4~6个。我刚刚看了一下,我拜访淘宝网首页须要加载126个资源,那么如此小的并发连接数天然会加载很久。所以前端开发人员往往会将上述这些资源文件散布在多个域名下,变相地绕过浏览器的这个限度,同时也为下文的CDN工作做筹备。 据不可靠消息称,在2011年“双十一”当天顶峰,淘宝的拜访流量最巅峰达到871GB/s,这个数字意味着须要178万个4MB/s的家庭宽带能力负担得起,也齐全有能力拖垮一个中小城市的全副互联网带宽。显然,这些拜访流量不可能集中在一起,并且大家都晓得,不同地区、不同网络(电信、联通等)之间互访会十分迟缓,然而你却很少发现淘宝网拜访迟缓,这便是CDN (Content Delivery Network,即内容散发网络的作用)。淘宝在全国各地建设了数十个甚至上百个CDN节点,利用一些伎俩保障你拜访的(这里次要指JS、CSS、图片等)站点是离你最近的CDN节点,这样便保障了大流量的扩散以及在各地拜访的减速。 这便呈现了一个问题,那就是假若一个卖家公布了一个新的宝贝,上传了几张新的宝贝图片,那么淘宝网如何保障全国各地的CDN节点中都会同步存在这几张图片供用户应用呢?这就波及大量的内容散发与同步的相干技术。另外,淘宝上领有海量的宝贝图片等动态文件,这些文件的总容量也达到了数PB (1PB=1024TB=1048576GB),为了疾速存取这些文件,淘宝开发了分布式文件系统TFS(TaoBao File System)来解决这类问题。 好了,这时你终于加载实现淘宝首页,而后习惯性地在首页搜寻框中输出“毛衣”二字并按回车键,这时你又产生了一个PV,而后,淘宝网的主搜寻零碎便开始为你服务,它首先对你输出的内容基于一个分词库进行分词操作。家喻户晓,英文是以词为单位的,词和词之间靠空格隔开,而中文是以字为单位,句子中所有的字连起来能力形容一个意思。例如,英文句子“I am a student”用中文示意,则为 “我是一个学生”。计算机能够很简略地通过空格晓得 student 是一个单词,然而不太容易明确“学”、“生”两个字合起来才示意一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。“我是一个学生” 分词的后果是 “我” “是” “一个” “学生”。 进行分词操作之后,还须要依据你输出的搜索词进行购物用意剖析。用户进行搜寻时经常有如下几类用意。 浏览型:没有明确的购物对象和用意,边看边买,用户比拟随便和理性。Query例如:“2010年10大香水排行”、“2010年风行毛衣”、“zippo有多少品种?”;查问型:有肯定的购物用意,体现在对属性的要求上。Query例如:“适宜老人用的手机”、“500元手表”;比照型:曾经放大了购物用意,具体到某几个产品。Query例如:“诺基亚E71 E63”、“akg k450 px200”;确定型:曾经做了根本决定,重点考查某个对象。Query例如:“诺基亚N97”、“IBM T60”通过对你的购物用意的剖析,主搜寻会呈现出齐全不同的后果。 之后的数个步骤后,主搜寻零碎便根据上述以及更多简单的条件列出了搜寻后果,这所有是由一千多台搜寻服务器实现的。而后你开始逐个点击浏览搜寻出的宝贝,查看宝贝详情页面。常常网购的亲们会发现,当你买过一个宝贝之后,即使是商家屡次批改了宝贝详情页,你依然可能通过“已买到的宝贝”查看过后的快照。这是为了避免商家对在商品详情中承诺过的货色赖账不认。显然,对于每年数十亿甚至上百亿笔交易的商品详情快照进行保留和疾速调用不是一件简略的事件。这其中又波及数套零碎的独特合作,其中较为重要的是Tair(淘宝自行研发的分布式KV存储计划)。 接下来,无论你是否真的进行了交易,你的这些拜访行为都会如实地被零碎记录下来,用于后续的业务逻辑和数据分析。这些记录中的拜访日志记录便是最重要的记录之一,然而从后面咱们得悉,这些拜访是散布在各个地区多个不同的服务器上的,并且因为用户泛滥,这些日志记录都十分宏大,达到TB级别也十分失常。那么,为了疾速、及时、同步地传输这些日志数据,淘宝研发了 TimeTunnel,用于进行实时的数据传输,而后交给后端系统进行计算报表等操作。 你的浏览数据、交易数据以及其余很多数据记录均会被保留下来,使得淘宝存储的历史数据轻而易举地便达到了数十甚至更多个PB。如此微小的数据量存储在阿里巴巴团体的数据仓库中,并且其中有些数据应用了压缩比高达 1:120 的极限存储技术。之后这些数据会通过一个叫做云梯的基于Hadoop的由3000多台服务器组成的超大规模数据系统,以及一个基于阿里巴巴团体自主研发的ODPS零碎的数据系统,一直地进行剖析和开掘。 淘宝从这些数据中可能晓得小到你是谁,你喜爱什么,你的孩子几岁了,你是否在谈恋爱,喜爱玩魔兽世界的人喜爱什么样的饮料等,大到各行各业的批发状况、各类商品的兴衰沦亡等海量的信息。 说了这么多,其实也只是叙述了淘宝上正在运行的成千上万个零碎中的寥寥几个。即使是你仅仅拜访一次淘宝的首页,所波及的技术和零碎规模都是你齐全无奈设想的,是淘宝2000多名顶级的工程师们的心血结晶,其中甚至包含长江学者、国家科学技术最高奖得主等泛滥牛人。同样,百度、腾讯等的业务零碎也绝不比淘宝简略。你须要晓得的是,你每天应用的互联网产品看似简略易用,背地却凝聚着难以想象的智慧与劳动。 (本文所波及的技术与数据均来源于互联网)

January 14, 2021 · 1 min · jiezi

关于php:PHPMQTT-v114-版本发布MQTT-协议解析-协程客户端

在 v1.1.4 版本中,优化了重连的逻辑,减少了reconnect_delay配置参数,让用户本人设置重连的延时工夫。 之前的版本为固定的3s,当初默认值为3s,能够自行设置 use Simps\MQTT\Client;use Swoole\Coroutine;Coroutine\run(function () { $config = [ 'host' => '127.0.0.1', 'port' => 1883, 'user_name' => '', 'password' => '', 'client_id' => \Simps\MQTT\Client::genClientID(), 'keep_alive' => 10, 'reconnect_delay' => 5, ]; $swooleConfig = [ 'open_mqtt_protocol' => true, 'package_max_length' => 2 * 1024 * 1024, 'connect_timeout' => 1.0, ]; $client = new Client($config, $swooleConfig);});优化了 connect 和 publish 的逻辑,减少了一些限度: 在 MQTT 的协定中是不反对 QoS 大于 3 的,MQTT5 中会返回相应的错误码0x9B示意不反对的 QoS,然而在 MQTT3 中就没有对应响应,通过抓包会发现其实是始终在重连的include __DIR__ . '/examples/bootstrap.php';use Simps\MQTT\Client;use Swoole\Coroutine;Coroutine\run(function () { $client = new Client(getTestConnectConfig(false), SWOOLE_MQTT_CONFIG); $will = [ 'topic' => 'simps-mqtt/user001/update', 'qos' => 3, 'message' => 'byebye', ]; $res = $client->connect(false, $will); var_dump($res);});所以间接限度在 MQTT3 设置大于 QoS2 的等级 ...

January 14, 2021 · 1 min · jiezi

关于php:数组便利功能-持续更新

1,对多位数组中的某个值 进行排序array_multisort(array_column($merchant_list,'rate'),SORT_DESC,$merchant_list);//$merchant_list 要被排序的数组//rate 排序的值//SORT_ASC - 默认。按升序排列 (A-Z)。//SORT_DESC - 按降序排列 (Z-A)。2,二维数组去掉反复值//二维数组去掉反复值function array_unique_fb($array2D){ foreach ($array2D as $v){ $v=join(',',$v); //降维,也能够用implode,将一维数组转换为用逗号连贯的字符串 $temp[]=$v; } $temp=array_unique($temp); //去掉反复的字符串,也就是反复的一维数组 foreach ($temp as $k => $v){ $temp[$k]=explode(',',$v); //再将拆开的数组从新组装 } return $temp;}3, 多维数组 转换为一维数组$result = [];array_walk_recursive($users(要转换的数组), function($value) use (&$result) { array_push($result, $value);});

January 14, 2021 · 1 min · jiezi

关于php:PHP多维数组排序用arraymultisort函数对数组按指定字段排序

PHP中有一些函数能够用来对数组进行排序。 sort() - 对数组进行升序排列rsort() - 对数组进行降序排列asort() - 依据关联数组的值,对数组进行升序排列ksort() - 依据关联数组的键,对数组进行升序排列arsort() - 依据关联数组的值,对数组进行降序排列krsort() - 依据关联数组的键,对数组进行降序排列例如: $arr=['green','car','apple','book']; sort($arr); var_dump($arr);能够失去排序后果: array (size=4) 0 => string 'apple' (length=5) 1 => string 'book' (length=4) 2 => string 'car' (length=3) 3 => string 'green' (length=5)然而对一个有多个字段的数组,要怎么依照指定的字段排序呢?比方上面这个数组: $arr=[ [ 'age'=>50, 'name'=>'张三' ], [ 'age'=>18, 'name'=>'李四' ], [ 'age'=>27, 'name'=>'王五' ] ];咱们怎么依照age或name排序呢?咱们能够应用array_multisort这个函数来进行按指定字段排序。 array_multisort(array_column($arr,'age'),SORT_ASC,$arr);var_dump($arr);打印后果 array (size=3) 0 => array (size=2) 'age' => int 18 'name' => string '李四' (length=6) 1 => array (size=2) 'age' => int 27 'name' => string '王五' (length=6) 2 => array (size=2) 'age' => int 50 'name' => string '张三' (length=6)这样就排好了,也就是说用array_multisort这个函数排序时,用array_column排数组指定的列提取进去放第一个参数,排序常量放第二个参数,数组放到第三个参数,就能够按指定的字段进行排序了。SORT_ASC 是升序,SORT_DESC 是降序。以上就是按字段进行排序的办法,谢谢各位。 ...

January 14, 2021 · 1 min · jiezi

关于php:优雅地创建未定义类PHP对象

在PHP中,如果没有当时筹备好类,须要创立一个未定义类的对象,咱们能够采纳上面三种形式: new stdClass()new class{}(object)[]首先是stdClass,这个类是一个空的类模板,是PHP的外部保留关键字及类名。能够把它相像成是Java中的Object基类,在Java中,所有类都人造继承自Object基类。而PHP中的这个stdClass则是齐全的一个空的类模板。你本人新创建的类并不是它的子类。然而用这个类模板能够创立一个本人未定义类的对象。当然,这个对象外部没有任何货色。 $a = new stdClass();var_dump($a); new class{}呢?做过一段时间开发,接触过前端js和其余动静语言的应该能猜到,这个是匿名类。个别在参数对象中很常见。它创立进去的对象是能够带属性办法的。 $b = new class{ public $p = 1;};var_dump($b); 最初咱们来看到的是应用数组强转成对象的模式来生成一个对象。 $c = (object)[ 'p' => 1];var_dump($c); 很显著,数组强转的模式生成的对象和第一种对象是一个类型的,而且它能够带属性也能够不带。然而,它不能带办法。 数组强转形式生成的对象十分的直观好了解。如果只是属性对象的封装,应用这种形式会更加地优雅难受。简单的对象生成能够应用匿名类的形式进行生成。而一些仅须要占位的对象,能够应用stdClass的办法,当然用空数组的形式也很不便。 须要留神的是,数组强转须要恪守类型转换的规定。比方数字下标的问题。 在日常开发中,咱们对于一些接口或者数据库ORM框架的应用中会常常用这些性能。比方一些ORM框架的插入、批改须要传入的是只蕴含属性的对象。这时候就能够应用上述的办法灵便地生成对象而不必残缺的定义类模板了。 测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/201910/source/%E4%BC%98%E9%9B%85%E5%9C%B0%E5%88%9B%E5%BB%BA%E6%9C%AA%E5%AE%9A%E4%B9%89PHP%E5%AF%B9%E8%B1%A1.php 参考资料: https://www.php.net/manual/zh/language.types.object.php#117149

January 14, 2021 · 1 min · jiezi

关于php:PHPJavaPythonCC-这几种编程语言都各有什么优点或特点

PHP、Java、Python、C、C++ 这几种编程语言都各有什么长处或特点?序 —— 一些问题 程序设计语言的目标是什么?为什么大多数语言有控制流?逐行执行+跳转。这与咱们的需要差很远(例如一个教务管理系统、一个主动打车APP)为什么类型申明在C语言中要与控制流隔离开来?当初支流语言最根本的元素是?有没有语言它的类型构造,在运行时也能够扭转?动态性?什么是动态性? 编译后确定了什么信息,之后不再扭转;运行时能够扭转、增加什么;运行时是否保留着类型信息。程序中的信息分为几类?数据信息a) 编译时Meta-Data元数据(类型框架、空间占用)b) 运行时Meta-Data元数据(继承体系、用于new或者反射)(特地区别编译与运行的Meta-Data的不同。)c) 堆栈段中地址偏移(C++的switch case中不能申明变量、共享内存)d) 动态段中地址指令信息a) 代码段(动态性须要操作系统或者虚拟机反对,例如动态链接库,动静类加载,lisp语言自生成代码)语言举例 汇编语言 汇编语言没有动态性吗?没有。首先,寄存器、数据段、堆栈、代码段齐全由程序员管制。完完全全是写死了的。而后,依据冯诺伊曼机的规定;取指令,执行,取指令,执行…… 既然都有数据段了,还要堆栈段来做什么?这不是多余? 一开始本没有堆栈,直到60年代呈现了module模块化,才有了堆栈。汇编中的模块叫子程序,不过仍旧靠程序员全权管制。 举荐观看:笨办法学Python!编程小白的第一本Python入门书!

January 13, 2021 · 1 min · jiezi

关于php:了解PHPFPM

在服务器上,当咱们查看php过程时,全都是php-fpm过程,大家都晓得这个就是php的运行环境,那么,它到底是个什么货色呢? PHP-FPM简介PHP-FPM,就是PHP的FastCGI管理器,用于替换PHP FastCGI的大部分附加性能,在PHP5.3.3后曾经成为了PHP的标配。 有小伙伴要问了,FastCGI又是什么鬼?CGI程序又叫做“通用网关接口”,就是让Web服务器和你的应用程序进行交互的一个接口。就像nginx中须要配置的fastcgi_pass,个别咱们会应用127.0.0.1:9000或者unix:/tmp/php-cgi.sock来配置这个参数。它的意思就是通知nginx,过去的申请应用tcp:9000端口的监听程序来解决或者应用unix/socket来解决。它们都是指向的PHP运行程序。 再说得艰深一点,咱们运行php脚本用的是 php aaa.php php-fpm就相当于是这个php命令。nginx通过fastcgi_pass来运行php $nginx_root(nginx配置文件中网站根目录root配置)下的index.php。所以,如果你用的是python或者其余什么语言,都能够用它们的cgi程序来让nginx调用。 FastCGI和CGI又有什么不同呢?FastCGI是启动一个socket接口,服务器利用不须要本人去运行php,只须要向这个socket接口提交申请就能够了。 php-fpm在编译php时须要增加--enable-fpm。一些通用的集成安装包如lnmp、phpStudy等都会默认编译并应用php-fpm,毕竟是标配。 tcp socket与unix socket上文中说过nginx能够应用127.0.0.1:9000和unix:/tmp/php-cgi.sock这两种形式来调用php-fpm。它们有什么区别呢? 前者,个别带9000端口号的,是tcp模式的调用。也就是php-fpm启动了一个监听过程对9000端口进行监听。它会调起一个tcp/ip服务,nginx在调用的时候会走一次tcp申请流程,也就是3次握手4次挥手,会走到网络七层中的第四层传输层。相对来说这种形式性能会稍差一点,启动php-fpm后应用nestat查看端口中会呈现9000端口的占用。 后者,应用的是unix套接字socket服务,通过sock文件来替换信息,性能绝对好一些,因为它没有tcp连贯过程,也不会有9000端口的占用。 对于高负载大访问量的网站还是举荐应用unix形式,对于一般小网站来说,无所谓应用哪个都能够,tcp形式反而更容易配置和了解,也是php-fpm.conf中默认的监听形式。 php-fpm.conf配置中的listen属性用来配置监听,这里的配置要和nginx中的统一,应用tcp的就监听127.0.0.1:9000,应用unix的就设置成/tmp/php-cgi-56.sock。 PHP-FPM的性能以下内容摘自官网文档: 反对平滑进行/启动的高级过程治理性能能够工作于不同的 uid/gid/chroot 环境下,并监听不同的端口和应用不同的 php.ini 配置文件(可取代 safe_mode 的设置)stdout 和 stderr 日志记录在发生意外状况的时候可能重新启动并缓存被毁坏的 opcode文件上传优化反对"慢日志" - 记录脚本(不仅记录文件名,还记录 PHP backtrace 信息,能够应用 ptrace或者相似工具读取和剖析近程过程的运行数据)运行所导致的异样迟缓;fastcgi_finish_request() - 非凡性能:用于在申请实现和刷新数据后,持续在后盾执行耗时的工作(录入视频转换、统计解决等)动静/动态子过程产生根本 SAPI 运行状态信息(相似Apache的 mod_status)基于 php.ini 的配置文件本文参考:https://www.php.net/manual/zh/install.fpm.phphttps://www.cnblogs.com/sunlong88/p/9001184.htmlhttps://www.jianshu.com/p/34a20e8dbf10https://blog.csdn.net/erlib/article/details/38488937

January 13, 2021 · 1 min · jiezi

关于php:非常好用的节假日查询接口

概述平时在开发的过程中常常会用到查问节假日的性能,但因为节假日是每年由国务院对立颁布,咱们无奈通过计算获取节假日,所以个别须要咱们手动来保护节假日。网上有很多节假日查问的接口,但查问条件和返回后果并不是太现实, 于是就本人写了个节假日查问接口并提供一个简略的页面。接口提供丰盛的查问参数并且响应的字段能够自在定制。 疾速开始节假日查问的 接口地址 为:https://api.apihubs.cn/holida...间接拜访接口地址会失去以后年份以后月份的整月数据,其中蕴含了具体的节假日信息节假日查问的 示例页面地址 为:http://www.apihubs.cn/#/holiday在示例页面中会依据你抉择的条件动静生成接口地址,而后能够间接点击浏览器中关上接口地址预览接口返回信息 参数节假日查问接口提供了丰盛的查问参数,所有参数都为可选参数,可灵便搭配应用,多个条件之间为&&的关系参数中的日期格局均为PHP中的 日期格局 field 用来指定返回后果蕴含的字段,多个应用英文逗号分隔 枚举year 用来指定要查问的年份,格局为 Y ,多个应用英文逗号分隔month 用来指定要查问的月份,格局为 Ym ,多个应用英文逗号分隔date 用来指定要查问的日期,格局为 Ymd ,多个应用英文逗号分隔yearweek 用来指定要查问一年中的第几周,格局为 oW ,多个应用英文逗号分隔yearday 用来指定要查问一年中的第几天,格局为 z ,多个应用英文逗号分隔holiday 用来指定要查问的节假日,99为全副节假日,多个应用英文逗号分隔 枚举holiday_overtime 用来指定要查问的节假日调休(加班),99为全副调休,多个应用英文逗号分隔 枚举week 用来指定要查问的星期,多个应用英文逗号分隔 枚举workday 用来指定查问是否为工作日(蕴含调休在内须要下班的日子) 枚举weekend 用来指定查问是否为周末(星期六和星期日) 枚举holiday_today 用来指定查问是否为节日当天 枚举holiday_legal 用来指定查问是否为法定节假日(三倍工资)枚举holiday_recess 用来指定查问是否为假期节假日(节日是否放假)枚举lunar 用来指定年份、月份、日期、天数参数是否查问农历日期cn 用来指定返回后果是否蕴含中文后果,默认返回的都是数字日期和枚举数字有利于逻辑判断不利于显示page 分页页码size 分页每页数量响应节假日查问接口的枚举性能是基于 php-enum 实现的对立格局响应节假日查问接口响应始终为JSON数据格式,如下 { "code": "0", "msg": "ok", "data": "" } code 胜利时始终为0,失败时为 枚举值 中的keymsg 胜利时始终为 ok 失败时为 枚举值 中的valuedata 胜利时返回数据,失败时局部返回失败数据,如表单验证失败。

January 13, 2021 · 1 min · jiezi

关于php:Hyperf为什么要关闭Swoole协程短名称

在Hyperf官网文档的服务器要求中提到 Swoole PHP 扩大 >= 4.5,并敞开了 Short Name并且,在文档的常见问题中也会看到Swoole 短名未敞开这一个tag。 我想问了,那为什么hyperf肯定要敞开掉Swoole的协程短名称呢 首先,咱们先看一下什么是Swoole的协程短名称 所有的 Swoole\Coroutine 前缀的类名映射为 Co。此外还有上面的一些映射:创立协程 go() 函数,通道操作 chan() 函数,提早执行 defer() 函数从下面的解释咱们晓得了,hyperf次要就是不想让咱们应用以上这几个函数,然而为啥不让咱们应用的呢?想到之前在代码中常常应用go()函数来解决代码中的阻塞问题,难道说我写的代码并没有协程化?在Hyperf通过测试之后发现,go()函数协程话的确是失效的,那到底是什么让原本曾经被禁用的go()函数又“复活”了呢? 在phpStrom只点击go()函数咱们跳转到了vendor/hyperf/utils/src/Functions.php文件,该文件是在composer.json中指定的自动化加载文件 if (! function_exists('go')) { /** * @return bool|int */ function go(callable $callable) { $id = Coroutine::create($callable); return $id > 0 ? $id : false; }}如果框架里没定义go()函数的话,就会执行这里的逻辑去调用Coroutine::create($callable),留神这里的Coroutine类并不是Swoole\Coroutine,而是vendor/hyperf/utils/src/Coroutine.php public static function create(callable $callable): int { $result = SwooleCoroutine::create(function () use ($callable) { try { call($callable); } catch (Throwable $throwable) { if (ApplicationContext::hasContainer()) { $container = ApplicationContext::getContainer(); if ($container->has(StdoutLoggerInterface::class)) { /* @var LoggerInterface $logger */ $logger = $container->get(StdoutLoggerInterface::class); /* @var FormatterInterface $formatter */ if ($container->has(FormatterInterface::class)) { $formatter = $container->get(FormatterInterface::class); $logger->warning($formatter->format($throwable)); } else { $logger->warning(sprintf('Uncaptured exception[%s] detected in %s::%d.', get_class($throwable), $throwable->getFile(), $throwable->getLine())); } } } } }); return is_int($result) ? $result : -1; }能够看到,咱们“劫持”了go()函数,给他做了一些改变,捕捉了创立协程时抛出的异样,将异样打印到管制台上。(注:对于Coroutine::create形式创立的协程在callable中存在异样时会抛出Fatal error,这是咱们不违心看到的)。 ...

January 12, 2021 · 1 min · jiezi

关于php:Macbook-m1-Big-Sur-安装docker-运行laradock

最新的预览版Docker-Preview7带来了对于M1芯片的反对,记录一下装置过程。 首先到预览发布页面找到下载地址:https://desktop.docker.com/ma... 这个版本目前还存在许多问题,比方不带自动更新,无奈脱离Rosetta 2 运行,尤其是无奈反对mysql镜像,当然咱们能够应用mariadb. 下载实现当前间接关上,点击Docker图标拖放到应用程序文件夹即可实现装置。 装置实现既可关上docker 装置一个laradock试试 $ cd ~$ git clone https://github.com/Laradock/laradock.git$ cd laradock$ git checkout -b v11.0$ cp env-example .env依照本人的习惯批改好配置文件 $ docker-compose up -d nginx通过一段时间 Creating laradock_docker-in-docker_1 ... doneCreating laradock_workspace_1 ... doneCreating laradock_php-fpm_1 ... doneCreating laradock_nginx_1 ... donedocker-compose ps -a Name Command State Ports ----------------------------------------------------------------------------------------------------------------------------laradock_docker-in-docker_1 dockerd-entrypoint.sh Up 2375/tcp, 2376/tcp laradock_nginx_1 /docker-entrypoint.sh /bin ... Up 0.0.0.0:443->443/tcp, 0.0.0.0:80->80/tcp, 0.0.0.0:81->81/tcp laradock_php-fpm_1 docker-php-entrypoint php-fpm Up 9000/tcp laradock_workspace_1 /sbin/my_init Up 0.0.0.0:2222->22/tcp, 0.0.0.0:3000->3000/tcp, 0.0.0.0:3001->3001/tcp, 0.0.0.0:4200->4200/tcp, 0.0.0.0:8001->8000/tcp, 0.0.0.0:8080->8080/tcp 浏览器输出 http://localhost完满运行 ...

January 11, 2021 · 1 min · jiezi

关于php:PHPer需要用的shell常用命令收藏

https://www.jianshu.com/p/983...

January 11, 2021 · 1 min · jiezi

关于php:PHP中的强制类型转换

学过动态语言开发的敌人对类型转换不会生疏,比方Java、C#、C++等。动态语言的益处就是变量强制必须指定类型,这也是编译的要求,所以大部分编译型的语言都会有强制变量类型的要求。而PHP据说也会在PHP8中退出JIT实现编译性能,并且在7.4中就会引入变量申明时的类型指定。上面咱们先看看目前PHP中的参数类型及返回值类型的应用。 function add(int $a, float $b) : int{ return (int) $a + $b;}上述代码中,办法参数中定义了参数的类型,包含一个int类型的$a和一个float类型的$b。而后在办法前面定义了办法的返回值必须是int类型。咱们晓得,如果计算表达式中呈现了float类型,那么计算结果会变成float类型。这个办法须要返回的是一个int类型。因而咱们应用了一个强制类型转换(int)。在定义了参数类型和返回值类型后,如果传递或者返回的类型不统一,就会报错。 参数类型和返回值类型最好在7以上的版本应用。根本类型如int、float等的参数类型申明都是7当前才反对的,详情参见文档:https://www.php.net/manual/zh/functions.arguments.php 咱们通过(int)、(float)、(bool)等就能够实现PHP的类型强制转换,和C基本上一样。文档中对于能够强制转换的包含如下类型: (int), (integer) - 转换为整形 integer(bool), (boolean) - 转换为布尔类型 boolean(float), (double), (real) - 转换为浮点型 float(string) - 转换为字符串 string(array) - 转换为数组 array(object) - 转换为对象 object(unset) - 转换为 NULL (PHP 5)(binary) 转换和 b 前缀转换反对为 PHP 5.2.1 新增(int), (integer)如果是布尔值,转换后果为false变成0,true变成1如果是float,向下取整,如7.99会转换为7如果是字符串,字符串从头开始查找,结尾第一个是数字会间接变成该转换后果,如果结尾没有数字返回0其余类型转换在文档中并没有定义,文档提醒为“没有定义从其它类型转换为整型的行为。不要依赖任何现有的行为,因为它会未加告诉地扭转。”,但咱们通过测试,能够发现对于其余类型的转换是通过屡次的类型转换达成的,比方数组类型转换为int类型,是依据数组是否蕴含内容转换为bool类型后再转换为int类型// (int)(integer)var_dump((int) true); // 1var_dump((int) false); // 0var_dump((int) 7.99); // 7var_dump((int) "35 ok"); // 35var_dump((int) "ok 77"); // 0var_dump((int) "ok yes"); // 0var_dump((int) []); // 0var_dump((int) [3,4,5]); // 1(bool)(boolean)当转换为 boolean 时,以下值被认为是 FALSE: ...

January 11, 2021 · 2 min · jiezi

关于php:C-PHP-Go-指针探究

前沿在我学过的语言中有C语言,PHP,Go。明天咱们来探讨下,在这些语言中指针的用法有什么不同呢? 定义咱们先来看个个语言中指针的模式吧 C语言中 int i = 5;int * p = &i;printf("%p", p);//后果是 0x7ffef3f4ff64PHP中 $c = 5;$b = &$c;echo $b;//后果是 5Go中 var i int = 5;var p *int = &i fmt.Printf("%p", p);//后果是 0xc0000b602021从下面咱们能够看进去,C和Go在指针的定义和调用上基本相同,区别在于Go没有指针运算。 那C和PHP就差距很大了,首先PHP就没有指针的概念,在PHP中次要说的都是援用。援用意味着用不同的名字拜访同一个变量内容,打个比方:它就像一个人有两个不同的名字,它们并不是理论的内存地址 比拟看一段PHP的代码 <?php $a = 1; $b = &$a; echo $a; //1 unset($b); // unset $b echo $a; //1 it's OK在来看看C语言中的代码 #include<stdio.h>int main(){ int a = 1; int *b = &a; printf("%d\n", a); //1 free(b); printf("%d\n", a); // 报错invalid pointer return 0;}从下面就可以看进去,差异还是很大的。 援用和指针并不是雷同的概念,指针是针对实在内存的操作,援用是针对指向这个内存的符号表的操作。从操作系统的快捷方式来说,快捷方式是能够删的,这就是PHP的援用。而C不仅删了快捷方式,还把原文件也给删除了。 ...

January 10, 2021 · 1 min · jiezi

关于php:C-PHP-Go-指针探究

前沿在我学过的语言中有C语言,PHP,Go。明天咱们来探讨下,在这些语言中指针的用法有什么不同呢? 定义咱们先来看个个语言中指针的模式吧 C语言中 int i = 5;int * p = &i;printf("%p", p);//后果是 0x7ffef3f4ff64PHP中 $c = 5;$b = &$c;echo $b;//后果是 5Go中 var i int = 5;var p *int = &i fmt.Printf("%p", p);//后果是 0xc0000b602021从下面咱们能够看进去,C和Go在指针的定义和调用上基本相同,区别在于Go没有指针运算。 那C和PHP就差距很大了,首先PHP就没有指针的概念,在PHP中次要说的都是援用。援用意味着用不同的名字拜访同一个变量内容,打个比方:它就像一个人有两个不同的名字,它们并不是理论的内存地址 比拟看一段PHP的代码 <?php $a = 1; $b = &$a; echo $a; //1 unset($b); // unset $b echo $a; //1 it's OK在来看看C语言中的代码 #include<stdio.h>int main(){ int a = 1; int *b = &a; printf("%d\n", a); //1 free(b); printf("%d\n", a); // 报错invalid pointer return 0;}从下面就可以看进去,差异还是很大的。 援用和指针并不是雷同的概念,指针是针对实在内存的操作,援用是针对指向这个内存的符号表的操作。从操作系统的快捷方式来说,快捷方式是能够删的,这就是PHP的援用。而C不仅删了快捷方式,还把原文件也给删除了。 ...

January 10, 2021 · 1 min · jiezi

关于php:PHP设计模式之状态模式

状态模式从字面上其实并不是很好了解。这里的状态是什么意思呢?保留状态?那不就是备忘录模式了。其实,这里的状态是类的状态,通过扭转类的某个状态,让这个类感觉像是换了一个类一样。说起来有点拗口吧,先学习概念之后再看。 Gof类图及解释GoF定义:容许一个对象在其外部状态扭转时扭转它的行为。对象看起来仿佛批改了它的类 GoF类图 代码实现class Context{ private $state; public function SetState(State $state): void { $this->state = $state; } public function Request(): void { $this->state = $this->state->Handle(); }}一个上下文类,也能够看作是指标类,它的外部有一个状态对象。当调用Request()的时候,去调用状态类的Handle()办法。目标是以后上下文类状态的变动都由内部的这个状态类来进行操纵。 interface State{ public function Handle(): State;}class ConcreteStateA implements State{ public function Handle(): State { echo '以后是A状态', PHP_EOL; return new ConcreteStateB(); }}class ConcreteStateB implements State{ public function Handle(): State { echo '以后是B状态', PHP_EOL; return new ConcreteStateA(); }}形象状态接口及两个具体实现。这两个具体实现实际上是在互相调用。实现的成果就是上下文类每调用一次Request()办法,外部的状态类就变成别一个状态。就像一个开关,在关上与敞开中来回切换一样。 $c = new Context();$stateA = new ConcreteStateA();$c->SetState($stateA);$c->Request();$c->Request();$c->Request();$c->Request();客户端的实现,实例化上下文对象并设置初始的状态,而后通过不停的调用Request()对象来实现开关状态的切换。 ...

January 7, 2021 · 2 min · jiezi

关于php:想白嫖小程序试一试这款php开源框架

NiuCloud 开源小程序利用框架是一个基于 ThinkPHP5 的收费开源框架,适宜麻利开发,插件封装性强,内置集成多种根底利用组件,NiuCloud开源小程序利用框架能够帮忙企业或者集体疾速开发多端口小程序利用而诞生。程序 100% 开源,可自在定制开发,全面反对“互联网+”产品:PC、手机、微信、小程序、APP 与 H5 多网交融, 最重要的是可收费商用。 性能列表微信公众号治理(菜单、音讯素材、粉丝、回复、留言、模板音讯)微信开放平台接口领取接口(微信领取、支付宝领取、银联领取)小程序模板短信接口(短信验证码、短信发送记录、短信告诉)第三方登录接口(微信、QQ)文件素材治理(图片、视频、音频)云存储接口(七牛云、阿里云)微页面、自定义页面、页面组件可视化智能 DIY(页面的小组件反对开发人员定义)邮件接口(邮件验证、邮件告诉)微信小程序配置、打包、公布百度小程序配置、打包、公布支付宝小程序配置、打包、公布拜访数据统计、图表统计会员治理、会员积分、会员余额、会员成长值模型利用模块开发、装载、卸载、HOOK钩子设计 利用模块间高内聚,低耦合框架在线更新、模块在线更新数据库治理界面截图 结尾本期就分享到这里,我是小编南风吹,专一分享好玩乏味、离奇、实用的开源我的项目及开发者工具、学习资源!心愿能与大家独特学习交换,欢送关注我的公众号【Github导航站】。往期举荐太漂亮了!有了3款开源图标库,不必再去求设计师了 10个相见恨晚的vue.js库!用好了,事倍功半! 太及时了!13个Spring Boot练手我的项目,用好了,升职涨薪不必愁 程序员接私活必备后盾框架,不必反复造轮子,网友:太好用了! 还在从头到尾撸我的项目?这6个SpringBoot我的项目用好了,事倍功半! 「00后缩写黑话翻译器」登上GitHub热榜,中年网民终于能看懂年轻人的awsl

January 7, 2021 · 1 min · jiezi

关于php:Swoole-v460-版本发布支持原生-curl-协程客户端

Swoole v4.6.0 版本公布了,同样也是 2021 年的首个版本更新。 作为一个 y 版本公布,此次更新也蕴含了不兼容的批改以及许多的新性能,上面就来看一看都有哪些改变? 向下不兼容改变从 v4.6.0 版本开始将不再反对 PHP7.1PHP 官网对于 PHP7.1 的反对也早已在 2019 年底完结。 将 Event::rshutdown() 标记为已弃用,请改用 Coroutine\run在之前的版本中,如果在index.php中间接应用go创立协程 go(function () { var_dump(Co\System::gethostbyname('www.baidu.com'));});这样是失常的,然而在此版本中,就会收到废除正告 PHP Deprecated: Swoole\Event::rshutdown(): Event::wait() in shutdown function is deprecated in Unknown on line 0举荐应用Coroutine\run来代替这种形式: Swoole\Coroutine\run(function () { var_dump(Co\System::gethostbyname('www.baidu.com'));});Swoole\Coroutine\run(function () { go(function () { var_dump(Co\System::gethostbyname('www.baidu.com')); }); go(function () { var_dump(Co\System::gethostbyname('www.zhihu.com')); });});默认启用 Coroutine hook应用了下面所说的Coroutine\run之后,也会迎来一个新的变更:默认启用 Coroutine hook,即主动设置SWOOLE_HOOK_ALL use Swoole\Runtime;Swoole\Coroutine\run(function () { $flags = Runtime::getHookFlags(); assert($flags === SWOOLE_HOOK_ALL); var_dump($flags);});当然也能够自行设置所须要的 flag ...

January 6, 2021 · 3 min · jiezi

关于php:PHP设计模式之单例模式

单例模式相对是在罕用以及面试常问设计模式中排名首位的。一方面它够简略,喋喋不休就能说明确。另一方面,它又够简单,它的实现不仅仅只有一种模式,而且在Java等异步语言中还要思考多线程加锁的问题。所以在面试时,千万不要认为面试官出单例模式的问题就放松了,这个模式真的是可深可浅,也极其能体现一个开发者的程度。因为只有工作过一段时间,不可避免的就会接触到这个模式。 Gof类图及解释GoF定义:保障一个类仅有一个实例,并提供一个拜访它的全局拜访点。 GoF类图 代码实现class Singleton{ private static $uniqueInstance; private $singletonData = '单例类外部数据'; private function __construct() { // 构造方法私有化,内部不能间接实例化这个类 } public static function GetInstance() { if (self::$uniqueInstance == null) { self::$uniqueInstance = new Singleton(); } return self::$uniqueInstance; } public function SingletonOperation(){ $this->singletonData = '批改单例类外部数据'; } public function GetSigletonData() { return $this->singletonData; }}没错,外围就是这样一个单例类,没别的了。让动态变量保留实例化后的本人。当须要这个对象的时候,调用GetInstance()办法取得全局惟一的一个对象。 $singletonA = Singleton::GetInstance();echo $singletonA->GetSigletonData(), PHP_EOL;$singletonB = Singleton::GetInstance();if ($singletonA === $singletonB) { echo '雷同的对象', PHP_EOL;}$singletonA->SingletonOperation(); // 这里批改的是Aecho $singletonB->GetSigletonData(), PHP_EOL;客户端的调用,咱们会发现$singletonA和$singletonB是齐全一样的对象。 ...

January 6, 2021 · 1 min · jiezi

关于php:composer-进阶命令

composer dumpautoload当更新了我的项目composer autoloader后。不要应用composer update去加载索引(update会更新整个我的项目),应用dumpautoload来实现。 反对一下两个参数 --optimize (-o)--no-dev

January 5, 2021 · 1 min · jiezi

关于php:PHP设计模式之模板方法模式

模板办法模式,也是咱们常常会在不经意间有会用到的模式之一。这个模式是对继承的最好诠释。当子类中有反复的动作时,将他们提取进去,放在父类中进行对立的解决,这就是模板办法模式的最简略艰深的解释。就像咱们平时做我的项目,每次的我的项目流程实都差不多,都有调研、开发、测试、部署上线等流程。而具体到每个我的项目中,这些流程的实现又不会完全相同。这个流程,就像是模板办法,让咱们每次都依照这个流程进行开发。 Gof类图及解释GoF定义:定义一个操作中的算法的骨架,而将一些步骤提早到子类中。TemplateMethod使得子类能够不扭转一个算法的构造即可重定义该算法的某些特定步骤。 GoF类图 代码实现abstract class AbstractClass{ public function TemplateMethod() { $this->PrimitiveOperation1(); $this->PrimitiveOperation2(); } abstract public function PrimitiveOperation1(); abstract public function PrimitiveOperation2();}定义一个抽象类,有一个模板办法TemplateMethod(),这个办法中咱们对算法操作方法进行调用。而这些算法形象办法是在子类中去实现的。 class ConcreteClassA extends AbstractClass{ public function PrimitiveOperation1() { echo '具体类A实现办法1', PHP_EOL; } public function PrimitiveOperation2() { echo '具体类A实现办法2', PHP_EOL; }}class ConcreteClassB extends AbstractClass{ public function PrimitiveOperation1() { echo '具体类B实现办法1', PHP_EOL; } public function PrimitiveOperation2() { echo '具体类B实现办法2', PHP_EOL; }}具体的实现类,它们只须要去实现父类所定义的算法就能够了。 $c = new ConcreteClassA();$c->TemplateMethod();$c = new ConcreteClassB();$c->TemplateMethod();在客户端的调用中,实例化子类,但调用的是子类所继承的父类的模板办法。就能够实现对立的算法调用了。 ...

January 5, 2021 · 1 min · jiezi

关于php:PHP内核剖析笔记14

1.php源码下的几个次要目录: SAPI、main、Zend、ext.SAPI是PHP的利用接口层.main是PHP的次要代码,次要是输出/输入、Web通信、PHP的初始化操作(比方fastcgi协定的解析、扩大的加载、PHP配置的解析等)等,它位于ZendVM的上一层.Zend是PHP解析器的次要实现,即ZendVM,它是PHP语言的外围实现,PHP代码的解释、执行就是由Zend实现的.ext是PHP的扩大目录.TSRM是线程平安相干的实现.2.PHP的根本形成: 1)SAPI 罕用的两个SAPI是Fpm和Cli.SAPI层是整个PHP框架的最外层,不同的SAPI适配不同的环境(比方命令行、web等),次要负责框架的初始化工作.如果SAPI是一个独立的应用程序(比方cli或fpm),那么main函数也定义在SAPI中.2)ZendVM ZendVM是一个虚构计算机,它介于PHP利用与理论计算机之间,咱们编写的PHP代码就是被它解释执行的.它次要由两局部组成:编译器、执行器. 编译器负责将PHP代码解释为执行器可辨认的指令. 执行器负责执行编译器解释进去的指令.ZendVM等价于Java中的JVM,他们都是形象进去的虚构计算机.3)Extension 扩大是PHP内核提供的一套用于补充PHP性能的形式.扩大分为PHP扩大和Zend扩大. PHP扩大比拟常见. Zend扩大次要利用于ZendVM,Opcache就是Zend扩大.

January 4, 2021 · 1 min · jiezi

关于php:PHP设计模式之门面模式

门面模式,也叫外观模式。不论是门面还是外观,都是咱们对外的媒介,就如同咱们的脸面一样。所以,这个模式最大的特点就是要体现的“难看”。怎么说呢?一堆简单的对象调用,本人都看蒙了,特地是对老零碎进行降级保护的时候。用门面来把老零碎的性能调用封装起来,在里面看来就和新零碎一样,这就是门面模式的用处啦! Gof类图及解释GoF定义:为子系统中的一组接口提供一个统一的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易应用。 GoF类图 代码实现class SubSystemOne{ public function MethodOne() { echo '子系统办法一', PHP_EOL; }}class SubSystemTwo{ public function MethodTwo() { echo '子系统办法二', PHP_EOL; }}class SubSystemThree{ public function MethodThree() { echo '子系统办法三', PHP_EOL; }}class SubSystemFour{ public function MethodFour() { echo '子系统办法四', PHP_EOL; }}定义四个或者N多个子系统,这个没什么好说的吧,能够设想是很多子系统,而且他们之间并不一定和这四个子系统一样的类似,有可能是千差万别的。 class Facade{ private $subStytemOne; private $subStytemTwo; private $subStytemThree; private $subStytemFour; public function __construct() { $this->subSystemOne = new SubSystemOne(); $this->subSystemTwo = new SubSystemTwo(); $this->subSystemThree = new SubSystemThree(); $this->subSystemFour = new SubSystemFour(); } public function MethodA() { $this->subSystemOne->MethodOne(); $this->subSystemTwo->MethodTwo(); } public function MethodB() { $this->subSystemOne->MethodOne(); $this->subSystemTwo->MethodTwo(); $this->subSystemThree->MethodThree(); $this->subSystemFour->MethodFour(); }}通过门面类将这些子系统包装起来,对外提供的只是门面新定义的办法。 ...

January 4, 2021 · 1 min · jiezi

关于php:酷瓜云课堂腾讯云版v123-发布

鼠去牛来,2021年持续致力,酷瓜云课堂 v1.2.3 版本公布。 减少多人应用同一帐号防备机制首页缓存刷新工具课程综合评分课程举荐修复phinx-migration-generator 无符号问题online表并发写入重复记录问题打算工作生成sitemap.xml失败我的项目介绍酷瓜云课堂,依靠腾讯云根底服务架构,采纳C扩大框架Phalcon开发,GPL-2.0开源协定,致力开源网课零碎,开源网校零碎,开源在线教育零碎。 零碎性能实现了点播、直播、专栏、会员、微聊等 托管仓库gitee仓库github仓库在线体验情谊提醒: 系统配置低(1核 1G 1M 跑多个容器),切莫压测课程数据来源于网络(无本质内容),切莫购买治理后盾已禁止数据提交,私密配置已过滤演示帐号:13507083515 / 123456 (前后台通用) 桌面端演示: 前台演示后盾演示挪动端演示领取流程演示: MySQL晋升课程全面解说MySQL架构设计(0.01元)Nginx入门到实际Nginx中间件(0.01元)数据库与中间件的根底必修课(0.02元)Tips: 测试领取流程请用手机号注册一个新账户,这样能力接管到订单告诉,以及防止课程无奈购买 我的项目组件后盾框架:phalcon 3.4.5前端框架:layui 2.5.6, layim 3.9.5(已受权)全文检索:xunsearch 1.4.9即时通讯:workerman 3.5.22根底依赖:php7.3, mysql5.7, redis5.0装置指南运行环境搭建零碎服务配置开发计划桌面端:进行中挪动端:进行中小程序:待启动意见反馈在线反馈(举荐)通过这个我的项目能学到什么?我的项目布局,phalcon,缓存,JWT,即时通讯,全文检索docker,supervisor,devopsgit,linux,php,mysql,redis,nginx代码有加密吗?所有代码都公开(受权代码除外,例如layim),没有所谓的商业版和付费插件。 助力开源毫无保留的真开源不容易,如果对你有帮忙,请给咱们 STAR !!!

January 3, 2021 · 1 min · jiezi

关于php:你心中最高大上最牛逼的技术到底是什么大声告诉我

借用一句话,东南玄天一片云,乌鸦落进凤凰群满网都是英雄汉,谁是君来谁是臣 上面就是要通知你所谓的牛逼技术到底是什么回事!!! 咱们测试一下数据库,java,python,go,c/c++,php,redis,docker进行测试【测完你会发现点货色】而后你再看图比拟好,省得大家天天为了这个框架,那个框架,这个语言,哪个语言在b乎,快手,抖音,b站吵的跟少妇一样[只是吐槽一下]^_^ 先测试数据库接收数据时是不是用了Linux网络 socket API好启动了,没有什么可说的,ELF文件启动。 .ibd是创立数据表时生成的文件,没啥可说的,DBA业余都晓得 我画线的中央调用了ACCEPT SOCKET API函数调用了SENDTO,RECVFROM SOCKET API 函数 mysql怎么实现咱们管不着,然而数据来回的传输依赖于LINUX SOCKET API,这些都是网络接口API 调用了零碎其它API函数库,咱们看一下accept,sendto,recvfrom,setsockopt,getsockopt read,write,epoll相干函数 redis 数据库 启动redis测试**epoll_wait 失去就绪的文件描述符读事件返回,而后调用read,其实跟RECVFROM性能一样它的数据是:3\r\n$3\r\nset\r\n4\r\nbfzs\r\n5\r\n10000\r\n 这一堆数据被各种大佬称为 redis的二进制通信申请协定!!!返回是+OK\r\n** 它们的数据来回传输大部分用read,write函数来实现 docker dockerd服务ELF文件调用的linux api相干函数库 启动docker服务,跟mysql一样默认启动一堆过程和线程相干命令运行【对不起,我不喜爱背货色,你要是面试我时,问我docker有哪些命令选项,对不起我回家种地放牛了】 来用下测试运行过程都在调用connect,socket,getpeerame,setsockopt,getsockopt,accept,sendto等LINUX SOCKET API函数 docker调用的LINUX API 函数库 go语言写个网络程序我间接复制粘粘给你运行对不起我背不了函数,要用就间接复制粘粘就好了 go ELF 文件 来运行那个大家认为的源码文件 先运行哪个函数,你本人看着办哦 重点相熟的一批,socket 创立socket文件描述符,而后命名【把ip,端口绑定到此文件上】,而后监听,并阻塞在accept函数上 好了,go就这样子,它封装的比拟骚,go elf编译器封装的牛逼,语法换了一套就称为编译型语言了。 python语言也写个网络程序测试下py的语法就是好,轻易一撸就能够了,几乎是粗犷又骚,语法嘛就这样,长得跟少妇一样 来先认识一下python elf文件 毕竟好多爬虫大佬可能没有见过.php .py .go .java里的货色只是个文本内容,你们嘛叫源码,我没有文化,只能叫ascii text ^_^ 启动测试有没有发现,相熟的一批好了,到这里够意思了。 这么简略的语言,你去学语法就行了,简略又粗犷谁不喜爱呢。我都喜爱。 ^_^ java 语言网络程序测试看一下java elf文件,我置信java大佬必定晓得我就不费话了编译一下我没有学过java,然而看一下报错就晓得了,对不对,这么显著的提醒,我phper都知道 ^_^ 编译ok编译好是啥文件启动java程序开始测试有没有发现,相熟的一批好了,就这么多就行了,没有必要再截图了。 ...

January 3, 2021 · 2 min · jiezi

关于php:依据查找在php-中读excel的查找新文档过程总结获取需要的步骤

参照PHPEXCEL总结查找所需内容步骤总结:一、明确目标:实现php excel文件的读写操作二、关键字查问,首先是以php excel为关键字在谷歌进行查问通过查问首先呈现的是下图: 三、判断查找内容是否能够满足本身需要1.点开后首先看README:上面介绍说以后版本曾经是被归档的版本了,须要跳转到新的版本PhpSpreadsheet中 2.跳转到PhpSpreadsheet中,仍旧是首先读README,因为这是用前必看的:这其中有四局部,其中重要的是第二局部:官网文档,第三局部是比照php excel和PhpSpreadsheet,而后解释为啥不必php excel 3.关上官网文档后,首先引入眼帘的是以后版本反对的文件格式和对应的读写性能,其中包含了excel的读写,OK,满足咱们的需要: 4.再往下看:Getting started(让咱们开始吧),首先看到的是软件要求:道歉!没有满足人家的要求 5.新版的不行,那就试试旧版:回到php excel 与方才步骤一样,首先看官网文档:因为已被归档,官网文档并未间接在README中给出,这时须要本人去找官网文档:发现Documentation与官网文档很类似,只是少了offical 官网的,那么就算有官网文档,也肯定在他之中: 6.浏览官网文档,查看是否满足本身要求和本身是否满足对方要求: 四、满足要求后开始装置插件等和寻找须要的办法:读出excel内容1.插件和环境等装置:在读官网文档时会发现,它的装置要求居然是将classes这个文件夹装置到任意地位,此时我还不晓得Classes文件夹中是什么,然而依据名字也能够猜到是一堆类文件,那么它装置到任意地位也就能够了解了 2.用给出的样例进行测试,查看是否可能满足我的要求:将整个文件夹其下载到我的thinkphp5环境下进行运行 3.此时我已明确它可能实现读的操作,接下来:通过样例代码找出想要的内容,因为你可能用到的并不是Classes中的所有办法,而只是简略的一个办法,所以没有必要去通篇看其中的办法,反而在样例中具备目的性的找寻更快捷五、总结:1.先弄清需要2.按需要剖析出关键字,通过关键字搜查3.搜出后:先看用前须知内容,看是否满足本身需要和对方要求4.确认都满足后,用麻利开发的思维:先一成不变的跑给出的测试样例;再批改测试样例的格局内容等进行测试,最初是尝试将其放到本人想要的地位进行测试。切不可间接跳步操作等5.通过样例找出想要的办法,在样例中个别都会有输入正文,遇到生的英文单词间接查,你会很容易发现自己想要的在哪本文保留所有权力,版权归河北工业大学梦云智软件开发团队所有。未经团队及作者当时书面批准,您不得以任何形式将本文内容进行商业性应用或通过信息网络流传本文内容。本文作者:郝泽龙

January 2, 2021 · 1 min · jiezi

关于php:2021-PHP程序员修炼秘籍

前言嗨喽,大家好,我是CrazyCodes,祝思否的小伙伴新年快乐,按照常规,在2021年的第一天,为大家献上2021年PHP程序员修炼秘籍 2020回顾2020年,新冠病毒肆虐寰球,不易的一年,就这样一晃而过,还记得2020年的春节,全国洋溢着春节的气味,当疫情暴发的那一刻,举国上下群策群力,抵挡疫情,致敬奋战在一线的白衣天使、抗疫工作者! 语言在编程语言社区 TIOBE 公布的 12 月份的编程语言排行榜。依据表中显示,12 月 C 语言排名第一,Java 降至第二位,Python 排列第三,与去年同期雷同。C++、C# 别离位列第四、第五咱们PHP开发语言在第八位,我说这些想表白什么呢?是想要通知宽广的PHP开发工程师,不要被社会焦虑所管制,这一年来在知乎、简书、CSDN等等各渠道看到的很多文章,题目大略是这样的《PHP还能活多久》《PHP为什么会成为冷门》等等一系列的形容,前两年文章中我会列出一些数据来阐明PHP还在一直倒退或者阐明PHP的市场占有率,这次不在做相干的论述,以下说几点 语言只是工具,当你做一个WEB利用你会抉择PHP或JAVA,如果你须要解决大量数据,我会举荐你应用Python存在即正当,每门语言都有它的历史倒退,为推动社会所作出的卓越贡献。不同语言所波及的畛域不同,如果你边用PHP搬砖,边看着人家开发桌面利用,恐怕你只有看着的份。依据不同需要抉择不同语言,不用再纠结哪个会活哪个会死社区的一直发展壮大是开发语言倒退的助推器如果你真的喜爱PHP这门开发语言,那就去PHP相干社区多做奉献,以体现你真的酷爱它。 根底我是一名北邮计算机专业的自考生,在自考的过程中,深有体会计算机根底对一名程序员的重要性,我见过很多程序员吐槽很多公司面试要出一些算法题,数据结构题,要是面大厂,就说大厂刻薄,面中厂小厂,就说人家学大厂。其实我以前也是这么想的,但自从开启了基础知识学习的那一刻,我开始藐视本人以往的想法。 能够这么说吧,如果你没有看过C,没有学习过数据结构,操作系统,你不会写出好的代码,更别提成为一个牛X的程序员。这个为什么不能,一言两语说不清楚,如果你感觉我在吹牛皮,无妨去学习下,并且带着你的认知来反驳我。 奉上我的自考科目,自考科目与统招学习的科目不同,难度会升高不少,你能够先从这里开始 《数据结构导论》《操作系统概论》《软件开发工具》《数据库系统原理》《C++程序设计》《计算机网络原理》《高级语言程序设计(一)》无论你是做什么语言开发,在什么行业,C语言是你必须精通的一门语言,可能你会说“什么?要精通?”,在你跟我抬杠前,先至多相熟了在来。 这这里我再分享下,往年我在极客工夫购买的课程 (排名不分先后) 陈旸老师的 《SQL必知必会》刘超老师的 《趣谈网络协议》张磊老师的 《深刻分析Kubernetes》陶辉老师的 《Nginx外围常识100讲》丁奇老师的 《MySQL实战45讲》陈皓老师的 《左耳听风》如果你对我的路线感兴趣,非要让我举荐一个课先来学习的话,我举荐你购买陈皓老师的《左耳听风》,如果非让我给一个理由,那么我的理由是“先静心” 框架 2020年Laravel框架热度不减,生态圈也在一直壮大,我也是Laravel框架的重度使用者。但往年我不会强烈推荐你去学习它。 这要看你所处的环境与你须要做的利用,如果你身处一家小公司,其要求是疾速迭代,那么Laravel框架会是你的首选,当然如果不是一家守业公司,其曾经有了稳固的用户及一定量级的数据,那你也没得选,公司用什么你用什么。 不同场景,不同量级,抉择不同的框架,这是一名理智的程序员能够做出的抉择。 我强烈推荐你去学习应用 Swoole 与 Hyperf , 就算你不晓得协程是个啥。 框架是语言更下层的货色,这里就不做过多论述了。 如果你是一名新人,在钻研到底抉择怎么的一个框架去开启你的程序之路,那么我的倡议是轻易选一个就好。 PHP 8PHP8带咱们进入了一个全新的世界,是PHP历史倒退过程中重要的里程碑。 你在理论工作中可能无奈应用它,但我强烈强烈强烈建议你在本地装置并尝试应用它。 PHP官网对于PHP8的介绍,PHP官网还素来没有因为新版本独自拿出一个页面展现,可见官网对齐的器重 https://www.php.net/releases/...我之前有写过一篇相干文章,放到了下方。 https://segmentfault.com/a/11...社区技术社区与技术探讨群在这里我一并讲下,学习的形式分两种,一种是被动学习,一种的被动学习,被动学习不多说,就是你被动去学习理解一些事物,被动学习这里指的是浏览技术社区和技术探讨群,放弃继续学习的激情是必须的,但也要容许本人腐化一会,大脑长时间放弃高速运转,人是受不了的。当你腐化的时候,不晓得学点什么的时候,无妨溜溜技术社区,找些感兴趣的文章读一读,就当是课外读物了。 技术的深度和广度是同时存在的,深度代表你对某个畛域的业余水平,广度则是对整个行业的宏观了解与意识。做一个有深度,有广度,有态度的程序员吧。 技术社区我常常逛这些,不要贪多,有几个就行 SegmentfaultCsdn掘金对于技术探讨群,找一些话题探讨有深度的退出,这里的深度并不仅仅指的技术层。 如果在你的群列表内,经常出现有人问这段代码为什么报错,这个根底货色该怎么搞,或者天天有人让你砍一刀,倡议你趁早退出,俗话说得好,物以类聚人以群分。 English英语,家喻户晓,是一门沟通语言,在计算机倒退长河里,英语占有重要位置,看不懂英文,在技术这个行业里,就像你在中国不识字是一样的。 当然学习英语是一个放弃继续激情的事件,如果你保持不下来,但在日常开发中还躲不掉,这里我教你一个退而求其次的招数,你是不是常常关上github或者某个英文网站,英文文档,右键翻译该网站?我倡议你在翻译前,先把要翻译的这段英文copy进去,比照着翻译后的后果,你能够大体晓得哪个英文对应的中文是什么,长此以往,你看得懂的英文就会一直减少。 当然,这是一个最最差劲的方法,如果你还是想零碎的学习,我这里还有个狠招,“生产你的人民币”,人都是有惰性的,这是人的本能,如果不必下班就能够有无穷无尽的财产,我想下班的人不会太多,报一个英语学习班,我指的是现场授课的那种。并不是某个英语学习APP,花个99元就想通读各大英文书籍文章。 当你花了钱,并且坐在教室里,会有一种莫名的驱动力驱动你这样去做。无妨试试? 守业 当你工作很多年后,必定会多多少少有一些守业的想法,作为一名失败者,我劝你三思而后行,但也激励你激进做事。 拉卡拉董事长孙陶然学生对于创业者有这样一句忠告 “守业就是,做一个有人用的产品,并且把这个产品卖出去” 这是作为一名创业者首先要做的事件,而非所谓为了幻想。这也是一个很事实的事件,不是每个人都能做到像滴滴、抖音这些明星企业一样。 守业胜利自身就是一件小概率事件,当你迈上这条路,首先你的技术就不是你的外围竞争力了。 每每写到守业,我都想多形容些,但碍于我也是一名失败者,作为一名失败者去教你如何守业,恐怕你失败的概率比我还高,就跟那些天天演讲胜利学的“专家”,如果他胜利了,恐怕不会去演讲这个货色。一个失败人去讲胜利学,会把胜利学讲的更失败。 如果你心愿理解我的守业故事,能够私信我。 我很乐意把我的经验形容跟你听。 最初致敬所有的创业者,这个时代的逆行者。 致谢如果你没细看我下面啰嗦的那些,那你能够看看这里的总结 ...

January 1, 2021 · 1 min · jiezi

关于php:你所鄙视的语言居然

如果你是用脚本语言,对于这图,你也晓得脚本语言的语法容易简略,入门快,毕竟欧美大佬给咱们封装好了,加上当初各框架,各库高度封装,咱们如同只须要复制粘贴就能够实现公司的crud 业务了,剩下的工夫呢。 摸鱼? 当你在用脚本或是编译型语言在撸相干业务的时候,它在运行时linux会首先运行ELF文件找到程序的入口地址,再加载到内存中运行,而咱们所写的.php .go .java 等它会php go java ELF文件所解决。 当你用上php的那套语法写业务时,他们都会认为这种简略的语言不高大上。。。不过再怎么吐槽 大家运行都是在Linux零碎上,调用的零碎API齐全一样,作为一名想达到资深程度的码农不应该局限在各种写法的语言上,应该养眼于零碎API它达能实现的性能被各种十分闲的老外封装创造了各种骚写法的语言,甚至google没事干本人弄了go编译器,而后弄出了各种写法。然而大家会发现都要运行在Linux上,开始运行时都要调用libc.so库,都要调用execve来调用各位写的程序,前面的各种API,多过程,多线程,网络 socket API 都是一样,只不过有些小伙伴只在乎老外封装的写法,认为跟其它语言齐全不一样。 那么我置信当你程度达到肯定水准,你用这个语言实现的货色,换另一套语言我置信你也能把思维和办法搬过来,毕竟都是在调用Linux API! 如果你的想法也和我一样,你有趣味能够关注一下我的货色。 货色:https://edu.51cto.com/sd/75a3d

December 31, 2020 · 1 min · jiezi

关于php:PHP设计模式之桥接模式

桥接模式,在程序世界中,其实就是组合/聚合的代名词。为什么这么说呢?相熟面向对象的咱们都晓得继承的益处,子类能够共享父类的很多属性、性能。然而,继承也会带来一个问题,那就是重大的耦合性。父类的批改多少都会对子类产生影响,甚至一个办法或属性的批改都有可能让所有子类都去批改一遍。这样就违反了凋谢封装准则。而桥接就是为了解决这个问题,它强调的是用组合/聚合的形式来共享一些能用的办法。置信大家肯定想到了php中的trait,如果你在工作中应用过这个个性,那么你就曾经用过桥接模式了! Gof类图及解释GoF定义:将形象局部与它的实现局部拆散,使它们都能够独立地变动。 GoF类图 代码实现interface Implementor{ public function OperationImp();}class ConcreteImplementorA implements Implementor{ public function OperationImp() { echo '具体实现A', PHP_EOL; }}class ConcreteImplementorB implements Implementor{ public function OperationImp() { echo '具体实现B', PHP_EOL; }}咱们先来定义实现接口以及它们具体的实现,也就是真正要执行的性能。就像是适配器模式中的Adaptee。 abstract class Abstraction{ protected $imp; public function SetImplementor(Implementor $imp) { $this->imp = $imp; } abstract public function Operation();}class RefinedAbstraction extends Abstraction{ public function Operation() { $this->imp->OperationImp(); }}定义抽象类的接口,并保护一个对实现的援用。具体的抽象类的实现办法中,咱们间接调用实现接口的实在操作方法。相似于适配器中的Adapter。 $impA = new ConcreteImplementorA();$impB = new ConcreteImplementorB();$ra = new RefinedAbstraction();$ra->SetImplementor($impA);$ra->Operation();$ra->SetImplementor($impB);$ra->Operation();客户端调用,咱们的抽象类应用不必的实现类就能够让操作方法变成多态的感觉。 ...

December 31, 2020 · 1 min · jiezi

关于php:如何使用WooCommerce简码

WooCommerce简码(shortcode)能够让咱们将产品、购物车等内容退出到页面或者文章中。咱们在外贸建站时,能够间接通过Elementor Pro的Product元素块来配置产品的展现,但如果元素块或是主题无奈提供所需的产品配置呢?那学习WooCommerce简码能让你自定义所需的产品展现,譬如在网站首页,以tab标签的模式展现不同类目标产品。 此外,如果你应用WordPress默认的古腾堡编辑器来编辑页面或者文章,如下图所示,点击左上角的加号按钮,在面板中你能够找到WooCommerce区块,单击区块即可退出到页面中。 它们与本文行将介绍的简码的作用是一样的,简码是一小段代码,须要你本人撰写代码规定,相比之下,这种区块更易用。 尽管咱们在制作网站页面时,不大会应用古腾堡编辑器,譬如我罕用Elementor编辑器进行外贸建站,即便如此,你仍旧能够在给外贸网站写博客文章时,通过这种形式插入相干的产品信息。 此外,学习了WooCommerce简码,当你再应用Elementor制作页面时,可能领会到更多的便当和灵活性,下文会有一些示例。 如何应用WooCommerce简码以[woocommerce_cart]为例,它示意购物车页面。当你向页面中增加这个短代码时,那这个页面将蕴含购物车内容。 在后盾给页面增加了购物车简码 这是该页面的预览成果 如何批改WooCommerce我的账户、结算、购物车页面的设计款式你也能够应用Elementor编辑这个页面,给他减少一些设计款式,下图便是我用Elementor加了款式后的成果(譬如我给内容加了边框和投影,给题目增加了背景色和底部形态分隔线)。 如果你在尝试用Elementor编辑这些页面时提醒无奈编辑,请先返回WooCommerce的设置中勾销关联再编辑,编辑实现后再建设关联。 举荐相干教程: Elementor的Advanced高级设置教程(18个性能点) 好,接下来咱们开始介绍各种WooCommerce简码及其用处、示例。 页面简码在装置WooCommerce时,如果依照WooCommerce装置向导操作,会主动生成4个页面:我的账户、购物车、结算、商店。如果你想自行制作这些页面,只须要增加页面并退出这些简码即可。 其中购物车、结算、我的账户的简码如下。 [woocommerce_cart] – 购物车页面[woocommerce_checkout] – 结算页面[woocommerce_my_account] – 我的账户页面[woocommerce_order_tracking] – 订单跟踪页面,这个页面未主动生成,你也能够自行添加。当你编辑这些页面时,你将看到下图,实际上就是将简码退出了对应页面中。 购物车页面简码:[woocommerce_cart] 结算页面简码:[woocommerce_checkout] 我的账户页面简码:[woocommerce_my_account] 订单跟踪页面简码:[woocommerce_order_tracking] 产品简码你能够应用产品简码在页面、文章、产品详情中插入产品。产品简码是products,你须要在简码中退出各种属性组合,以便实现你想要展现的产品信息,咱们持续往下看。 咱们先看一个示例,譬如:展现6个卖的最好的促销产品,每行3个产品,它的简码如下。留神:上面的图例中的展现成果与主题强相干,主题不同看到的“皮肤”不同哦。 [products limit="6" columns="3" orderby="popularity"  on_sale="true"]limit=”6″:示意展现6个columns=”3″:示意一行展现3个orderby=”popularity”:示意筛选卖的最好的商品on_sale=”true”:示意筛选进去的产品是有促销价格的 用简码存在的一个问题是,产品展现的外观取决于你用的主题,无奈在Elementor中对简码进行款式上的粗疏批改,但能做一些整体的设置,譬如内外间距、背景、边框等等。 如果你想对细节进行款式批改,那么倡议你不要用简码,而是购买一个Elementor Pro,应用它的Product元素来自定义款式。 接下来咱们介绍一下可供使用的产品属性 产品属性以下属性可与Products简码一起应用。 展现类产品属性limit – 须要展现的产品数量,譬如,limit=”6″,默认是limit=”-1″,示意显示全副产品,默认的意思是:如果你想展现全副产品,limit=”-1″可省略不写,下方同理。columns – 每行的列数,默认为4,示意一行展现4个产品。paginate – 启用翻页性能,要与limit一起应用,默认值为false,设置为true能够启用分页性能,譬如:paginate=”true”。下图的简码是:[products limit=”4″ columns=”4″ paginate=”true”],示意每页展现4个产品,每行展现4个产品,显示产品翻页性能。 orderby – 依据你设置的内容选项来定义排序, 如果你想退出多个选项,多个选项之间以空格距离,可用的选项包含如下:rand – 在页面加载时随机出现产品(可能不适用于应用缓存的站点,因为它可能会保留特定的程序)。rating – 产品的评分title – 产品题目,这是默认的orderby模式。date – 产品的公布日期id – 产品IDmenu_order – 菜单排序,编辑产品时,在产品数据》高级中能够设置菜单排序,请填写数值,数值越大越优先展现。popularity – 产品的销量order – 为orderby中设置的选项定义排序形式,含:升序(ASC)和降序(DESC),默认为ASC。skus – 以英文逗号分隔多个产品的SKU,每个产品的sku是惟一的。编辑产品时,在产品数据》库存中能够设置产品的SKU。category – 以英文逗号分隔多个产品分类的slug。tag – 以英文逗号分隔多个产品标签,你能够在编辑产品时增加标签,也能够在产品列表中,疾速批改产品并增加多个标签。class – 增加一个CSS Class,以便你能够应用自定义CSS批改产品的款式(难度颇高,无CSS常识储备的忽视它)。on_sale – 展现促销商品,不能与下文的best\_selling或top\_rated一起应用。best_selling – 展现销量最好的商品,不能与on_sale或top_rated 一起应用。top_rated – 展现评估最好的商品,不能与on\_sale或best\_selling一起应用。内容类产品属性attribute – 产品属性,由你本人定义产品属性,譬如鞋子色彩、尺码,你能够指定产品的属性slug来选取要展现的产品。terms – 产品属性值,通过指定产品属性值来选取要展现的产品,譬如红色、黄色鞋子,多个属性值之间要用英文逗号分隔terms_operator – 产品属性值之间的运算关系,包含:AND – 示意“和”关系,将显示蕴含全副所选属性值的产品。IN – 示意“蕴含”关系,将显示蕴含任一所选属性值的产品,这也是TERMS_OPERATOR的默认值。NOT IN – 示意“不蕴含”关系,将显示不蕴含任一所选属性值的产品。tag_operator – 产品标签之间的运算关系,包含:AND – 示意“和”关系,将显示所有选定标签中的产品。IN – 示意“蕴含”关系,将显示蕴含任一所选标签的产品。这是TAG_OPERATOR的默认值。NOT IN – 示意“不蕴含”关系,将显示不蕴含任一所选标签的产品。示例: ...

December 30, 2020 · 1 min · jiezi

关于php:java13面向对象深入3

java13面向对象深刻3纲要这里没有写 面向对象-封装性了解封装( encapsulation)怎么去了解,一台电脑利用一个外壳包裹,爱护了外面的电器元件,提供了大量的按键与其对接应用。我要看电视,只须要按一下开关和换台就能够了。有必要理解电视机外部的构造吗?有必要碰碰显像管吗?制造厂家为了不便咱们应用电视,把简单的外部细节全副封装起来,只给咱们裸露简略的接口,比方:电源开关。具体怎么外部实现的,咱们不须要操心。 须要让用户晓得的裸露进去,不须要让用户理解的全副暗藏起来。这就是封装,文言: “ 该露的露,该藏的藏”。 概念 咱们程序设计要谋求“ 高内聚,低耦合”。高内聚就是类的外部数据操作细节本人实现,不容许内部干预;低耦合:仅裸露大量的办法给内部应用。利用抽象数据类型将数据和基于数据的操作封装在一起,使其形成一个不可分割的独立实体,数据被爱护在抽象数据类型的外部,尽可能地暗藏外部的细节,只保留一些对外接口使之与内部产生分割。零碎的其余局部只有通过包裹在数据里面的被受权的操作来与这个抽象数据类型交换与交互。也就是说,用户无需晓得对象外部办法的实现细节,但能够依据对象提供的内部接口(对象名和参数)拜访该对象。 作用a)、实现了业余的分工。将能实现某一特定性能的代码封装成一个独立的实体后,各程序员能够在须要的时候调用,从而实现了业余的分工,即工作中的分模块、分性能开发。b)、暗藏信息,实现细节。通过管制拜访权限能够将能够将不想让客户端程序员看到的信息暗藏起来,如某客户的银行的明码须要窃密,只能对该客户开发权限。 javabean规定在编写 javabean 中的有一些罕用的规定如:1)、属性尽可能私有化 private2)、拜访器: setter 与 getter 拜访器 >private ,个别 public 居多 setterXxx: 存储> 与 getterXxx: 查看 代码public class Person { //姓名 private String name; //年龄 private int age; //性别 private boolean sex; public Person() { } //setter与getter public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public boolean isSex() { return sex; } public void setSex(boolean sex) { this.sex = sex; } } 经典MVC思维概述MVC是一种分层思维,一种设计模式。 ...

December 30, 2020 · 1 min · jiezi

关于php:PHP设计模式之备忘录模式

备忘录,这个名字其实就曾经很形象的解释了它的作用。典型的例子就是咱们原来玩硬盘游戏时的存档性能。当你对行将面对的大BOSS有所顾虑时,个别都会先保留一次进度存档。如果挑战失败了,间接读取存档就能够复原到挑战BOSS前的状态,而后你就开开心心的再去练一会级回来解决这个大BOSS就好了。不过,为了以防万一,在挑战BOSS之前存个档总是好的。另外一个例子就是咱们码农们天天要用到的代码管理工具Git或者Svn了。每次的提交都像是一次存档备份,当新代码呈现问题的时候,间接回滚复原就行了。这些,都是备忘录模式的典型利用,上面就一起来看看这个模式吧。 Gof类图及解释GoF定义:在不毁坏封装性的前提下,捕捉一个对象的外部状态,并在该对象之外保留这个状态。这样当前就可将该对象复原到原先保留的状态 GoF类图 代码实现class Originator{ private $state; public function SetMeneto(Memento $m) { $this->state = $m->GetState(); } public function CreateMemento() { $m = new Memento(); $m->SetState($this->state); return $m; } public function SetState($state) { $this->state = $state; } public function ShowState() { echo $this->state, PHP_EOL; }}原发器,也能够叫做发起人。它有一个外部状态(state),这个状态能够在不同的状况下进行扭转。当某一个事件产生时,须要将这个状态复原到原先的状态。在这里,咱们有一个CreateMemento()用于创立一个备忘录(存档),有一个SetMeneto()用于还原状态(读档)。 class Memento{ private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; }}备忘录,非常简单,就是用于记录状态。将这个状态以对象的模式保留,就能够让原发器十分不便地创立很多存档用于记录各种不同的状态。 class Caretaker{ private $memento; public function SetMemento($memento) { $this->memento = $memento; } public function GetMemento() { return $this->memento; }}负责人,也叫做管理者类,保留备忘录,当须要的时候从这里取出备忘录。它只负责保留,不能批改备忘录。在简单的利用中,能够将这里做成列表,就像游戏中能够选择性的展示多条存档记录供玩家抉择。 ...

December 30, 2020 · 2 min · jiezi