分类 后台 下的文章

Php8在性能上有了一定的提升,接下来看一下对于7.x的版本迁移有那些需要注意的,新版本带来的新特性有哪些适用性。

新特性的介绍源于 php官方文档: Php8

named arguments

命名属性

推荐 好处不用多说了,语法能力提升,自然编程的自由度,便捷度也更好

这一项在面向对象语言中比较常见,类似于C++中的重载就允许实现类似的作用,但是C++的重载实现的能力更强一些,在swift中也是有类似的语法实现。 这个更新总体来说是预言特性上的补足,在7X版本中虽然IDE可以补充参数名显示,但是参数本身是有强制顺序的(如果写了最后一个参数,那么中间所有参数都必须补全),对于有写面向对象语言习惯的人来说这一点应该是比较实用,方便的。


function testArguments( $name, $age = 18, $gender = 1, $isStudent = false ){
}

// php7
// 如果中间两项都是默认,也必须提供参数(NULL)
testArguments( "jack", null, null, true );

// php8
// 可以直接跳过使用默认值的参数
testArguments( "jack", isStudent: true );

Attributes

属性?

也就是说以php官方提供的形式来进行文档注释

不推荐 phpDoc注释显然比官方提供的注释要臃肿,但可读性也更好,一味的简洁不太明智

Constructor property promotion

构造函数中定义属性?

从描述来看,其实是给了一个默认属性和构造函数简便的写法。

对比C++和swift来说,这个增强只能说聊胜于无,因为他并没有直接解决类属性的默认值问题。 而是把默认值的定义放在构造函数中,也就真的和官方说明一样,少写几个字而已。

Union types

联合类型

其实就是把本来由注释来声明的松散的类型问题在语言层面做了优化,其实放在php里面感觉有种多此一举,毕竟PHP里强类型到现在还是一个不彻底的革命,所以这个玩意儿和mixed类型放到一起,让人觉得这个语言有点自相矛盾了。

不推荐 偏好强类型的建议不要用了,真的有需求,自己写一个类吧。 偏好若类型的,恐怕你也用不上。

Match expression

match 表达式

ummm.... 由于match只支持单行表达式,所以match并不能取代switch 所以是一个严格匹配版加强版的字典匹配了。 不能说没用,也不能说很有用。

不推荐 这个真的不是把php字典类型改头换面出来凑数么? 哦,他加了一个严格检测。 所以是脱了裤子放屁?


// php官方示例

echo match (8.0) {
  '8.0' => "Oh no!",
  8.0 => "This is what I expected",
};
//> This is what I expected

echo ['8.0'=>"Oh no!","9.0"=>"what?"]["8.0"];
// > Oh no!

Nullsafe operator

空值操作符

这个我是在swift中第一次使用,十分的方便,并且在理解了 nullable 这个概念后在编程时也能感觉很多强类型语言中麻烦的问题有更便捷的解决方式。

不过放到PHP中由于所有值本身都是可以null的,所以nullable的的本质就不存在,这个更新主要为语法层面提供更简洁的实现。

推荐 代码少了,头发多了


// php7
$country =  null;

if ($session !== null) {
  $user = $session->user;

  if ($user !== null) {
    $address = $user->getAddress();

    if ($address !== null) {
      $country = $address->country;
    }
  }
}

// php8
$country = $session?->user?->getAddress()?->country;

总体而言,php8没有给我太大的惊喜,在我看来称之为 php7.5 也是没问题的。

使用phpDocumentor可以快速根据规范的注释生成一整套接口文档,是进行php开发十分便利的工具。 有时候我们会在自己的框架内引入别的库,这个时候一键生成文档会导致将库文件一起分析,不仅速度很慢同时也会导致生成的文档出现不必要的内容。

可以使用 -i,-ignore 设定屏蔽文件夹的参数 可以参考官方文档:

project:run

-i|–ignore[”...”]
Provide a comma-seeparated list of paths to skip when parsing.

在使用phpar命令进行生成的时候,需要注意使用 --igonre 或 -i

参考如下:

sudo php /Library/WebServer/Documents/phpDoc/phpDocumentor.phar  -d /Library/WebServer/Documents/appsite-new/server -t /Library/WebServer/Documents/docs/appsite-new/doc --ignore library/ custom/ demo.php

如果有多个目录,使用 and 进行分隔,单一文件使用完整文件名结尾,文件目录要以/结尾。

旧版本官方文档 using.command-line.ignore

-i, --ignore
Use the -i option to exclude files and directories from parsing. The -i option recognizes the * and ? wildcards, like -f does. In addition, it is possible to ignore a subdirectory of any directory using "dirname/".

phpdoc -i tests/ will ignore /path/to/here/tests/* and /path/tests/*

phpdoc -i *.inc will ignore all .inc files

phpdoc -i *path/to/* will ignore /path/path/to/my/* as well as /path/to/*

phpdoc -i *test* will ignore /path/tests/* and /path/here/my_test.php

Since v1.3.2, the value or pattern you provide will be case-sensitive (OS permitting, anyway), and will be applied relative to the top-level directory in the -d argument.

phpdoc -i CVS/ will ignore /path/to/CVS/* but will not ignore /path/to/cvs

phpdoc -d /home/myhome/cvs/myproject -i cvs/ will ignore /home/myhome/cvs/myproject/files/cvs/* but will not ignore /home/myhome/cvs/*

``最早的时候博客是使用的WordPress搭建,基于一些原因( 使用Typecho搭建一个极简又好用的技术博客 ),去年选择了用typecho重做。

重构博客之后的很长一段时间都没有去看搜索引擎的收录状态,最近发现在百度、搜狗都只有一个首页收录,但是bing是有大量收录的。而这在以前WordPress搭建时不可能出现的,所以开始着手解决一下。

参考: 浅谈typecho百度收录问题

- 阅读剩余部分 -

字符串替换

REPLACE ( fieldname, search, replace )

数据去重

DELETE ...

DELETE FROM table_copy 
WHERE key IN ( 
    SELECT t.key FROM (
    SELECT key FROM table_copy GROUP BY key having count(*) >1
    ) t
) 
AND id NOT IN(
    SELECT t.id FROM (
    SELECT id FROM table_copy GROUP BY key having count(*) >1
    ) t
)

在CentOS下可以通过shell脚本执行定时任务 在macos下 有类似的功能 使用crontab

crontab的格式:

f1 f2 f3 f4 f5 program
# 分(0-59) 时(0-23) 日(1-31) 月(1-12) 周(0-6) 程序

# 其中如果要执行 每x分钟 则使用 */x
# 如果使用* 表示任意次数

* * * * * curl https://test.com
# 表示每分钟都会使用curl打开 test.com

- 阅读剩余部分 -

网上对于挂载磁盘方式很多,有命令行的也有一键挂载的sh

这里做一个比较有条理的总结

  1. 查看当前磁盘情况

    fdisk -l
    # 这时会显示系统所支持的硬盘 每个硬盘有一个盘符 如 /dev/vda
  2. 挂载磁盘到对应目录( 相当于为磁盘访问创建一个快捷方式 )

     mount /dev/vda /mydisk
     # 挂载  盘符名称  快捷方式名称
    
     # 如果挂载错误 可以卸载
     umount /dev/vda/ /mydisk

如果过程中需要对盘符进行格式化

mke2fs ext4 /dev/vda
# 格式化  格式 盘符

在想清楚解决方案、做好全部备份、逐个相关文件关系查验之前,尽量不要做任何文件的写入、覆盖操作。

记一段辛酸但好歹不用跳天台的数据库恢复笔记

能写一个自动备份脚本,为什么要偷几十秒的懒呢?

主要也是参考下面链接最终成功恢复。 这篇文章的步骤稍微有点多。有些是恢复不必要的,这里做一下自己的整理。

如何在删除ibdata1的情况下恢复

数据库宕机恢复数据或迁移数据,几个重要节点。

1 检查数据库目录配置是否正确

数据库目录配置错误时,MySQL是不能正常启动的,报错可能与此无关。 比如说,找不到 user_table这样的报错,都可能是目录配置错误。

- 阅读剩余部分 -

最近正在做appsite框架传统网站架构的拓展、其中不免有SEO的部分。 在网上做了一点功课,meta中的 description比较关键,keywords据说已经不再受搜索引擎的关照了,不过这种事情现在不能盲目相信,既然做一个网站那么还是应该要照顾好关键词。但是没必要付出过高的人力成本,所以我这里想到的还是使用分词扩展来自动生成关键词。 这样做的好处是,无论搜索引擎是否在意关键词,我们有和内容相关度很高的关键词,这不会对我们带来损失。 基于程序算法生成的关键词,不需要我们花费人力成本,包括可以在后台控制是否开启该功能。

我这里选用的是对php支持比较好的 SCWS分词扩展。 如果分词的目的是更多的语义化分析、情感分析等,那还是应该考虑一下其他的分词库,不过基本上没有php支持。

进入正题

- 阅读剩余部分 -

因为最近的一个需求涉及到SEO 所以考虑用php写一套前台,这样可以根据url自动输出完整的页面,这里比较重要的是url rewrite 因为直接使用参数来访问页面一是不具备结构性,不方便基于文件夹管理php的前台页面,二是搜索引擎搜索方面也不友好。 所以要为后台添加一套自适应的rewrite。

以下是为一个SEO网站设计的结构

domain / home

  • /page | /class

  • /action

    • /id
  • ?querys

其URL示例为: https://domain/user/detail/12345/... https://domain/goods/list/... 经过重写转化为: https://domain/?abstract=user&functionality=detail&id=12345... https://domain/?abstract=goods&functionality=list...

今天和罗什孵化器的石总聊项目,我们提到了为了保证一些数据的真实性,需要引入区块链技术,这样我们可以避免像58同城这样的虚假信息漫布的问题。 我们聊了很多除了区块链以外的机制补充,还是很有成果的,但是对于区块链技术的实际实施,我考虑了一下,还是应该使用内部数据库来解决。

主要原因有:

1. 支撑能力有限。

搭建一个互联平台、提供的服务远远大于分布式记账的需要,我们也不是一个单纯的金融平台、我们有大量的数据并不敏感,而且是需要反复维护的,如果完全基于区块链来构建平台,是一种因噎废食的方式,既浪费空间,也会导致系统的容错率极低。

2. 不够灵活。

一个正式的互联网服务平台、需求是多种多样的,我们不能将所有信息全部都放到一个公开的信息链条上、最典型的就是用户的隐私数据,而且也没有这样的必要。如果完全基于区块链构建平台,那么就会导致我们本不需要额外做的隐私问题,需要再投入各种技巧来规避,而且是不能从根本上解决的。 用户隐私泄露、服务器风险增加等问题都不好处理。

为此,我设计了一种基于区块链的链式加密的内部区块系统、我称之为 Inner Block Chain 简称 I-BC

下面介绍一下,内区块链的可信度方案以及具体实现方式

- 阅读剩余部分 -